IBM Cloud Docs
이미지 레지스트리 설정

이미지 레지스트리 설정

Red Hat® OpenShift® on IBM Cloud® 클러스터에 컨테이너 이미지를 로컬로 빌드하고 배치하고 관리하기 위한 내부 레지스트리가 포함됩니다. 또한 개인용 레지스트리에서 엔터프라이즈 전체의 이미지에 대한 액세스를 관리하고 제어하기 위해 IBM Cloud® Container Registry를 사용하도록 클러스터를 설정할 수 있습니다.

이미지 레지스트리 솔루션 선택

컨테이너 이미지를 클러스터에 애플리케이션을 배포할 수 있도록 클러스터가 접근할 수 있는 컨테이너 레지스트리에 저장해야 합니다. Red Hat OpenShift 클러스터의 기본 제공 레지스트리, 액세스가 일부 사용자로 제한된 개인용 레지스트리 또는 공용 레지스트리를 사용하도록 선택할 수 있습니다. 다음 표를 검토하여 유스 케이스에 가장 적합한 옵션을 선택하십시오.

내부 Red Hat OpenShift Container Registry(OCR)

클러스터는 Red Hat OpenShift이(가) 클러스터 내에서 애플리케이션 라이프사이클을 자동으로 빌드, 배치 및 관리할 수 있도록 내부 Red Hat OpenShift Container Registry를 사용하여 설정됩니다. 이미지는 클러스터 작성 시 프로비저닝된 지원 IBM Cloud 클래식 파일 스토리지 디바이스에 저장됩니다. 추가 스토리지가 필요한 경우 디바이스의 크기를 조정할 수 있습니다. 유스 케이스:

  • 클러스터별 Red Hat OpenShift 기반 이미지 스트림, 빌드, 앱 배치 프로세스입니다.
  • RBAC 역할을 통해 제어되는 액세스 권한으로 클러스터의 모든 프로젝트에서 이미지를 공유할 수 있습니다.
  • 취약성 검사 등 확장된 기능을 위해 내부 레지스트리를 CloudForms와 같은 다른 Red Hat 제품과 통합합니다.
  • 사용자가 공용 네트워크를 통해 레지스트리에서 이미지를 가져올 수 있도록 라우트를 사용하여 내부 레지스트리를 노출하는 옵션입니다.
  • 개인용 레지스트리(예: IBM Cloud Container Registry)에 대해 이미지 푸시 또는 이미지 가져오기(pull)를 수행하도록 내부 레지스트리를 설정하는 옵션입니다.

자세한 정보는 내부 레지스트리 사용을 참조하십시오.

개인용 레지스트리

개인용 레지스트리는 권한 없는 사용자로부터 이미지를 보호하는 좋은 방법입니다. 액세스, 스토리지 할당량, 이미지 신뢰, 기타 기능이 의도한 대로 작동하도록 하려면 클러스터 관리자가 개인용 레지스트리를 설정해야 합니다. 기본적으로 Red Hat OpenShift 클러스터default 프로젝트의 이미지 풀 시크릿을 통해 개인용 IBM Cloud Container Registry와 통합됩니다. IBM Cloud Container Registry는 사용자 고유의 이미지를 저장하는 데 사용되는 고가용성의 멀티 테넌트 개인용 레지스트리입니다. 글로벌 icr.io 레지스트리에서 IBM 제공 이미지를 가져오고 권한 있는 레지스트리에서 라이센스가 부여된 소프트웨어를 가져올 수도 있습니다. IBM Cloud Container Registry을(를) 사용하면 IBM Cloud IAM 및 청구와 통합하여 여러 클러스터의 이미지를 관리할 수 있습니다. 내부 레지스트리와 IBM Cloud Container Registry 사용 시 장점:

  • 내부 레지스트리를 통해 더 빠르게 빌드하도록 로컬 이미지를 캐싱합니다.
  • 다른 프로젝트의 배치에서 이미지 스트림을 확인할 수 있으므로 각 프로젝트에 가져오기(pull) 시크릿을 복사할 필요가 없습니다.
  • 여러 레지스트리에 이미지를 푸시할 필요 없이 여러 클러스터에서 이미지를 공유합니다.
  • 이미지 취약성을 자동으로 스캔합니다.
  • IBM Cloud IAM 정책개별 지역 레지스트리를 통해 액세스를 제어합니다.
  • 클러스터 또는 연결된 스토리지 디바이스의 스토리지 공간 없이도 이미지를 보유합니다. 또한 너무 많은 공간을 차지하지 않도록 이미지 양을 관리하는 정책을 설정할 수 있습니다.
  • VPC 인프라: 프라이빗 레지스트리 서비스 엔드포인트를 사용하여 프라이빗 클라우드 서비스 엔드포인트만 사용하는 클러스터도 레지스트리에 계속 액세스할 수 있도록 합니다.
  • 이미지 스토리지와 사용, 비용 청구를 더 효과적으로 제어할 수 있도록 스토리지 및 이미지 가져오기 트래픽 할당량을 설정합니다.
  • 권한 있는 레지스트리에서 라이센스가 부여된 IBM 컨텐츠를 가져옵니다.

시작하려면 다음 주제를 참조하십시오.

공용 레지스트리

Docker 허브와 같은 공용 레지스트리는 팀, 동료, 클러스터 또는 클라우드 제공자 간에 이미지를 공유하는 방법입니다. 일부 공용 레지스트리는 개인용 레지스트리 구성요소를 제공하기도 합니다. 유스 케이스:

  • 공용 네트워크에서 이미지 푸시 및 가져오기.
  • 클라우드 제공자에서 컨테이너의 빠른 테스트.
  • 취약성 스캔 또는 액세스 관리와 같은 엔터프라이즈급 기능이 필요하지 않습니다.

자세한 내용은 공개 레지스트리의 문서(예: Quay 또는 Docker Hub)를 참조하십시오.

이미지를 내부 레지스트리에 저장하기

Red Hat OpenShift 클러스터에는 기본적으로 내부 레지스트리가 있습니다. 내부 레지스트리의 이미지는 백업되지만 Red Hat OpenShift on IBM Cloud 클러스터의 인프라 제공자에 따라 다릅니다.

클래식 클러스터
클러스터는 Red Hat OpenShift 기본적으로 내부 레지스트리를 사용하여 File Storage for Classic 백엔드 스토리지로 설정됩니다. 클러스터를 삭제하면 내부 레지스트리 및 해당 이미지도 삭제됩니다. 이미지를 유지하려는 경우, 개인용 레지스트리(예: IBM Cloud Container Registry)를 사용하거나 이미지를 지속적 스토리지(예: Object Storage)에 백업하거나 별도의 독립형 Red Hat OpenShift Container Registry(OCR) 클러스터를 작성하는 것이 좋습니다. 자세한 정보는 Red Hat OpenShift 문서를 참조하십시오.
VPC 클러스터
클러스터의 Red Hat OpenShift 내부 레지스트리는 이미지를 계정의 IBM Cloud Object Storage 인스턴스에 자동 생성되는 버킷으로 백업합니다. 클러스터를 삭제하더라도 오브젝트 스토리지 버킷에 저장된 데이터는 그대로 유지됩니다.
클래식, VPC 또는 Satellite 클러스터
선택적으로 내부 레지스트리를 설정하여 내부 레지스트리 포드가 실행되는 워커 노드의 emptyDir 데이터 저장소로 사용할 수 있습니다. 이 데이터는 지속되지 않으며, 팟(Pod) 또는 작업자 노드를 다시 시작하면 저장된 데이터가 삭제되고 복구할 수 없다는 점에 유의하십시오. 대용량 이미지에서 컨테이너를 주기적으로 빌드하는 경우 성능을 향상시키기 위해 emptyDir에 로컬로 이미지를 저장할 수 있습니다.

내부 이미지 레지스트리를 백업하려면 IBM Cloud Object Storage

가상 사설 클라우드

Red Hat OpenShift 클러스터 내부 레지스트리의 이미지는 IBM Cloud Object Storage 버킷에 자동으로 백업됩니다. 클러스터를 삭제하더라도 오브젝트 스토리지 버킷에 저장된 데이터는 그대로 유지됩니다.

하지만, 클러스터를 작성할 때 버킷을 작성하지 못한 경우 버킷을 수동으로 작성하고 해당 버킷을 사용하도록 클러스터를 설정해야 합니다. 그동안 내부 레지스트리는 작업자 노드의 보조 디스크에 컨테이너 이미지를 저장하는 emptyDir Kubernetes 볼륨을 사용합니다. emptyDir 볼륨은 고가용성의 지속적 스토리지로 간주되지 않으며, 이미지를 사용하는 팟(Pod)을 삭제하면 이미지가 자동으로 삭제됩니다.

내부 레지스트리의 버킷을 수동으로 작성하려면 클라우드 오브젝트 스토리지 버킷에 대한 클러스터 작성 오류를 참조하십시오.

클래식 클러스터의 내부 레지스트리에 이미지 저장

기본적으로 Red Hat OpenShift 클러스터의 내부 레지스트리는 레지스트리 이미지를 저장하기 위해 IBM CloudFile Storage for Classic 볼륨을 사용합니다. 스토리지 볼륨의 기본 크기를 검토하거나 볼륨 크기를 업데이트할 수 있습니다.

볼륨 세부사항 보기

스토리지 클래스 및 크기를 포함한 볼륨 세부사항을 보려면 지속적 볼륨 청구를 설명합니다.

oc describe pvc -n openshift-image-registry image-registry-storage

볼륨 세부사항 변경

레지스트리에 이미지에 대한 추가 기가바이트 스토리지가 필요한 경우 파일 스토리지 볼륨의 크기를 조정할 수 있습니다. 자세한 정보는 기존 스토리지 디바이스의 크기 및 IOPS 변경을 참조하십시오. IBM Cloud 인프라 계정에서 볼륨의 크기를 조정하는 경우 첨부된 PVC 설명이 업데이트되지 않습니다. 대신, PVC를 registry-backing 사용하는 포드에 openshift-image-registry 로그인하여 볼륨 크기가 조정되었는지 확인할 수 있습니다.

작업자 노드의 빈 디렉토리에 이미지 저장

대용량 이미지에서 컨테이너를 주기적으로 빌드하는 경우 베어메탈 작업자 노드와 같은 작업자 노드의 emptyDir에 로컬로 내부 레지스트리 이미지를 저장하여 성능을 향상시킬 수 있습니다.

이 데이터는 지속되지 않으며, 팟(Pod) 또는 작업자 노드를 다시 시작하면 저장된 데이터가 삭제되고 복구할 수 없다는 점에 유의하십시오.

  1. Red Hat OpenShift 클러스터에 액세스하십시오.
  2. 이미지 레지스트리 연산자 구성 맵을 업데이트하여 작업자 노드의 emptyDir 을 사용하도록 스토리지를 설정합니다. emptyDir 를 사용하도록 configmap을 업데이트해도 이미지 레지스트리의 원래 PVC는 제거되지 않습니다.
    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
    
  3. 이미지 레지스트리 운영자 관리 상태가 클러스터 Satellite 등에서 로 설정된 Unmanaged 경우, 관리 상태를 로 Managed 업데이트하십시오. 이제 오퍼레이터가 내부 레지스트리 팟(Pod)을 업데이트합니다.
    oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
    
  4. 업데이트를 확인할 수 있도록 내부 레지스트리 팟(Pod)의 세부사항을 가져오십시오.
    1. image-registry 팟(Pod)이 실행 중이고 팟이 클러스터의 작업자 노드마다 실행되는지 확인하십시오.

      oc get pods -n openshift-image-registry
      

      출력 예

      NAME                                               READY   STATUS    RESTARTS   AGE
      cluster-image-registry-operator-695bf78ffc-zvkhd   2/2     Running   0          33m
      image-registry-6774598589-65cnx                    1/1     Running   0          112s
      node-ca-gg66r                                      1/1     Running   0          113s
      node-ca-n8jpq                                      1/1     Running   0          113s
      node-ca-p2d7j                                      1/1     Running   0          113s
      
    2. ** 팟(Pod)이 실행되는 **노드image-registry의 공용 IP 주소를 가져오십시오.

      oc describe pod -n openshift-image-registry <image-registry-pod> | grep Node
      

      출력 예

      Node:               169.xx.xxx.xxx/169.xx.xxx.xxx
      

      작업자 노드 IP 주소가 사설 IP 주소인 경우에는 ibmcloud oc worker ls -c <cluster> | grep <private_IP>를 실행하고 해당 공인 IP 주소를 기록해 두십시오.

    3. 팟(Pod) YAML에서 ** 섹션에 있는 ** 팟(Pod)의 image-registryUIDmetadata.uid를 가져오십시오(metadata.ownerReferences.uid 섹션에 설정된 복제본의 UID 아님).

      oc get pod -n openshift-image-registry <image-registry-pod> -o yaml
      

      출력 예

      apiVersion: v1
      kind: Pod
      metadata:
          uid: e8d7718d-b0bd-47e2-9aaa-05f3a608fd9b
      ...
      
  5. 내부 레지스트리가 작업자 노드의 emptyDir에 데이터를 저장하는지 확인하십시오.
    1. 클러스터에서 직접 레지스트리에 접근하려면, 이전에 검색한 워커 노드를 사용하십시오. 단계에 따라 내부 레지스트리로 테스트 이미지를 푸시하십시오.

      Red Hat OpenShift 문서에서 이러한 단계를 완료하려면 podman CLI 도구가 필요합니다. 작업자 노드에 기본적으로 이 CLI 도구가 없을 수도 있습니다. 사용 가능한 RHEL 버전에 대해서는 설치 Podman 가이드를 참조하십시오.

    2. emptyDir에 저장하는 내부 레지스트리 팟(Pod) 폴더로 이동하십시오. <pod_uid>의 경우 이전에 검색한 팟(Pod) UID를 사용하십시오.

      cd var/lib/kubelet/pods/<pod_uid>/volumes/kubernetes.io~empty-dir/registry-storage/docker/registry/v2/repositories/openshift
      
    3. 이미지가 저장소 디렉토리에 있는지 확인하십시오.

      ls
      

      출력 예

      <myimage>  nginx  ...
      

내부 이미지 레지스트리 제거

가상 사설 클라우드

이미지 레지스트리 운영자 배포는 툴킷 관리 Red Hat OpenShift on IBM Cloud 클러스터에서만 존재합니다. HyperShift 관리형 클러스터는 제어 평면에서 이미지 레지스트리 오퍼레이터를 실행합니다.

내부 이미지 레지스트리를 사용하지 않으려면 다음 단계를 완료하여 제거할 수 있습니다.

  1. 내부 레지스트리 구성의 사본을 저장하십시오.
    oc get configs.imageregistry.operator.openshift.io cluster -o yaml > configs.yaml
    
  2. 다음 패치 명령을 실행하여 이미지 레지스트리의 관리 상태를 Removed 로 변경하십시오.
    kubectl patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"managementState":"Removed"}}' --type='merge'
    
  3. 관리 상태를 변경하면 이미지 레지스트리 서비스 및 배치가 클러스터의 openshift-image-registry 네임스페이스에서 제거됩니다. 다음 명령을 실행하여 제거되었는지 확인할 수 있습니다. 이미지 레지스트리 배치 및 서비스만 제거됩니다. 이미지 레지스트리 운영자 배치 및 서비스는 남아 있습니다.
    oc get deployment -n openshift-image-registry
    
    oc get svc -n openshift-image-registry
    

내부 레지스트리의 보안 외부 라우트 설정

기본적으로, Red Hat OpenShift 클러스터에 내부 IP 주소를 사용하는 서비스를 통해 사용 가능한 내부 레지스트리가 있습니다. 내부 레지스트리를 공용 네트워크에서 사용할 수 있도록 하려면 보안 재암호화 라우트를 설정합니다. 예를 들어, 클러스터의 내부 레지스트리가 다른 프로젝트나 클러스터 배치에서 공용 레지스트리의 역할을 하도록 설정할 수도 있습니다.

시작하기 전에:

내부 레지스트리를 사용하려면 레지스트리에 액세스하도록 공용 라우트를 설정하십시오. 그런 다음, 다른 프로젝트의 배치가 이 레지스트리에서 이미지를 가져올 수 있도록 레지스트리에 액세스하는 데 필요한 인증 정보가 포함된 이미지 가져오기 시크릿을 작성하십시오.

  1. openshift-image-registry 프로젝트에서 내부 레지스트리에 대한 image-registry 서비스가 있는지 확인하십시오.

    oc get svc -n openshift-image-registry
    

    출력 예

    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
    image-registry            ClusterIP      172.21.xxx.xxx    <none>          5000/TCP                     36d
    image-registry-operator   ClusterIP      None             <none>          60000/TCP                     36d
    
  2. image-registry TLS 종료를 사용하는 reencrypt 서비스에 대한 보안 라우트를 작성하십시오. 재암호화에서는 라우터가 인증서로 TLS 연결을 종료한 다음 다른 인증서로 내부 레지스트리에 대한 연결을 다시 암호화합니다. 이 방식을 사용하면 사용자와 내부 레지스트리 간 연결의 전체 경로가 암호화됩니다. 사용자 지정 도메인 이름을 제공하려면 옵션을 --hostname 포함하십시오.

    oc create route reencrypt --service=image-registry -n openshift-image-registry
    
  3. ** 라우트에 지정된 호스트 이름(HOST/PORT) 및 **PORTimage-registry를 검색하십시오.

    oc get route image-registry -n openshift-image-registry
    

    출력 예

    NAME              HOST/PORT                                                                                                  PATH      SERVICES          PORT       TERMINATION   WILDCARD
    image-registry   image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud             image-registry   5000-tcp   reencrypt     None
    
  4. 경로를 편집하여 부하 분산 전략을 로 설정하십시오 source. 이렇게 하면 동일한 클라이언트 IP 주소가 동일한 서버에 도달하게 되며, 이는 패스스루 경로 설정과 동일합니다. metadata.annotations 섹션에 다음 어노테이션을 추가하여 전략을 설정할 수 있습니다. haproxy.router.openshift.io/balance: source 다음 명령을 실행하여 Red Hat OpenShift 애플리케이 콘솔 또는 명령행에서 구성 파일을 편집할 수 있습니다.

    oc edit route image-registry -n openshift-image-registry
    

    어노테이션을 추가하십시오.

    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
    annotations:
        haproxy.router.openshift.io/balance: source
    ...
    
  5. 회사 네트워크 정책에 따라 프록시 또는 방화벽을 통해 로컬 시스템에서 공용 엔드포인트로 액세스하는 것이 금지되는 경우, 다음 단계에서 내부 레지스트리에 대해 작성한 라우트 서브도메인에 대한 액세스를 허용하십시오.

  6. 라우트를 호스트 이름으로 사용하여 내부 레지스트리에 로그인하십시오.

    docker login -u $(oc whoami) -p $(oc whoami -t) image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud
    
  7. 로그인되었으므로 내부 레지스트리에 샘플 hello-world 앱을 푸시해 보십시오.

    1. DockerHub에서 hello-world 이미지를 가져오거나 로컬 시스템에서 이미지를 빌드하십시오.

      docker pull hello-world
      
    2. 내부 레지스트리의 호스트 이름, 이미지를 배치할 프로젝트, 이미지 이름 및 태그를 사용해 로컬 이미지에 태그를 지정하십시오.

      docker tag hello-world:latest image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
      
    3. 클러스터의 내부 레지스트리에 이미지를 푸시하십시오.

      docker push image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud/<project>/<image_name>:<tag>
      
    4. 이미지가 Red Hat OpenShift 이미지 스트림에 추가되었는지 확인하십시오.

      oc get imagestream
      

      출력 예

      NAME          DOCKER REPO                                                            TAGS      UPDATED
      hello-world   image-registry-openshift-image-registry.svc:5000/default/hello-world   latest    7 hours ago
      
  8. 프로젝트 배치에서 내부 레지스트리의 이미지를 가져올 수 있게 하려면 내부 레지스트리에 액세스하는 데 필요한 인증 정보를 보유한 이미지 가져오기 시크릿을 프로젝트에 작성하십시오. 그런 다음, 프로젝트별로 기본 서비스 계정에 이미지 가져오기 시크릿을 추가하십시오.

    1. 기본 서비스 계정이 사용하는 이미지 가져오기 시크릿을 나열하고 default-dockercfg로 시작하는 시크릿을 확인하십시오.

      oc describe sa default
      

      출력 예

      ...
      Image pull secrets:
      all-icr-io
      default-dockercfg-mpcn4
      ...
      
    2. 구성 파일의 data 필드에서 인코딩된 시크릿 정보를 가져오십시오.

      oc get secret <default-dockercfg-name> -o yaml
      

      출력 예

      apiVersion: v1
      data:
        .dockercfg: ey...=
      
    3. data 필드 값을 디코딩하십시오.

      echo "<ey...=>" | base64 -D
      

      출력 예

      {"172.21.xxx.xxx:5000":{"username":"serviceaccount","password":"eyJ...
      
    4. 내부 레지스트리의 새 이미지 가져오기 시크릿을 작성하십시오.

      • secret_name: 이미지 가져오기 시크릿에 이름을 지정하십시오(예: internal-registry).
      • --namespace: 이미지 가져오기 시크릿을 작성할 프로젝트를 입력하십시오(예: default).
      • --docker-server: 내부 서비스 IP 주소(172.21.xxx.xxx:5000) 대신 image-registry 라우트의 호스트 이름을 포트와 함께 입력하십시오(image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000).
      • --docker-username: 이전 이미지 가져오기 시크릿에서 "username"을 복사하십시오(예: serviceaccount).
      • --docker-password: 이전 이미지 가져오기 시크릿에서 "password"를 복사하십시오.
      • --docker-email: Docker 이메일 주소를 입력하십시오(있는 경우). 없다면 가상 이메일 주소(예: a@b.c)를 입력하십시오. 이 이메일은 Kubernetes 시크릿을 작성하는 데 필요하지만 작성 후에는 사용되지 않습니다.
      oc create secret docker-registry internal-registry --namespace default --docker-server image-registry-openshift-image-registry.<cluster_name>-<ID_string>.<region>.containers.appdomain.cloud:5000 --docker-username serviceaccount --docker-password <eyJ...> --docker-email a@b.c
      
    5. 프로젝트의 기본 서비스 계정에 이미지 가져오기 시크릿을 추가하십시오.

      oc patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
    6. 내부 레지스트리에서 이미지를 가져올 각 프로젝트에 대해 이러한 단계를 반복하십시오.

액세스 가능한 라우트로 내부 레지스트리를 설정하므로 로그인하여 레지스트리에 이미지를 푸시하거나 가져올 수 있습니다. 자세한 정보는 Red Hat OpenShift 문서를 참조하십시오.

이미지를 IBM Cloud Container Registry에서 내부 레지스트리 이미지 스트림으로 가져오기

기본적으로 Red Hat OpenShift on IBM Cloud 클러스터는 icr.io 프로젝트의 원격 개인용 IBM Cloud Container Registry default 도메인에서 이미지를 가져오도록 설정됩니다. 이미지를 이미지 스트림으로 태그 IBM Cloud Container Registry 지정하여 Red Hat OpenShift 클러스터의 내부 레지스트리로 가져올 수 있습니다. 이 설정에서는 내부 레지스트리의 로컬 캐시를 사용하여 이미지에서 앱을 배치할 수 있으며 앱 배치 빌드를 만드는 속도가 빨라집니다. 또한 각 프로젝트에서 IBM Cloud Container Registry에 대해 이미지 가져오기(pull) 시크릿 신임 정보를 작성할 필요가 없도록 다른 프로젝트 배치에서 이미지 스트림을 참조할 수 있습니다.

IBM Cloud Container Registry에서 이미지를 업데이트하는 경우 이미지를 Red Hat OpenShift 클러스터의 내부 레지스트리로 자동으로 가져오지 않습니다. 대신 주기적인 가져오기를 설정하거나, 이미지를 태그하기 위해 이 단계를 반복하십시오. 배치에 사용하는 이미지 가져오기 정책에 따라 배치를 다시 시작해야 할 수도 있습니다.

빌드, 이미지 스트림, 내부 레지스트리가 함께 작동하는 방식에 대해 자세히 알고 싶으십니까? 서를 Red Hat OpenShift 읽어보거나, 컨테이너 이미지 관리에 관한 이 블로그를 확인해 보세요.

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

  2. default 프로젝트로 전환하여 이미지를 이미지 스트림으로 가져오십시오. default 프로젝트는 icr.io 레지스트리에 액세스하는 데 필요한 인증 정보로 이미 설정되어 있습니다.

    oc project default
    
  3. IBM Cloud Container Registry에 사용 가능한 이미지를 나열하십시오. Red Hat OpenShift 클러스터의 내부 레지스트리로 가져오려는 이미지의 저장소태그를 기록해 두십시오.

    ibmcloud cr images
    
  4. 이미지를 이미지 스트림으로 IBM Cloud Container Registry 네임스페이스에서 내부 레지스트리로 가져오려면 이미지에 태그를 지정하십시오. 자세한 내용은 Red Hat OpenShift 문서를 참조하거나 oc tag --help 을 실행하세요.

    oc tag <region>.icr.io/<namespace>/<image>:<tag> default/<image>:<tag> --reference-policy=local [--scheduled]
    
    • <region>.icr.io/<namespace>/<image>:<tag>: 이전에 검색한 리포지토리태그 정보를 사용하여 가져올 이미지의 리전, 네임스페이스, IBM Cloud Container Registry 이미지 및 태그 이름을 완성하십시오.
    • default/<image>:<tag>: IBM Cloud Container Registry 태그 지정된 이미지에서 작성한 내부 이미지 스트림에 대한 정보를 입력하십시오. 프로젝트를 지정하지 않는 경우 이미지 스트림이 작성되는 프로젝트인 default 프로젝트에서 이 이미지 스트림을 작성합니다. <image>:<tag>의 값은 이전에 검색한 값과 일치합니다.
    • --reference-policy=local: IBM Cloud Container Registry의 이미지 사본을 내부 레지스트리의 로컬 캐시에 가져오고 클러스터의 프로젝트에서 이미지 스트림으로 사용할 수 있도록 이 값을 local로 설정하십시오. 이 값을 포함하지 않는 경우 배치에서 이를 사용할 때 이미지 스트림이 IBM Cloud Container Registry을(를) 다시 참조하므로 프로젝트에서 신임 정보가 필요합니다.
    • --scheduled 이 선택적 옵션을 설정하여 이미지를 내부 IBM Cloud Container Registry 레지스트리로 주기적으로 가져오도록 구성합니다. 기본 빈도는 15분입니다. 자세한 정보는 Red Hat OpenShift 문서를 참조하십시오.
  5. 이미지 스트림이 작성되었는지 확인하십시오.

    oc get imagestreams
    
  6. 이미지 스트림이 IBM Cloud Container Registry에서 이미지를 가져왔는지 확인하십시오. 출력에서 latest tagged from 이미지가 * <region>.icr.io/<namespace>/<image>@<digest> 이미지와 일치하는지 확인하십시오.

    oc describe is/<imagestream>
    

    출력 예

    NAME:            <imagestream>
    Namespace:        default
    Created:        2 days ago
    Labels:            <none>
    Annotations:        openshift.io/image.dockerRepositoryCheck=2020-03-31T09:41:36Z
    Image Repository:    image-registry.openshift-image-registry.svc:5000/default/ant1
    Image Lookup:        local=false
    Unique Images:        1
    Tags:                1
    
    latest
        tagged from <region>.icr.io/<namespace>/<image>:<tag>
    
        * <region>.icr.io/<namespace>/<image>@<digest>
            2 days ago
    

이제 개발자는 엡 배치에서 이미지 스트림을 사용할 수 있습니다. 해당 이미지는 내부 레지스트리의 로컬로 가져온 이미지에서 빌드됩니다. 이미지 스트림이 클러스터에 로컬이므로 프로젝트의 이미지 가져오기(pull) 시크릿을 IBM Cloud Container Registry에 설정할 필요가 없습니다.

IBM Cloud Container Registry에 이미지를 푸시하기 위해 내부 레지스트리에서 빌드 설정

클러스터에서 Red Hat OpenShift on IBM Cloud 빌드를 생성할 때, 내부 레지스트리를 설정하여 이미지를 외부 저장소로 푸시할 수 IBM Cloud Container Registry 있습니다. 기본적으로 클러스터의 default 프로젝트의 이미지 가져오기 시크릿에는 IBM Cloud Container Registry에서 이미지를 가져올 수 있는 읽기 액세스 권한만 있습니다. 이미지를 푸시하려면 쓰기 액세스 권한을 사용하여 시크릿을 추가해야 합니다.

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

  2. default 프로젝트로 전환하십시오.

    oc project default
    
  3. 단계에 따라 레지스트리에서 이미지를 가져오고 이 레지스트리로 푸시할 수 있는 ReaderWriter 서비스 액세스 역할로 IBM Cloud IAM API 키icr.io를 설정하십시오.

    프로젝트에 대한 액세스 권한을 가진 사용자는 이 시크릿을 사용하여 개인용 레지스트리에 이미지를 푸시할 수 있습니다. 클러스터에서 누가 어떤 조치를 수행하는지 관찰할 수 있도록 로깅 및 모니터링 도구를 설정할 수 있습니다.

  4. 이미지를 푸시할 각 icr.io 지역별로 이전 단계를 반복하십시오.

  5. 빌드 서비스 계정에 시크릿을 추가하고 빌드 구성 파일에서 시크릿을 참조하십시오. 자세한 정보는 Red Hat OpenShift 문서를 참조하십시오.

    1. 클러스터의 모든 빌드가 사용하는 builder 역할에 작성한 시크릿을 연결하여 빌드 서비스 계정에 시크릿을 추가하십시오.

      oc secrets link builder <secret_name>
      
    2. 빌드 구성을 나열하고 IBM Cloud Container Registry에 대한 푸시 및 가져오기 액세스 권한을 제공할 빌드 구성을 기록해 두십시오.

      oc get bc
      
    3. IBM Cloud Container Registry에 대한 Writer 서비스 액세스 권한을 사용하여 작성한 시크릿을 사용하도록 빌드 구성의 이미지 푸시 시크릿을 설정하십시오.

      oc set build-secret --push bc/<build_config_name> <secret_name>
      
    4. 초기 빌드 이미지를 가져올 레지스트리에서 가져오도록 빌드 구성의 이미지 가져오기 시크릿을 설정하십시오. 예를 들어, 소스 이미지가 IBM Cloud Container Registry 저장소에 있는 경우 IBM Cloud Container Registry에 대한 Reader 서비스 액세스 권한으로 작성한 시크릿을 사용할 수 있습니다.

      oc set build-secret --pull bc/<build_config_name> <secret_name>
      
  6. IBM Cloud Container Registry에 푸시할 빌드 서비스 계정 및 빌드 구성 파일을 업데이트한 후 빌드를 다시 시작하십시오.

    oc start-build <build_name>
    
  7. 빌드 팟(Pod)의 이름을 가져오십시오(예: <build>-2-build).

    oc get pods
    
  8. 빌드 로그를 확인하고 이미지가 푸시된 위치를 확인하십시오.

    oc logs <build_pod>
    

    성공적인 이미지 푸시 로그의 예.

    ...
    Successfully pushed <region>.icr.io/<namespace>/<build_name>@sha256:<hash>
    Push successful
    
  9. 개인용 레지스트리에서 이미지를 찾아보고 이미지가 작성되었는지 확인하십시오.

    ibmcloud cr image list
    

    출력 예

    Repository                                Tag       Digest     Namespace     Created         Size     Security status   
    <region>.icr.io/<namespace>/<build_name>  latest    <digest>   <namespace>   2 minutes ago   182 MB   33 Issues  
    

이제 Red Hat OpenShift 빌드는 IBM Cloud Container Registry에서 이미지를 가져오고 푸시할 수 있습니다.

IBM Cloud Container Registry 사용

기본적으로 Red Hat OpenShift on IBM Cloud 클러스터는 icr.io 프로젝트의 원격 개인용 IBM Cloud Container Registry default 도메인에서 이미지를 가져오도록 설정됩니다. 다른 프로젝트에서 IBM Cloud Container Registry에 저장된 이미지를 사용하려는 경우, 이미지 스트림의 내부 레지스트리로 이미지를 가져오거나 프로젝트별로 각 글로벌 및 지역 레지스트리에 대해 이미지 가져오기 시크릿을 작성할 수 있습니다.

내부 레지스트리로 이미지를 가져오려는 경우: IBM Cloud Container Registry에서 내부 레지스트리 이미지 스트림으로 이미지 가져오기를 참조하십시오.

외부 IBM Cloud Container Registry에서 직접 이미지를 가져오려는 경우: 다음 주제를 참조하십시오.

개인용 레지스트리에서 이미지를 가져오도록 클러스터에 대한 권한 부여 방법 이해

레지스트리에서 이미지를 가져오기 위해 Red Hat OpenShift on IBM Cloud 클러스터는 Kubernetes 시크릿의 특수 유형인 imagePullSecret을 사용합니다. 이 이미지 가져오기 시크릿에는 컨테이너 레지스트리에 액세스하는 데 필요한 인증 정보가 저장됩니다.

컨테이너 레지스트리는 다음과 같을 수 있습니다.

  • 자체 IBM Cloud Container Registry의 개인용 네임스페이스.
  • 다른 IBM Cloud Container Registry 계정에 속한 IBM Cloud의 개인용 네임스페이스.
  • 다른 개인용 레지스트리(예: Docker).

그러나 기본적으로 클러스터는 IBM Cloud Container Registry의 계정 네임스페이스에서만 이미지를 가져오고 해당 이미지의 컨테이너를 클러스터의 default Red Hat OpenShift 프로젝트로 배치하도록 설정되어 있습니다. 클러스터의 다른 프로젝트나 다른 컨테이너 레지스트리에서 이미지를 가져와야 하는 경우 자체 이미지 풀 시크릿을 설정해야 합니다.

기본 이미지 풀 시크릿 설정

일반적으로 Red Hat OpenShift on IBM Cloud 클러스터는 default Red Hat OpenShift 프로젝트의 모든 IBM Cloud Container Registry icr.io 도메인에서만 이미지를 가져오도록 설정됩니다. 다른 Red Hat OpenShift 프로젝트나 계정에서 이미지를 가져오는 방법, 가져오기 권한 제한 설정 방법, 또는 클러스터에 기본 이미지 가져오기 시크릿이 없는 이유에 대해 자세히 알아보려면 다음 자주 묻는 질문 를 참조하십시오.

내 클러스터가 프로젝트에서 defaultRed Hat OpenShift 이미지를 가져오도록 어떻게 설정되어 있나요?
클러스터를 작성하면 해당 클러스터에는 IBM Cloud에 대한 IAM 독자 서비스 액세스 역할 정책이 제공된 IBM Cloud Container Registry IAM 서비스 ID가 있습니다. 서비스 ID 인증 정보는 클러스터의 이미지 풀 시크릿에 저장된 비만료 API 키에서 위장됩니다. 이미지 풀 시크릿은 default Kubernetes 네임스페이스와 이 Red Hat OpenShift 프로젝트의 default 서비스 계정에 있는 시크릿 목록에 추가됩니다. 이미지 풀 시크릿을 사용하면 배치에서 글로벌 및 지역 IBM Cloud Container Registry의 이미지를 가져와서(읽기 전용 액세스) default Red Hat OpenShift 프로젝트에 컨테이너를 배치할 수 있습니다.
  • 글로벌 레지스트리는 IBM이 제공한 공용 이미지를 안전하게 저장합니다. 각 지역 레지스트리에 저장된 이미지에 대해 서로 다른 참조를 가지지 않고 배치에서 이러한 공용 이미지를 참조할 수 있습니다.
  • 지역 레지스트리는 개인용 Docker 이미지를 안전하게 저장합니다.
프로젝트에 defaultRed Hat OpenShift 이미지 풀 시크릿이 없다면 어떻게 해야 하나요?
클러스터에 로그인하고 oc get secrets -n default | grep "icr-io"를 실행하여 이미지 풀 시크릿을 확인할 수 있습니다. icr 시크릿이 나열되지 않으면 클러스터를 작성한 사용자가 IAM의 IBM Cloud Container Registry에 필요한 권한을 갖고 있지 않는 것일 수 있습니다. 기존 클러스터를 업데이트하여 API 키 이미지 풀 시크릿 사용을 참조하십시오.
특정 지역 레지스트리에 대한 풀 액세스를 제한할 수 있나요?
예, 해당 지역 레지스트리 또는 네임스페이스와 같은 레지스트리 리소스에 대한 Reader 서비스 액세스 역할의 접근을 제한하는 서비스 ID의 기존 IAM 정책을 편집할 수 있습니다. 레지스트리 IAM 정책을 사용자 정의하려면 먼저 IBM Cloud에 대한 IBM Cloud Container Registry IAM 정책을 사용으로 설정해야 합니다.

레지스트리 인증 정보의 보안을 강화하시겠습니까? 클러스터 관리자에게 클러스터의 키 관리 서비스 제공자가 클러스터의 Kubernetes 시크릿(예: 레지스트리 인증 정보를 저장하는 이미지 가져오기 시크릿)을 암호화할 수 있도록 설정해 달라고 요청하십시오.

프로젝트 Red Hat OpenShift 외부의 이미지를 default 가져올 수 있나요?
기본적으로는 그렇지 않습니다. 기본 클러스터 설정을 사용하면 IBM Cloud Container Registry 네임스페이스에 저장되는 이미지에서 클러스터의 default Red Hat OpenShift 프로젝트로 컨테이너를 배치할 수 있습니다. 다른 Red Hat OpenShift 프로젝트 또는 다른 IBM Cloud 계정의 이러한 이미지를 사용하기 위해 고유 이미지 풀 시크릿을 복사하거나 작성하는 옵션이 있습니다.
다른 IBM Cloud 계정의 이미지를 가져올 수 있나요?
예. 사용할 IBM Cloud 계정에서 API 키를 작성하십시오. 그런 다음 IBM Cloud 계정에서 이미지를 가져오려는 각 클러스터의 각 프로젝트에서 API 키를 보유하는 시크릿을 작성하십시오. 자세한 정보는 권한 부여된 서비스 ID API 키를 사용하는 이 예를 따라 진행하십시오.

Docker와 같은 비IBM Cloud 레지스트리를 사용하려면 기타 개인용 레지스트리에 저장된 이미지에 액세스를 참조하십시오.

API 키는 서비스 ID용이어야 합니까? 내 계정의 서비스 ID 한도에 도달하면 어떻게 되나요?
기본 클러스터 설정은 서비스 ID를 작성하여 이미지 풀 시크릿에 IBM Cloud IAM API 키 인증 정보를 저장합니다. 그러나 개별 사용자에 대한 API 키를 작성하고 이미지 풀 시크릿에 해당 인증 정보를 저장할 수도 있습니다. 서비스 ID에 대한 IAM 한계에 도달하는 경우 클러스터가 서비스 ID 및 이미지 풀 시크릿 없이 작성되고 기본적으로 icr.io 레지스트리 도메인에서 이미지를 가져올 수 없습니다. IBM Cloud IAM 서비스 ID가 아닌 기능 ID와 같은 개별 사용자에 대한 API 키를 사용하여 고유의 이미지 풀 시크릿을 작성해야 합니다.
지역 레지스트리 도메인과 모든 레지스트리 도메인에 대한 이미지 풀 시크릿을 확인합니다. 어느 것을 사용해야 할까요?
이전에는 Red Hat OpenShift on IBM Cloud가 각 지역의 공용 icr.io 레지스트리 도메인에 대해 별도의 이미지 풀 시크릿을 작성했습니다. 이제 모든 지역의 모든 공용 및 개인용 icr.io 레지스트리 도메인은 클러스터의 all-icr-io Kubernetes 프로젝트에서 자동으로 작성되는 하나의 default 이미지 풀 시크릿에 저장됩니다.

클러스터에 있는 다른 Kubernetes 네임스페이스의 워크로드가 개인용 레지스트리에서 컨테이너 이미지를 가져오려는 경우, 이제는 해당 Kubernetes 프로젝트에 all-icr-io 이미지 풀 시크릿만 복사하면 됩니다. 그 후 서비스 계정 또는 배치에 all-icr-io 시크릿을 지정하십시오. 더 이상 이미지의 지역 레지스트리와 일치하는 이미지 풀 시크릿을 복사할 필요가 없습니다. 또한 인증이 필요하지 않은 공용 레지스트리에 대해서는 이미지 풀 시크릿이 필요하지 않다는 점에 유의하십시오.

다른 Red Hat OpenShift 프로젝트에서 이미지 풀 시크릿을 복사하거나 생성한 후에는 작업이 완료된 것인가요?
아닙니다. 작성한 시크릿을 사용하여 이미지를 가져올 수 있도록 컨테이너에 권한이 부여되어야 합니다. 사용자는 네임스페이스의 서비스 계정에 이미지 풀 시크릿을 추가하거나, 각 배치에서 해당 시크릿을 참조할 수 있습니다. 지시사항은 이미지 풀 시크릿을 사용하여 컨테이너 배치를 참조하십시오.

icr.io 레지스트리에 대한 사설 네트워크 연결

서비스 엔드포인트를 사용하도록 IBM Cloud 계정을 설정할 때 사설 네트워크 연결을 사용하여 IBM Cloud Container Registry에서 이미지를 푸시하고 가져올 수 있습니다.

프라이빗 연결을 통해 icr.io 레지스트리를 사용하도록 클러스터를 설정하려면 어떻게 해야 합니까?

  1. 인프라 IBM Cloud 계정에 가상 라우터 기능(VRF) 을 활성화하여 프라이빗 클라우드 서비스 IBM Cloud Container Registry 엔드포인트를 사용할 수 있도록 하십시오. VRF를 사용으로 설정하려면 VRF 사용을 참조하십시오. VRF가 이미 사용으로 설정되었는지 확인하려면 ibmcloud account show 명령을 사용하십시오.
  2. 서비스 엔드포인트를 사용하려면 IBM Cloud 계정을 사용으로 설정하십시오.

IBM Cloud Container Registry 자동으로 프라이빗 클라우드 서비스 엔드포인트를 사용합니다. Red Hat OpenShift on IBM Cloud 클러스터에 대한 프라이빗 클라우드 서비스 엔드포인트를 사용으로 설정할 필요가 없습니다.

기존 클러스터를 업데이트하여 API 키 이미지 풀 시크릿 사용

새 Red Hat OpenShift on IBM Cloud 클러스터는 IBM Cloud Container Registry에 액세스할 권한을 부여하기 위해 이미지 풀 시크릿에 API 키를 저장합니다. 이러한 이미지 풀 시크릿을 사용하여 icr.io 레지스트리 도메인에 저장된 이미지에서 컨테이너를 배치할 수 있습니다. 클러스터가 시크릿으로 작성되지 않은 경우 이미지 풀 시크릿을 클러스터에 추가할 수 있습니다.

시작하기 전에

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

  2. 다음 권한이 있는지 확인하십시오. IBM Cloud에 대한 Red Hat OpenShift on IBM Cloud IAM **운영자 또는 관리자 ** 플랫폼 액세스 역할. 계정 소유자가 다음 명령을 실행하여 사용자에게 해당 역할을 지정할 수 있습니다.

    ibmcloud iam user-policy-create EMAIL --service-name containers-kubernetes --roles "Administrator,Operator"
    
  3. 모든 지역 및 리소스 그룹에서 IBM Cloud에 대한 IBM Cloud Container Registry IAM 관리자 플랫폼 액세스 역할. 정책의 범위를 특정 지역 또는 리소스 그룹으로 지정할 수 없습니다. 계정 소유자가 다음 명령을 실행하여 사용자에게 해당 역할을 지정할 수 있습니다.

    비밀키가 성공적으로 생성되었는지 확인하십시오

    ibmcloud iam user-policy-create <your_user_email> --service-name container-registry --roles Administrator
    
  4. 계정이 서비스 ID 작성을 제한하는 경우에는 콘솔에서 서비스 ID 작성자 역할을 Identity and Access Management에 추가하십시오(API 또는 CLI의 iam-identity).

  5. 계정이 API 키 작성을 제한하는 경우에는 콘솔에서 사용자 API 키 작성자 역할을 Identity and Access Management에 추가하십시오(API 또는 CLI의 iam-identity).

이미지 가져오기(pull) 시크릿 업데이트

default Kubernetes 네임스페이스에서 클러스터 이미지 가져오기(pull) 시크릿을 업데이트하려는 경우

  1. 클러스터 ID를 가져오십시오.

    ibmcloud oc cluster ls
    
  2. 다음 명령을 실행하여 클러스터의 서비스 ID를 작성하고 서비스 ID에 IBM Cloud Container Registry에 대한 IAM 독자 서비스 액세스 역할을 지정하십시오. 이 명령은 또한 서비스 ID 인증 정보를 위장하는 API 키를 만들어 API 키를 클러스터의 Kubernetes 이미지 풀 시크릿에 저장합니다. 이미지 풀 시크릿은 default Red Hat OpenShift 프로젝트에 있습니다.

    ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
    

    이 명령을 실행하면 IAM 인증 정보 및 이미지 풀 시크릿의 작성이 초기화되며 완료하는 데 약간의 시간이 소요될 수 있습니다. 이미지 풀 시크릿이 작성될 때까지 IBM Cloud Container Registry icr.io 도메인에서 이미지를 가져오는 컨테이너를 배치할 수 없습니다.

  3. 이미지 가져오기 시크릿이 클러스터에 작성되었는지 확인하십시오.

    oc get secrets | grep icr-io
    

    출력 예

    all-icr-io           kubernetes.io/dockerconfigjson        1         16d
    
  4. 컨테이너 배치를 업데이트하여 icr.io 도메인 이름에서 이미지를 가져오십시오.

  5. 선택사항: 방화벽이 있는 경우 사용하는 도메인의 레지스트리 서브넷에 아웃바운드 네트워크 트래픽을 허용했는지 확인하십시오.

  6. 다음 옵션 중 하나를 사용하여 설정을 완료하십시오.

이미지 풀 시크릿을 사용하여 외부 비공개 레지스트리의 이미지에 접근하기

default 이외의 Red Hat OpenShift 프로젝트에 컨테이너를 배치하거나, 다른 IBM Cloud 계정에 저장된 이미지를 사용하거나, 외부 개인용 레지스트리에 저장된 이미지를 사용하도록 사용자 고유의 이미지 풀 시크릿을 설정하십시오. 또한, 특정 레지스트리 이미지 네임스페이스 또는 조치(예: push 또는 pull)에 대한 권한을 제한하는 IAM 액세스 정책을 적용할 자신의 고유 이미지 풀 시크릿을 작성할 수도 있습니다.

이미지 풀 시크릿을 작성한 후에는 컨테이너가 해당 시크릿을 사용하여 레지스트리에서 이미지를 가져올 수 있도록 권한을 부여받아야 합니다. 프로젝트의 서비스 계정에 이미지 풀 시크릿을 추가하거나 각 배치의 해당 시크릿을 참조할 수 있습니다. 지시사항은 이미지 풀 시크릿을 사용하여 컨테이너 배치를 참조하십시오.

이미지 풀 시크릿은 시크릿이 작성된 Red Hat OpenShift 프로젝트에만 유효합니다. 컨테이너를 배치하려는 모든 네임스페이스에 대해 이러한 단계를 반복하십시오.

시작하기 전에:

  1. IBM Cloud Container Registry에 네임스페이스를 설정하고 이 네임스페이스에 이미지를 푸시하십시오.
  2. 클러스터를 작성하십시오.
  3. Red Hat OpenShift 클러스터에 액세스하십시오.

사용자 고유의 이미지 풀 시크릿을 사용하려면 다음 옵션 중에서 선택하십시오.

이미지 풀 시크릿을 배치에 사용하려는 프로젝트에 이미 작성한 경우 작성된 imagePullSecret을 사용하여 컨테이너 배치를 참조하십시오.

기존 이미지 풀 시크릿 복사

default Red Hat OpenShift 프로젝트에 대해 자동으로 작성되는 것과 같은 이미지 풀 시크릿을 클러스터의 다른 프로젝트에 복사할 수 있습니다. 특정 프로젝트에 대한 액세스를 제한하거나 다른 IBM Cloud 계정에서 이미지를 가져오려는 경우처럼 이 프로젝트에 대해 다른 IBM Cloud IAM API 키 인증 정보를 사용하려는 경우 대신 이미지 풀 시크릿을 작성하십시오.

  1. 클러스터의 사용 가능한 Red Hat OpenShift 프로젝트를 나열하거나 사용할 프로젝트를 작성하십시오.

    oc get projects
    

    출력 예

    default          Active
    ibm-cert-store   Active
    ibm-system       Active
    kube-public      Active
    kube-system      Active
    

    프로젝트를 작성하려면

    oc new-project <project_name>
    
  2. IBM Cloud Container Registry에 대한 default Red Hat OpenShift 프로젝트에 있는 기존 이미지 풀 시크릿을 나열하십시오.

    oc get secrets -n default | grep icr-io
    

    출력 예

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. all-icr-io 프로젝트에서 선택한 프로젝트로 default 이미지 풀 시크릿을 복사하십시오. 새 이미지 풀 시크릿의 이름은 <project_name>-icr-<region>-io입니다.

    oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f -   
    
  4. 시크릿이 작성되었는지 확인하십시오.

    oc get secrets -n <project_name> | grep icr-io
    
  5. 컨테이너를 배치하려면 프로젝트의 모든 배치가 레지스트리에서 이미지를 가져올 수 있도록 프로젝트의 서비스 계정 또는 각 배치에 대해 이미지 풀 시크릿을 추가하십시오.

다른 IAM API키 인증 정보를 사용하여 이미지 풀 시크릿 작성

IBM Cloud IAM 액세스 정책을 사용자 또는 서비스 ID에 지정하여 특정 레지스트리 이미지 네임스페이스 또는 조치(예: push 또는 pull)에 대한 권한을 제한할 수 있습니다. 그런 다음 API 키를 작성하고 사용자 클러스터에 적합한 이미지 풀 시크릿에 이 레지스트리 인증 정보를 저장하십시오.

예를 들어, 다른 IBM Cloud 계정의 이미지에 액세스하려면 사용자 또는 서비스 ID의 IBM Cloud Container Registry 인증 정보를 해당 계정에 저장하는 API 키를 작성하십시오. 그런 다음 클러스터의 계정에서 각 클러스터 및 클러스터 프로젝트에 대한 이미지 풀 시크릿에 API 키 인증 정보를 저장하십시오.

다음 단계에서는 IBM Cloud IAM 서비스 ID의 인증 정보를 저장하는 API 키를 작성합니다. 서비스 ID를 사용하는 대신 IBM Cloud에 대한 IBM Cloud Container Registry IAM 서비스 액세스 정책이 있는 사용자 ID에 대한 API 키를 작성하려고 할 수 있습니다. 그러나 사용자가 기능 ID이거나 클러스터가 레지스트리에 계속 액세스할 수 있도록 사용자가 퇴사한 경우 계획이 있는지 확인하십시오.

  1. 클러스터의 사용 가능한 Red Hat OpenShift 프로젝트를 나열하거나 레지스트리 이미지에서 컨테이너를 배치하려는 경우 사용할 프로젝트를 작성하십시오.

    oc get projects
    

    출력 예

    default          Active
    ibm-cert-store   Active
    ibm-system       Active
    kube-public      Active
    kube-system      Active
    

    프로젝트를 작성하려면

    oc new-project <project_name>
    
  2. 이미지 풀 시크릿에서 IAM 정책과 API 키 인증 정보에 사용되는 클러스터에 대한 IBM Cloud IAM 서비스 ID를 작성하십시오. 클러스터 및 네임스페이스 이름을 둘 다 포함하는 것처럼 나중에 서비스 ID를 검색하는 데 도움이 되는 설명을 서비스 ID에 제공해야 합니다.

    ibmcloud iam service-id-create <cluster_name>-<project>-id --description "Service ID for IBM Cloud Container Registry in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
    
  3. IBM Cloud에 액세스 권한을 부여하는 클러스터 서비스 ID에 대한 사용자 정의 IBM Cloud Container Registry IAM 정책을 작성하십시오.

    ibmcloud iam service-policy-create <cluster_service_ID> --roles <service_access_role> --service-name container-registry [--region <IAM_region>] [--resource-type namespace --resource <registry_namespace>]
    
    cluster_service_ID
    필수. Kubernetes 클러스터에 대해 이전에 작성한 <cluster_name>-<kube_namespace>-id 서비스 ID로 대체합니다.
    --service-name container-registry
    필수. IAM 정책 대상이 IBM Cloud Container Registry가 되도록 container-registry를 입력합니다.
    --roles <service_access_role>
    필수. 서비스 ID 액세스 범위를 지정하려는 IBM Cloud Container Registry에 대해 서비스 액세스 역할을 입력하십시오. 가능한 값은 Reader, Writer, Manager입니다.
    --region <IAM_region>
    선택사항입니다. 액세스 정책을 특정 IAM 지역으로 범위 지정하려면 쉼표로 구분된 목록으로 지역을 입력합니다. 가능한 값은 global로컬 레지스트리 지역입니다.
    --resource-type namespace --resource <registry_namespace>
    선택사항입니다. 특정 IBM Cloud Container Registry 네임스페이스의 이미지로만 액세스를 제한하려면 리소스 유형에 대해 namespace를 입력하고 <registry_namespace>를 지정하십시오. 레지스트리 네임스페이스를 나열하려면 ibmcloud cr namespaces를 실행하십시오.
  4. 서비스 ID에 대한 API 키를 작성하십시오. API 키 이름을 서비스 ID와 유사하게 지정하고, 이전에 생성한 서비스 ID를 포함하세요 <cluster_name>-<kube_namespace>-id. 나중에 키를 검색하는 데 도움이 되는 설명을 API 키에 제공해야 합니다.

    ibmcloud iam service-api-key-create <cluster_name>-<project>-key <cluster_name>-<project>-id --description "API key for service ID <service_id> in Red Hat OpenShift on IBM Cloud cluster <cluster_name> project <project>"
    
  5. 이전 명령 출력에서 API 키 값을 검색하십시오.

    Please preserve the API key! It can't be retrieved after it's created.
    
    Name          <cluster_name>-<kube_namespace>-key   
    Description   key_for_registry_for_serviceid_for_kubernetes_cluster_multizone_namespace_test   
    Bound To      crn:v1:bluemix:public:iam-identity::a/1bb222bb2b33333ddd3d3333ee4ee444::serviceid:ServiceId-ff55555f-5fff-6666-g6g6-777777h7h7hh   
    Created At    2019-02-01T19:06+0000   
    API Key       i-8i88ii8jjjj9jjj99kkkkkkkkk_k9-llllll11mmm1   
    Locked        false   
    UUID          ApiKey-222nn2n2-o3o3-3o3o-4p44-oo444o44o4o4   
    
  6. 이미지 풀 시크릿을 작성하여 클러스터 프로젝트에 API 키 인증 정보를 저장하십시오. 이미지를 가져오려는 각 icr.io 도메인의 각 클러스터의 각 프로젝트에 대해 이 단계를 반복하십시오.

    oc --namespace <project> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
    
    --namespace <project>
    필수. 서비스 ID 이름에 사용한 클러스터의 Red Hat OpenShift 프로젝트를 지정합니다.
    <secret_name>
    필수. 이미지 풀 시크릿의 이름을 입력합니다.
    --docker-server <registry_URL>
    필수. URL을 레지스트리 네임스페이스가 설정된 이미지 레지스트리로 설정합니다. 사용 가능한 도메인은 로컬 도메인을 참조하십시오.
    --docker-username iamapikey
    필수. 개인용 레지스트리에 로그인하기 위한 사용자 이름을 입력합니다. IBM Cloud Container Registry를 사용하는 경우 iamapikey를 입력하십시오.
    --docker-password <token_value>
    필수. 이전에 검색한 API Key의 값을 입력하십시오.
    --docker-email <docker-email>
    필수. Docker 이메일 주소가 있는 경우 입력하십시오. 없다면 가상 이메일 주소(예: a@b.c)를 입력하십시오. 이 이메일은 Kubernetes 시크릿을 작성하는 데 필요하지만 작성 후에는 사용되지 않습니다.
  7. 시크릿이 작성되었는지 확인하십시오. 이미지 풀 시크릿을 생성한 위치로 project<project> 대체하십시오.

    oc get secrets --namespace <project>
    
  8. 컨테이너를 배치할 때 프로젝트의 팟(Pod)에서 이미지 풀 시크릿을 사용할 수 있도록 Kubernetes 서비스 계정에 이미지 풀 시크릿을 추가하십시오.

다른 개인용 레지스트리에 저장된 이미지에 액세스

개인용 레지스트리가 이미 있는 경우 레지스트리 인증 정보를 Kubernetes 이미지 풀 시크릿에 저장하고 구성 파일에서 이 시크릿을 참조해야 합니다.

시작하기 전에:

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

이미지 풀 시크릿을 작성하려면 다음을 수행하십시오.

  1. 개인용 레지스트리 인증 정보를 저장하기 위한 Kubernetes 시크릿을 작성하십시오.

    oc --namespace <project> create secret docker-registry <secret_name>  --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
    
    --namespace <project>
    필수. 시크릿을 사용하고 컨테이너를 배치하려는 클러스터의 Red Hat OpenShift 프로젝트입니다. 클러스터의 사용 가능한 프로젝트를 나열하려면 oc get projects를 실행하십시오.
    <secret_name>
    필수. 이미지 풀 시크릿에 사용하려는 이름입니다.
    --docker-server <registry_URL>
    필수. 개인용 이미지가 저장된 레지스트리에 대한 URL입니다.
    --docker-username <docker_username>
    필수. 개인용 레지스트리에 로그인하기 위한 사용자 이름입니다.
    --docker-password <token_value>
    필수. 개인용 레지스트리에 로그인하기 위한 비밀번호(예: 토큰 값)입니다.
    --docker-email <docker-email>
    필수. Docker 이메일 주소가 있는 경우 입력하십시오. 없는 경우에는 가상의 이메일 주소(예: a@b.c)를 입력하십시오. 이 이메일은 Kubernetes 시크릿을 작성하는 데 필요하지만 작성 후에는 사용되지 않습니다.
  2. 시크릿이 작성되었는지 확인하십시오. <project>를 이미지 풀 시크릿을 작성한 프로젝트의 이름으로 대체하십시오.

    oc get secrets --namespace <project>
    
  3. 이미지 풀 시크릿을 참조하는 팟(Pod)을 작성하십시오.

이미지 풀 시크릿을 사용하여 컨테이너 배치

팟(Pod) 배치에서 이미지 풀 시크릿을 정의하거나, 프로젝트의 Kubernetes 서비스 계정을 지정하지 않은 모든 배치에서 이미지 풀 시크릿을 사용할 수 있도록 Kubernetes 서비스 계정에 이미지 풀 시크릿을 저장할 수 있습니다.

이미지 가져오기(pull) 시크릿이 클러스터에서 사용되는 방식을 계획하려면 다음 옵션 중에서 선택하십시오.

  • 팟(Pod) 배치의 이미지 풀 시크릿 참조: 기본적으로 프로젝트의 팟(Pod)에 대해 레지스트리에 액세스 권한을 부여하지 않으려는 경우에는 이 옵션을 사용하십시오. 개발자는 레지스트리에 액세스해야 하는 각 팟(Pod) 배치에 이미지 풀 시크릿을 포함할 수 있습니다.
  • Kubernetes 서비스 계정에 이미지 풀 시크릿 저장: 선택한 Red Hat OpenShift 프로젝트의 모든 배치에 대해 레지스트리에 있는 이미지에 액세스 권한을 부여하려면 이 옵션을 사용하십시오. Kubernetes 서비스 계정에 이미지 풀 시크릿에 저장하려면 다음 단계를 사용하십시오.

선택한 프로젝트에 대해 Kubernetes 서비스 계정에 이미지 풀 시크릿 저장

모든 Red Hat OpenShift 프로젝트에는 default라는 이름의 Kubernetes 서비스 계정이 있습니다. 프로젝트 내에서 이미지 풀 시크릿을 이 서비스 계정에 추가하여 팟(pod)이 레지스트리에서 이미지를 가져올 수 있도록 액세스 권한을 부여할 수 있습니다. 서비스 계정을 지정하지 않은 배치는 자동으로 이 Red Hat OpenShift 프로젝트의 default 서비스 계정을 사용합니다.

  1. default 서비스 계정에 대해 이미지 풀 시크릿이 이미 존재하고 있지 않은지 확인하십시오.

    oc describe serviceaccount default -n <project_name>
    

    Image pull secrets 항목에 <none>이 표시되는 경우 이미지 풀 시크릿이 존재하지 않는 것입니다.

  2. default 서비스 계정에 이미지 풀 시크릿을 추가하십시오.

    • 이미지 가져오기(pull) 시크릿이 정의되지 않은 경우 이미지 가져오기(pull) 시크릿을 추가하기 위한 명령 예제

      oc patch -n <project_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
      
    • 이미지 가져오기(pull) 시크릿이 이미 정의된 경우 이미지 가져오기(pull) 시크릿을 추가하기 위한 명령 예제

      oc patch -n <project_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
      
  3. 이미지 풀 시크릿이 default 서비스 계정에 추가되었는지 확인하십시오.

    oc describe serviceaccount default -n <project_name>
    

    출력 예

    Name:                default
    Namespace:           <namespace_name>
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  <image_pull_secret_name>
    Mountable secrets:   default-token-sh2dx
    Tokens:              default-token-sh2dx
    Events:              <none>
    

    이미지 풀 시크릿<secret> (not found)가 표시되면 oc get secrets -n project를 실행하여 서비스 계정과 동일한 프로젝트에 이미지 풀 시크릿이 존재하는지 확인하십시오.

  4. 레지스트리에 mypod.yaml이미지**로부터 컨테이너를 배치하기 위한 **이라는 팟(pod) 구성 파일을 작성하십시오.

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod-container
          image: <region>.icr.io/<project>/<image>:<tag>
    
  5. mypod.yaml 구성 파일을 적용하여 클러스터에 팟(pod)을 작성하십시오.

    oc apply -f mypod.yaml
    

권한 있는 소프트웨어를 가져오기 위한 클러스터 설정

사용자의 사용을 위해 IBM에서 라이센스를 부여한 Helm 차트에서 패키징되는 보호된 컨테이너 이미지의 콜렉션인 권한 있는 소프트웨어를 가져오도록 Red Hat OpenShift on IBM Cloud 클러스터를 설정할 수 있습니다. 권한 있는 소프트웨어는 특수 IBM Cloud Container Registry cp.icr.io 도메인에 저장됩니다. 이 도메인에 액세스하려면 클러스터에 대한 인타이틀먼트 키로 이미지 풀 시크릿을 작성하고 이 권한 있는 소프트웨어를 배치하려는 각 프로젝트의 Kubernetes 서비스 계정에 이 이미지 풀 시크릿을 추가해야 합니다.

시작하기 전에: Red Hat OpenShift 클러스터에 액세스하십시오.

  1. 권한 있는 소프트웨어 라이브러리에 대한 권한 키를 가져오십시오.

    1. . MyIBM com 에 로그인한 후 컨테이너 소프트웨어 라이브러리 섹션으로 스크롤하세요. 라이브러리 보기를 클릭하십시오.
    2. 컨테이너 소프트웨어에 액세스 > 권한 키 페이지에서 키 복사를 클릭하십시오. 이 키는 컨테이너 소프트웨어 라이브러리에서 권한 있는 모든 소프트웨어에 대한 액세스 권한을 부여합니다.
  2. 권한 있는 컨테이너를 배치하려는 프로젝트에서 cp.icr.io 권한 있는 레지스트리에 액세스할 수 있도록 이미지 풀 시크릿을 작성하십시오. ** 값으로 이전에 검색한 **권한 키--docker-password를 사용하십시오. 자세한 정보는 다른 개인용 레지스트리에 저장된 이미지에 액세스를 참조하십시오.

    oc create secret docker-registry entitled-cp-icr-io --docker-server=cp.icr.io --docker-username=cp --docker-password=<entitlement_key> --docker-email=<docker_email> -n <project>
    
  3. 프로젝트의 컨테이너가 권한 키를 사용하여 권한 있는 이미지를 가져올 수 있도록 네임스페이스의 서비스 계정에 이미지 풀 시크릿을 추가하십시오. 자세한 정보는 이미지 가져오기 시크릿을 사용하여 컨테이너 배치를 참조하십시오.

    oc patch -n <project> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"entitled-cp-icr-io"}}]'
    
  4. 권한 있는 레지스트리에 있는 이미지로부터 컨테이너를 빌드하는 프로젝트에 팟(Pod)을 작성하십시오.

    oc run <pod_name> --image=cp.icr.io/<image_name> -n <project> --generator=run-pod/v1
    
  5. 팟(Pod)의 상태가 실행 중인지 검사하여 컨테이너가 권한 있는 이미지에서 빌드할 수 있었는지 확인하십시오.

    oc get pod <pod_name> -n <project>
    

다음에 수행할 작업이 궁금하십니까? 권한 있는 소프트웨어를 통합하는 Helm 차트가 저장되는 권한 있는 Helm 차트 저장소를 설정할 수 있습니다. 클러스터에 이미 Helm을 설치한 경우에는 helm repo add entitled https://raw.githubusercontent.com/IBM/charts/master/repo/entitled를 실행하십시오.

글로벌 풀 시크릿에 개인용 레지스트리 추가

RHEL 워커 노드

RHEL 워커 노드만 사용하는 클러스터에서는 클러스터 내 각 워커 노드가 사설 레지스트리에서 이미지를 풀링하는 데 사용할 수 있는 글로벌 이미지 풀 시크릿을 설정할 수 있습니다.

기본적으로 Red Hat OpenShift on IBM Cloud 클러스터에는 다음 레지스트리에 대한 글로벌 이미지 풀 시크릿이 있으므로 기본 Red Hat OpenShift 컴포넌트를 배치할 수 있습니다.

  • cloud.openshift.com
  • quay.io
  • registry.connect.redhat.com
  • registry.redhat.io

글로벌 풀 시크릿을 기본 Red Hat 레지스트리에 대한 인증 정보가 없는 풀 시크릿으로 바꾸지 마십시오. 그렇게 하면 OperatorHub와 같이 클러스터에 설치된 기본 Red Hat OpenShift 컴포넌트가 이러한 레지스트리에서 이미지를 가져올 수 없으므로 실패할 수 있습니다.

시작하기 전에:

개인용 레지스트리를 추가하려면 pull-secret 프로젝트에서 글로벌 openshift-config을 편집하십시오.

  1. 개인용 레지스트리에 액세스하고 디코딩된 시크릿 값을 JSON 파일에 저장하는 인증 정보를 보유하는 시크릿 값을 작성하십시오. 시크릿 값을 작성하면 인증 정보가 Base64에 자동으로 인코딩됩니다. --dry-run 옵션을 사용하면 시크릿 값만 작성하고 클러스터에 시크릿 오브젝트는 작성되지 않습니다. 그런 다음 디코딩된 시크릿 값이 JSON 파일에 저장되어 글로벌 풀 시크릿에서 추후에 사용할 수 있습니다.

    oc create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email> --dry-run=true --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > myregistryconfigjson
    
    --namespace <project>
    필수. 시크릿을 사용하고 컨테이너를 배치하려는 클러스터의 Red Hat OpenShift 프로젝트입니다. 클러스터의 사용 가능한 프로젝트를 나열하려면 oc get ns를 실행하십시오.
    <secret_name>
    필수. 이미지 풀 시크릿에 사용하려는 이름입니다.
    --docker-server <registry_URL>
    필수. 개인용 이미지가 저장된 레지스트리에 대한 URL입니다.
    --docker-username <docker_username>
    필수. 개인용 레지스트리에 로그인하기 위한 사용자 이름입니다.
    --docker-password <token_value>
    필수. 개인용 레지스트리에 로그인하기 위한 비밀번호(예: 토큰 값)입니다.
    --docker-email <docker-email>
    필수. Docker 이메일 주소가 있는 경우 입력하십시오. 없는 경우에는 가상의 이메일 주소(예: a@b.c)를 입력하십시오. 이 이메일은 Kubernetes 시크릿을 작성하는 데 필요하지만 작성 후에는 사용되지 않습니다.
    --dry-run=true
    이 옵션을 포함하면 비밀 값만 생성하고, 클러스터에 비밀 객체를 생성 및 저장하지 않습니다.
    --output="jsonpath={.data.\.dockerconfigjson}"
    Kubernetes 시크릿의 데이터 섹션에서 .dockerconfigjson 값만 가져옵니다.
    | base64 --decode > myregistryconfigjson
    로컬 myregistryconfigjson 파일로 디코딩된 시크릿 데이터를 다운로드합니다.
  2. 기본 글로벌 풀 시크릿의 디코딩된 시크릿 값을 검색하고 값을 dockerconfigjson 파일에 저장합니다.

    oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode > dockerconfigjson
    
  3. 다운로드한 개인용 레지스트리 풀 시크릿 myregistryconfigjson 파일을 기본 글로벌 풀 시크릿 dockerconfigjson 파일과 결합하십시오.

    jq -s '.[0] * .[1]' dockerconfigjson myregistryconfigjson > dockerconfigjson-merged
    
  4. 글로벌 풀 시크릿을 결합된 dockerconfigjson-merged 파일로 업데이트하십시오.

    oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=dockerconfigjson-merged
    
  5. 글로벌 풀 시크릿이 업데이트되었는지 확인하십시오. 개인용 레지스트리 및 기본 Red Hat 레지스트리가 각각 다음 명령의 출력에 있는지 확인하십시오.

    oc get secret pull-secret -n openshift-config --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
    

    출력 예

    {
        "auths": {
            "cloud.openshift.com": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "quay.io": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "registry.connect.redhat.com": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "registry.redhat.io": {
                "auth": "<encoded_string>",
                "email": "email@example.com"
            },
            "<private_registry>": {
                "username": "iamapikey",
                "password": "<encoded_string>",
                "email": "email@example.com",
                "auth": "<encoded_string>"
            }
        }
    }
    
  6. 글로벌 구성 변경사항을 적용하려면 클러스터의 모든 작업자 노드를 다시 로드하십시오.

    1. 클러스터에서 작업자 노드의 ID를 기록해 두십시오.

      ibmcloud oc worker ls -c <cluster_name_or_ID>
      
    2. 클래식 클러스터의 경우 각 작업자 노드를 다시 로드하십시오. 여러 worker node를 재로드하려면 여러 -w 옵션을 포함시키되, 서비스 중단을 방지하기 위해 앱에 필요한 만큼의 worker node가 동시에 실행되도록 충분히 남겨두어야 합니다.

      ibmcloud oc worker reload -c <cluster_name_or_ID> -w <workerID_1> -w <workerID_2>
      
    3. VPC 클러스터의 경우 각 작업자 노드를 대체하십시오. 시작하기 전에 사용자의 팟(Pod)을 다시 스케줄링하고 실행을 계속할 수 있도록 클러스터에 충분한 다른 작업자 노드가 있는지 확인하십시오.

      ibmcloud oc worker replace --cluster <cluster_name_or_ID> --worker <worker_node_ID>
      
  7. 작업자 노드가 정상 상태로 돌아오면 작업자 노드에서 글로벌 풀 시크릿이 업데이트되었는지 확인하십시오.

    1. 작업자 노드에 로그인하도록 디버깅 팟(pod)을 시작하십시오. 이전에 <node_name>에 대해 이전에 검색한 사설 IP를 사용하십시오.

      oc debug node/<node_name>
      
    2. 작업자 노드의 파일을 볼 수 있도록 루트 디렉토리를 호스트로 변경하십시오.

      chroot /host
      
    3. Docker 구성 파일에 사용자가 설정한 글로벌 풀 시크릿과 일치하는 레지스트리 인증 정보가 있는지 확인하십시오.

      vi /.docker/config.json
      

글로벌 풀 시크릿 업데이트

RHCOS 워커 노드 RHEL 워커 노드

RHCOS 워커 또는 조합 또는 RHCOS와 RHEL 워커를 사용하는 클러스터에서는 다음 단계를 완료하여 Red Hat OpenShift on IBM Cloud 클러스터에서 글로벌 풀 시크릿을 업데이트할 수 있습니다.

기본적으로 Red Hat OpenShift on IBM Cloud 클러스터에는 다음 레지스트리에 대한 글로벌 이미지 풀 시크릿이 있으므로 기본 Red Hat OpenShift 컴포넌트를 배치할 수 있습니다.

  • cloud.openshift.com
  • quay.io
  • registry.connect.redhat.com
  • registry.redhat.io

글로벌 풀 시크릿을 기본 Red Hat 레지스트리에 대한 인증 정보가 없는 풀 시크릿으로 바꾸지 마십시오. 그렇게 하면 OperatorHub와 같이 클러스터에 설치된 기본 Red Hat OpenShift 컴포넌트가 이러한 레지스트리에서 이미지를 가져올 수 없으므로 실패할 수 있습니다.

  1. 사용하려는 레지스트리에 대한 자격 증명이 있는 비밀을 만듭니다.
    oc create secret docker-registry docker-auth-secret \
    --docker-server=REGISTRY \
    --docker-username=USERNAME \
    --docker-password=PASSWORD \
    --namespace kube-system
    
  2. DaemonSet 생성하여 모든 워커 노드에 시크릿을 적용합니다.
    cat << EOF | oc create -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: update-docker-config
      namespace: kube-system
      labels:
        app: update-docker-config
    spec:
      selector:
        matchLabels:
          name: update-docker-config
      template:
        metadata:
          labels:
            name: update-docker-config
        spec:
          initContainers:
            - command: ["/bin/sh", "-c"]
              args:
                - >
                  echo "Checking if RHEL or RHCOS host";
                  [[ -s /docker-config/.docker/config.json  ]] && CONFIG_PATH=/docker-config/.docker || CONFIG_PATH=/docker-config/root/.docker;
                  echo "Backing up or restoring config.json";
                  [[ -s \$CONFIG_PATH/config.json ]] && cp \$CONFIG_PATH/config.json \$CONFIG_PATH/config.json.bak || cp \$CONFIG_PATH/config.json.bak \$CONFIG_PATH/config.json;
                  echo "Merging secret with config.json";
                  /host/usr/bin/jq -s '.[0] * .[1]' \$CONFIG_PATH/config.json /auth/.dockerconfigjson > \$CONFIG_PATH/config.tmp;
                  mv \$CONFIG_PATH/config.tmp \$CONFIG_PATH/config.json;
                  echo "Sending signal to reload crio config";
                  pidof crio;
                  kill -1 \$(pidof crio)
              image: icr.io/ibm/alpine:latest
              imagePullPolicy: IfNotPresent
              name: updater
              resources: {}
              securityContext:
                privileged: true
              volumeMounts:
                - name: docker-auth-secret
                  mountPath: /auth
                - name: docker
                  mountPath: /docker-config
                - name: bin
                  mountPath: /host/usr/bin
                - name: lib64
                  mountPath: /lib64
          containers:
            - resources:
                requests:
                  cpu: 0.01
              image: icr.io/ibm/alpine:latest
              name: sleepforever
              command: ["/bin/sh", "-c"]
              args:
                - >
                  while true; do
                    sleep 100000;
                  done
          hostPID: true
          volumes:
            - name: docker-auth-secret
              secret:
                secretName: docker-auth-secret
            - name: docker
              hostPath:
                path: /
            - name: bin
              hostPath:
                path: /usr/bin
            - name: lib64
              hostPath:
                path: /lib64
                hostPathType: Directory
    EOF
    
  3. 포드가 실행 중인지 확인하십시오.
    oc get daemonset -n kube-system update-docker-config
    

IBM Cloud Kubernetes Service containerd 사용자 정의 레지스트리 구성 업데이트

Kubernetes 버전 1.22 이상에서는 작업자 노드에서 containerd 구성 파일을 사용하여 컨테이너 레지스트리에서 가져오기를 구성할 수 있습니다. daemonset를 사용하여 클러스터의 모든 노드에서 구성을 업데이트할 수 있습니다. 이는 작업자 노드가 다시 로드되거나 새 작업자가 추가될 때 구성이 삭제되지 않도록 합니다.

containerd 사용자 정의 레지스트리 구성을 업데이트하는 daemonset의 예

예제 YAML 파일을 통해 모든 작업자 노드에서 실행되는 daemonset를 정의하여 containerd 레지스트리 호스트 구성을 설정하거나 업데이트하고 해당 containerd 레지스트리 경로에 마운트하십시오.

이 예에서는 dockerhub에 대해 다음 레지스트리 호스트 구성을 설정합니다. 이 레지스트리 호스트 구성은 이미 제공되었으며 작업자 프로비저닝 단계 중에 자동으로 구성됩니다. 컨테이너는 init 배포 후 및 워커 노드 재로드 또는 재시작 후 각 워커 노드에서 hosts.toml 초기화됩니다.

server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]

예제 YAML 파일:

apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
    name: containerd-dockerhub-registry-config
name: containerd-dockerhub-registry-config
namespace: kube-system
spec:
selector:
    matchLabels:
    name: containerd-dockerhub-registry-config
template:
    metadata:
    labels:
        name: containerd-dockerhub-registry-config
    spec:
    initContainers:
    - image: alpine:3.13.6
        name: containerd-dockerhub-registry-config
        command:
        - /bin/sh
        - -c
        - |
            #!/bin/sh
            set -uo pipefail
            cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
            server = "https://docker.io"
            [host."https://registry-1.docker.io"]
            capabilities = ["pull", "resolve"]
            EOF
        volumeMounts:
        - mountPath: /etc/containerd/certs.d/docker.io/
        name: dockerhub-registry-config
    containers:
    - name: pause
        image: "us.icr.io/armada-master/pause:3.5"
        imagePullPolicy: IfNotPresent
    volumes:
    - name: dockerhub-registry-config
        hostPath:
        path: /etc/containerd/certs.d/docker.io/

containerd 레지스트리 호스트 구성 업데이트에 대한 자세한 정보는 containerd 문서를 참조하십시오.