앱에 대한 이미지 빌드

Docker 이미지는 Red Hat® OpenShift® on IBM Cloud®를 사용하여 작성하는 모든 컨테이너의 기초가 됩니다.

이미지는 이미지를 빌드하는 지시사항이 포함된 파일인 Dockerfile에서 작성됩니다. Dockerfile은 앱, 해당 앱의 구성 및 그 종속 항목과 같이 개별적으로 저장되는 해당 지시사항의 빌드 아티팩트를 참조할 수 있습니다.

이미지 빌드

다음 IBM Cloud 서비스를 포함하여 여러 가지 방법으로 이미지를 빌드할 수 있습니다.

IBM Cloud Code Engine
Code Engine은 Dockerfile 및 클라우드 네이티브 빌드팩에서 이미지를 빌드하고 자동으로 이미지를 IBM Cloud® Container Registry에 푸시하도록 지원합니다. 자세한 정보는 빌드 계획을 참조하십시오.
Tekton 파이프라인
Continuous Delivery 서비스에는 이미지를 빌드하기 위해 파이프라인 내에서 참조할 수 있는 여러 Tekton 태스크가 포함되어 있습니다. 자세한 정보는 Tekton 파이프라인을 참조하십시오.

내부 레지스트리의 기존 이미지 스트림에서 컨테이너 배치

클러스터 관리자가 Red Hat OpenShift 클러스터의 내부 레지스트리에 설정해 둔 기존 이미지 스트림에서 앱을 배포할 수 있습니다. 예를 들어, 클러스터 관리자는 IBM Cloud Container Registry와 같은 외부 개인용 레지스트리에서 이미지를 가져오기 위해 이미지 스트림을 설정했을 수도 있습니다.

CLI에서 이미지 스트림 사용

  1. Red Hat OpenShift 클러스터에 액세스하십시오.

  2. 프로젝트에서 사용 가능한 이미지 스트림을 나열하십시오. 이미지 스트림의 프로젝트, 이름 및 태그를 아는 경우, 이미지 풀 스트림 인증 정보를 설정하지 않고 다른 프로젝트에서 로컬 이미지 스트림을 사용할 수 있습니다.

    oc get is -n <project>
    
  3. 이미지 스트림에서 앱을 작성하십시오.

    oc new-app --image-stream="<project>/<imagestream>:<tag>"
    

Red Hat OpenShift 웹 콘솔에서 이미지 스트림 사용

  1. Red Hat OpenShift 웹 콘솔에서 개발자 퍼스펙티브로 전환하여 +추가를 클릭하십시오.
  2. 추가 분할창 메뉴 표시줄에서 앱을 작성하기 위해 **가 아닌 **프로젝트default를 선택하고 컨테이너 이미지를 클릭하십시오.
  3. 이미지 섹션에서 내부 레지스트리의 이미지 이름을 선택하십시오.
  4. 이전에 작성한 이미지 스트림의 default 프로젝트, <image> 이미지 스트림<tag> 태그를 선택하십시오.
  5. 나머지 애플리케이션 세부사항을 검토하고 작성을 클릭하십시오.

IBM Cloud Container Registry 이미지에서 default Red Hat OpenShift 프로젝트로 컨테이너 배치

IBM Cloud Container Registry 네임스페이스에 저장된 개인용 이미지나 IBM 제공 공용 이미지에서 클러스터로 컨테이너를 배치할 수 있습니다. 클러스터가 레지스트리 이미지에 액세스하는 방법에 대한 자세한 정보는 IBM Cloud Container Registry에서 이미지를 가져올 수 있는 권한을 클러스터에 부여하는 방법 이해를 참조하십시오.

시작하기 전에:

  1. IBM Cloud Container Registry에 네임스페이스를 설정하고 이 네임스페이스에 이미지를 푸시하십시오.

  2. 클러스터를 작성하십시오.

  3. Red Hat OpenShift 클러스터에 액세스하십시오.

  4. <deployment>.yaml이라는 배치 구성 파일을 작성하십시오.

  5. IBM Cloud Container Registry의 프로젝트에서 사용할 배치 및 이미지를 정의하십시오.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <deployment>
    spec:
      replicas: <number_of_replicas>
      selector:
        matchLabels:
          app: <app_name>
      template:
        metadata:
          labels:
            app: <app_name>
        spec:
          containers:
          - name: <app_name>
            image: <region>.icr.io/<project>/<image>:<tag>
    
    <deployment>
    배치에 이름을 지정하십시오.
    <number_of_replicas>
    배치에서 작성하는 복제본 팟(Pod) 수를 입력하십시오.
    app: <app_name>
    앱 이름을 컨테이너의 레이블로 사용하십시오.
    name: <app_name>
    컨테이너에 이름을 지정하십시오(예: app 레이블 이름).
    image: <region>.icr.io/project>/image>:tag>
    이미지 URL 변수를 사용자의 이미지 정보로 바꾸십시오.
    region>: 레지스트리 도메인의 지역 IBM Cloud Container Registry API 엔드포인트입니다. 로그인한 지역의 도메인 목록을 나열하려면 ibmcloud cr api를 실행하십시오.
    namespace>: 레지스트리 네임스페이스입니다. 네임스페이스 정보를 가져오려면 ibmcloud cr namespace-list를 실행하십시오.
    image>:tag>: 컨테이너에 사용할 이미지 및 태그입니다. 레지스트리 네임스페이스에 사용 가능한 이미지를 나열하려면 ibmcloud cr images를 실행하십시오.
  6. 클러스터에 배치를 작성하십시오.

    oc apply -f <deployment>.yaml
    

암호화된 이미지에서 컨테이너 배치

이미지 키 동기화 프로그램 클러스터 추가 기능을 사용하여 암호화된 이미지의 컨테이너를 클러스터에 배치하십시오.

Red Hat OpenShift 4.5 또는 그 이후 버전을 실행하는 클러스터에서는, CRI-O 컨테이너 런타임이 암호화된 컨테이너 이미지 사용을 지원합니다. 암호화된 컨테이너 이미지는 암호화된 계층 컨텐츠가 포함된 OCI(Open Container Initiative) 이미지입니다. 이미지 가져오기 시크릿을 사용하여 레지스트리에서 이미지를 가져오는 개발자와 같은 개별 개발자의 이미지를 보호하는 대신 특정 클러스터에 대한 이미지 암호화를 사용으로 설정할 수 있습니다. 이 방식으로 이미지 복호화 키가 있는 특정 클러스터에서만 암호화된 이미지가 실행되도록 할 수 있습니다.

암호화된 이미지를 사용하여 앱을 실행하려면 클러스터의 작업자 노드에서 컨테이너 런타임과 이미지 복호화를 위한 키를 공유해야 합니다. 클러스터에서 이미지 키 동기화 프로그램 추가 기능을 사용으로 설정하면 동기화 프로그램 디먼 세트가 image-key-synchronizer 프로젝트에 배치됩니다. 그런 다음 해당 프로젝트에 이미지 복호화 키를 포함하는 Kubernetes 시크릿을 작성할 수 있습니다. 이 추가 기능은 컨테이너 런타임이 액세스하고 키를 사용하여 컨테이너 이미지를 복호화할 수 있는 작업자 노드의 특정 디렉토리에 키를 복사합니다. 이미지 키 동기화 프로그램 추가 기능은 먼저 IBM® Key Protect 인스턴스에 저장된 루트 키로 랩핑되는 개인 키도 지원합니다.

시작하기 전에

  1. 다음 오픈 소스 도구에 대한 CLI 클라이언트를 다운로드하여 설치하십시오.

    • OpenSSL을 사용하여 RSA 키 쌍을 생성합니다.
    • Docker Engine CLI를 사용하여 이미지 레지스트리에서 이미지를 로컬로 가져옵니다.
    • Skopeo-OCI 컨테이너 이미지를 암호화합니다.
  2. Red Hat OpenShift 클러스터에 액세스하십시오.

  3. 선택사항: 이미지 암호화를 위한 공개 및 개인 키 쌍을 작성하는 경우 시크릿에 개인 키를 직접 제공하거나 Key Protect 루트 키 또는 키 관리 서비스(KMS)를 사용하여 개인 키를 먼저 랩핑할 수 있습니다. 개인 키 랩핑을 준비하려면 다음을 수행하십시오.

    1. Key Protect CLI 플러그인을 설치하십시오.
    2. Key Protect 서비스 인스턴스를 작성하십시오.
    3. Key Protect 루트 키를 작성하십시오.
    4. Key Protect 인스턴스에 대한 다음 값을 가져오십시오.
    5. 검색한 값을 포함하는 keyprotect-config라는 Kubernetes 시크릿을 작성하십시오. 이미지 키 동기화 프로그램 추가 기능이 이 시크릿의 환경 변수를 사용하여 Key Protect 인스턴스를 인증합니다.
        apiVersion: v1
        kind: Secret
        metadata:
          name: keyprotect-config
          namespace: image-key-synchronizer
        type: Opaque
        stringData:
          config.json: |
              {
                  "keyprotect-url":"<service_endpoint>",
                  "instance-id": "<service_instance_ID>",
                  "apikey": "<service_instance_ID_API_key>"
              }
        ```
    

암호화된 이미지를 사용하는 컨테이너를 배치하려면 다음을 수행하십시오.

  1. container-service 플러그인을 최신 버전으로 업데이트하십시오.

    ibmcloud update && ibmcloud plugin update container-service
    
  2. 이미지 키 동기화 프로그램 추가 기능을 사용으로 설정하십시오.

    ibmcloud oc cluster addon enable image-key-synchronizer -c CLUSTER_NAME_OR_ID
    
  3. 클러스터의 ‘ image-key-synchronizer ’ 프로젝트에 ‘ addon-image-key-synchronizer ’ 데몬 세트가 성공적으로 생성되었는지 확인하십시오.

    oc get ds addon-image-key-synchronizer -n image-key-synchronizer
    
  4. openssl을 사용하여 개인 및 공개 RSA 키 쌍을 생성하십시오.

    openssl genrsa -out myprivatekey.pem
    openssl rsa -in myprivatekey.pem -pubout -out mypubkey.pem
    
  5. 개인 키를 시크릿에 직접 제공하거나 먼저 Key Protect와 같은 키 관리 서비스(KMS)를 사용하여 개인 키를 랩핑하십시오. image-key-synchronizer 프로젝트에서 시크릿을 작성한 후 이미지 키 동기화 프로그램 추가 기능이 작업자 노드의 /etc/crio/keys/synced 디렉토리에 개인 키를 자동으로 복사합니다.

    • 직접 개인 키 제공: 개인 키를 image-key-synchronizer 프로젝트에 Kubernetes 시크릿으로 저장하십시오.
        oc create -n image-key-synchronizer secret generic --type=key --from-file=myprivatekey.pem <secret_name>
        ```
    - **Key Protect 루트 키를 사용하여 개인 키 랩핑:**
        1. base64로 개인 키를 인코딩하고 출력을 복사하십시오.
    
            ```sh {: pre}
            cat myprivatekey.pem | base64
            ```
        2. Key Protect CLI 플러그인을 사용하여 base64로 인코딩된 개인 키를 루트 키로 랩핑하십시오. 출력에서 랩핑된 개인 키의 암호문을 복사하십시오.
    
            ```sh {: pre}
            ibmcloud kp key wrap ROOT_KEY_ID -p BASE64_ENCODED_PRIVATE_KEY
            ```
        3. 랩핑된 개인 키를 `image-key-synchronizer` 프로젝트에 Kubernetes 시크릿으로 저장하십시오.
    
            ```yaml {: pre}
            apiVersion: v1
            kind: Secret
            type: kp-key
            metadata:
              name: <secret_name>
              namespace: image-key-synchronizer
            stringData:
              rootkeyid: "<root_key_ID>"
              ciphertext: "<wrapped_private_key_cipertext>"
            ```
        4. 시크릿을 작성하십시오.
    
            ```sh {: pre}
            oc apply -n image-key-synchronizer -f <secret_name>.yaml
            ```
    
  6. docker를 사용하여 OCI 이미지를 로컬로 가져오십시오. <source_image>를 이미지의 저장소로 대체하고 <tag>를 사용할 이미지의 태그(예: latest)로 대체하십시오.

    docker pull <source_image>:<tag>
    
  7. skopeo를 사용하여 로컬 이미지를 암호화하십시오. 이 명령은 이전에 가져온 OCI 이미지를 복사하고 공개 키를 사용하여 이미지를 암호화하며 암호화된 이미지를 다른 로컬 파일에 저장합니다. 쉽게 식별할 수 있도록 암호화된 이미지 <source_image>_encrypted의 이름을 지정하십시오.

    skopeo copy --encryption-key jwe:./mypubkey.pem <source_image>:<tag> <source_image>_encrypted:<tag>
    
  8. 선택사항: 로컬에서 이미지가 암호화되었는지 확인하기 위해 올바르지 않은 키로 이미지를 복호화하려고 시도할 수 있습니다.

    1. 새 개인 키를 생성하십시오.
        openssl genrsa --out wrongkey.pem 1024
        ```
    2. 이 새 키를 사용하여 이미지를 복호화해 보십시오. 올바르지 않은 개인 키가 지정되었으므로 복호화 명령이 실패합니다.
    
    ```sh {: pre}
        skopeo copy --decryption-key ./wrongkey.pem <source_image>_encrypted:<tag> <source_image>_decrypted:<tag>
        ```
    
  9. 선택사항: 암호화된 OCI 이미지를 지원하는 IBM Cloud Container Registry에 암호화된 이미지를 푸시하십시오.

  10. 앱 배치에서 암호화된 이미지를 지정하십시오. 예를 들어, 암호화된 이미지를 IBM Cloud Container Registry에 푸시한 경우 IBM Cloud Container Registry 이미지에서 default Red Hat OpenShift 프로젝트로 컨테이너 배치의 예제를 따를 수 있습니다. 클러스터에 배치를 작성할 때 컨테이너 런타임이 /etc/crio/keys/synced 디렉토리의 개인 복호화 키를 사용하여 실행 전에 이미지를 복호화합니다.

  11. 암호화하려는 후속 이미지의 경우 동일한 공개 키를 사용하여 Skopeo로 이미지를 암호화하거나 이러한 단계를 반복하여 다른 공개 및 개인 키 쌍을 사용할 수 있습니다.

나중에 이 애드온을 비활성화하기로 결정하면 addon-image-key-synchronizer 데몬 세트는 제거되지만, image-key-synchronizer 프로젝트와 해당 프로젝트에서 생성한 모든 시크릿은 제거되지 않으며, 컨테이너 런타임은 여전히 해당 시크릿을 사용하여 암호화된 이미지를 실행할 수 있습니다. 작업자 노드에서도 키를 제거하려면 추가 기능을 사용 안함으로 설정하기 전에 image-key-synchronizer 프로젝트에서 해당 시크릿을 삭제해야 합니다.

각 Image Key Synchronizer 애드온 버전의 변경 사항 목록은 IBM Cloud 의 Image Key Synchronizer 애드온 변경 내역을 참조하십시오.

팟(Pod) 배치의 이미지 풀 시크릿 참조

클러스터 관리자가 Kubernetes 서비스 계정에 이미지 풀 시크릿을 저장하지 않은 경우 서비스 계정을 지정하지 않은 모든 배치는 이미지 풀 시크릿을 사용하여 컨테이너를 배치할 수 없습니다. 대신, 팟(Pod) 배치에서 이미지 풀 시크릿을 정의할 수 있습니다. 팟(Pod) 배치의 이미지 풀 시크릿을 참조하는 경우 이미지 풀 시크릿은 이 팟(Pod)에만 유효하며 Red Hat OpenShift 프로젝트에 있는 팟(Pod)에서 공유할 수 없습니다.

시작하기 전에

팟(Pod) 배치에서 이미지 풀 시크릿을 참조하려면 다음을 수행하십시오.

  1. mypod.yaml이라는 이름의 팟(Pod) 구성 파일을 작성하십시오.

  2. IBM Cloud Container Registry의 이미지에 액세스하기 위한 팟(Pod) 및 이미지 풀 시크릿을 정의하십시오.

    개인용 이미지에 액세스하려면 다음과 같이 정의하십시오.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: <container_name>
          image: <region>.icr.io/<namespace_name>/<image_name>:<tag>
      imagePullSecrets:
        - name: <secret_name>
    

    IBM Cloud 공용 이미지에 액세스하려면 다음과 같이 정의하십시오.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: <container_name>
          image: icr.io/<image_name>:<tag>
      imagePullSecrets:
        - name: <secret_name>
    
    container_name>
    클러스터에 배치할 컨테이너의 이름입니다. namespace_name>: 이미지가 저장되는 레지스트리 네임스페이스입니다. 사용 가능한 네임스페이스를 나열하려면 ibmcloud cr namespace-list를 실행하십시오. image_name>: 사용할 이미지의 이름입니다. IBM Cloud 계정에서 사용 가능한 이미지를 나열하려면 ibmcloud cr image-list를 실행하십시오. tag>: 사용할 이미지의 이름입니다. 태그가 지정되지 않은 경우, 기본적으로 latest로 태그가 지정된 이미지가 사용됩니다. <secret_name>: 이전에 작성한 이미지 풀 시크릿의 이름입니다.
  3. 변경사항을 저장하십시오.

  4. 클러스터에 배치를 작성하십시오.

    oc apply -f mypod.yaml
    

이미지를 IBM Cloud Container Registry에 푸시

클러스터 관리자가 IBM Cloud Container Registry로 이미지 레지스트지를 설정하고 나면 이미지를 네임스페이스에 추가하여 안전하게 Docker 이미지를 저장하고 다른 사용자와 공유할 수 있습니다.

예를 들어, 사설 또는 공용 레지스트리 소스에서 이미지를 가져온 후 IBM Cloud Container Registry에서 차후 사용을 위해 이를 태그로 지정할 수 있습니다. 또는 다른 사용자가 이미지에 액세스할 수 있도록 작업하는 Docker 이미지를 네임스페이스에 푸시할 수 있습니다. 시작하려면 이미지를 네임스페이스에 추가를 참조하십시오.

Vulnerability Advisor로 IBM Cloud Container Registry에서 이미지의 보안 관리

Vulnerability Advisor는 IBM, 서드파티에서 제공하거나 조직의 IBM Cloud Container Registry 네임스페이스에 추가되는 컨테이너 이미지의 보안 상태를 확인합니다.

이미지를 네임스페이스에 추가하면 보안 문제 및 잠재적인 취약성을 발견하도록 Vulnerability Advisor에서 자동으로 이미지를 스캔합니다. 보안 문제가 발견되면 보고된 취약성을 수정하는 데 유용한 지시사항이 제공됩니다. 시작하려면 Vulnerability Advisor를 사용하여 이미지 보안 관리를 참조하십시오.

컨테이너 이미지에 대한 신뢰할 수 있는 컨텐츠 설정

서명되어 IBM Cloud Container Registry에 저장된 신뢰할 수 있는 이미지에서 컨테이너를 빌드하고 서명되지 않았거나 취약한 이미지에서 배치되지 않도록 할 수 있습니다.

  1. 신뢰할 수 있는 컨텐츠에 대한 이미지에 서명하십시오. 이미지에 대한 신뢰를 설정한 후 레지스트리에 이미지를 푸시할 수 있는 신뢰할 수 있는 컨텐츠 및 서명자를 관리할 수 있습니다.
  2. 클러스터에서 컨테이너를 빌드하는 데 서명된 이미지만 사용할 수 있도록 정책을 강제 실행하려면 오픈 소스 Portieris 프로젝트를 설치하십시오.
  3. 클러스터 사용자는 신뢰할 수 있는 이미지에서 빌드된 앱을 배치할 수 있습니다.
    1. default Kubernetes 네임스페이스에 배치하십시오.
    2. 다른 Kubernetes 네임스페이스에 배치하거나 다른 IBM Cloud 지역 또는 계정에서 배치하십시오.

클러스터에서 이미지 보안 적용 사용

클러스터에서 이미지 보안 적용을 사용으로 설정할 때 오픈 소스 Portieris Kubernetes 프로젝트를 설치합니다. 그런 다음 클러스터에서 정책을 충족하지 않는 팟(Pod)(예: 서명되지 않은 이미지)이 실행되지 않도록 차단하는 이미지 정책을 작성할 수 있습니다.

자세한 내용은 ‘ Portieris ’ 문서를 참조하십시오.

변경된 이미지: 기본적으로 Portieris는 태그 대신 요약으로 이미지를 참조하도록 MutatingAdmissionWebhook 승인 제어기를 사용하여 이미지를 변경합니다. 하지만, 변경된 이미지를 거부하는 일부 배치 기술이 있을 수 있습니다. 그렇다면 이미지 변형 옵션과 정책을 사용하여 기본 동작을 변경할 수 있습니다.

이미지 보안 적용 사용 또는 사용 안함

CLI 또는 콘솔에서 클러스터에 대한 이미지 보안 적용을 활성화하거나 비활성화할 수 있습니다. 이전 버전에 대해서는 Portieris 문서를 참조하십시오.

CLI를 사용하여 이미지 보안 적용을 사용 또는 사용 안함으로 설정

다음 명령을 참조하십시오.

콘솔에서 이미지 보안 적용을 사용 또는 사용 안함으로 설정

  1. 콘솔에서 클러스터를 선택합니다.
  2. 이미지 보안 적용 필드를 찾아 활성화 또는 비활성화를 클릭합니다.

기본 이미지 정책

이미지 보안 적용을 사용으로 설정하면 Red Hat OpenShift on IBM Cloud가 클러스터에서 특정 이미지 정책을 자동으로 작성합니다. 이 기능을 사용 안함으로 설정하면 기본 ClusterImagePolicy CRD가 제거되어 모든 기본 이미지 정책 및 사용자가 작성한 모든 사용자 정의 이미지 정책이 제거됩니다.

  • 이름이 ibm-signed-image-enforcement인 이미지 정책은 프로젝트에서 실행되는 이미지를 Red Hat OpenShift on IBM Cloud 이미지로만 제한합니다. 이러한 이미지 정책을 수정하지 마십시오. 몇 분 후에 변경사항이 겹쳐써집니다.
  • 다른 이미지 정책(예: default 또는 default-allow-all)은 다른 이미지 정책에서 제한되지 않는 이미지를 허용합니다. 이러한 이미지 정책을 수정할 수 있고 변경사항이 보존되지만 이미지 정책의 이름을 바꾸지 마십시오. 정책의 이름을 바꾸면 기본 이름 및 설정의 추가 정책이 작성됩니다.

클러스터의 이미지 정책을 검토하려면 다음을 수행하십시오.

시작하기 전에

Red Hat OpenShift 클러스터에 액세스하십시오.

  1. 클러스터에 글로벌로 적용되는 이미지 정책을 나열하십시오. 구성 예시는 ‘ Portieris ’ 정책 설명서를 참조하십시오.

    oc get ClusterImagePolicy
    
  2. 클러스터 내 특정 네임스페이스에 적용되는 이미지 정책을 나열하십시오. 구성 예시는 ‘ Portieris ’ 정책 설명서를 참조하십시오.

    oc get ImagePolicy --all-namespaces