이미지 레지스트리 설정

개발자가 Docker 이미지를 사용하여 IBM Cloud® Kubernetes Service에 앱 컨테이너를 작성할 수 있도록 이미지 레지스트리를 계획하고 설정하십시오.

이미지 레지스트리 계획

일반적으로 이미지는 공용으로 액세스 가능한 레지스트리(공용 레지스트리) 또는 소규모의 사용자 그룹에 대해 제한된 액세스를 제공하는 레지스트리(개인용 레지스트리)에 저장됩니다.

공용 레지스트리(예: Docker Hub)를 사용하여 Docker 및 Kubernetes를 시작하여 클러스터에서 첫 번째 컨테이너화된 앱을 작성할 수 있습니다. 그러나 엔터프라이즈 애플리케이션인 경우에는 IBM Cloud Container Registry에 제공된 레지스트리와 같은 개인용 레지스트리를 사용하여 권한 없는 사용자가 이미지를 사용하고 변경하지 못하도록 보호하십시오. 개인용 레지스트리에 액세스하기 위한 인증 정보를 클러스터 사용자가 사용할 수 있도록 보장하기 위해, 개인용 레지스트리는 클러스터 관리자에 의해 설정되어야 합니다.

IBM Cloud Kubernetes Service에서 다중 레지스트리를 사용하여 클러스터에 앱을 배치할 수 있습니다.

공용 및 개인용 이미지 레지스트리 옵션
레지스트리 설명 이점
IBM Cloud Container Registry 이 옵션을 사용하면 이미지를 안전하게 저장하고 이를 클러스터 사용자 간에 공유할 수 있는 IBM Cloud Container Registry의 사용자 고유의 보안 Docker 이미지 저장소를 설정할 수 있습니다.
  • 계정의 이미지에 대한 액세스 권한을 관리합니다.
  • IBM 제공 이미지 및 샘플 앱(예: IBM Liberty)을 상위 이미지로 사용하고 사용자 고유 앱 코드를 추가합니다.
  • 취약성을 수정하기 위한 OS별 권장사항을 포함하여 취약성 어드바이저가 잠재적 취약성이 있는지 이미지를 자동으로 스캔합니다.
기타 개인용 레지스트리 이미지 풀 시크릿을 생성하여 기존 사설 레지스트리를 클러스터에 연결하세요. 시크릿은 Kubernetes 시크릿에 레지스트리 URL과 인증 정보를 안전하게 저장하는 데 사용됩니다. 자체 소스(Docker Hub, 조직이 소유하는 레지스트리 또는 기타 프라이빗 클라우드 레지스트리)와는 무관하게 기존 개인용 레지스트리를 사용합니다.
공개 Docker 허브 Dockerfile을 수정할 필요가 없는 경우, 이 옵션을 사용하여 Docker Hub에 있는 기존 공개 이미지를 Kubernetes 배포 환경에 직접 활용할 수 있습니다. 참고: 이 옵션이 조직의 보안 요구사항을 충족하지 않을 수 있음을 유념하십시오(예: 액세스 관리, 취약성 스캐닝 또는 앱 개인정보 보호정책).

클러스터에 추가 설정이 필요하지 않습니다.

  • 다양한 오픈 소스 애플리케이션을 포함합니다.

이미지 레지스트리를 설정한 후에 클러스터 사용자는 클러스터에 자신의 앱 배치를 위한 이미지를 사용할 수 있습니다.

컨테이너 이미지에 대해 작업하는 경우 개인 정보 보호에 대해 자세히 알아보십시오.

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

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

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

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

그러나 기본적으로 클러스터는 IBM Cloud Container Registry에 있는 계정의 네임스페이스에서만 이미지를 가져오고 이 이미지의 컨테이너를 클러스터의 default Kubernetes 네임스페이스에 배치하도록 설정됩니다. 클러스터의 기타 Kubernetes 네임스페이스 또는 기타 컨테이너 레지스트리에서 이미지를 가져와야 하는 경우 고유 이미지 가져오기 시크릿을 설정해야 합니다.

기본 이미지 풀 시크릿 설정

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

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

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

default 이외의 Kubernetes 네임스페이스에 있는 이미지를 가져올 수 있나요?
기본적으로는 그렇지 않습니다. 기본 클러스터 설정을 사용하여 IBM Cloud Container Registry 네임스페이스에 저장된 이미지의 컨테이너를 클러스터의 default Kubernetes 네임스페이스에 배치할 수 있습니다. 다른 Kubernetes 네임스페이스 또는 다른 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 키를 사용하여 고유의 이미지 풀 시크릿을 작성해야 합니다.
지역 레지스트리 도메인과 모든 레지스트리 도메인에 대한 이미지 가져오기 시크릿이 표시됩니다. 어느 것을 사용해야 할까요?
이전에 IBM Cloud Kubernetes Service는 각 지역 공용 icr.io 레지스트리 도메인에 대한 개별 이미지 가져오기 시크릿을 작성했습니다. 이제 모든 지역에 대한 모든 공용 및 개인용 icr.io 레지스트리 도메인이 클러스터의 all-icr-io Kubernetes 네임스페이스에서 자동으로 작성된 단일 default 이미지 가져오기 시크릿에 저장됩니다.

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

다른 Kubernetes 네임스페이스에서 이미지 풀 시크릿을 복사하거나 생성한 후에는 모든 작업이 끝난 것입니까?
아닙니다. 작성한 시크릿을 사용하여 이미지를 가져올 수 있도록 컨테이너에 권한이 부여되어야 합니다. 사용자는 네임스페이스의 서비스 계정에 이미지 풀 시크릿을 추가하거나, 각 배치에서 해당 시크릿을 참조할 수 있습니다. 지시사항은 이미지 풀 시크릿을 사용하여 컨테이너 배치를 참조하십시오.

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 프라이빗 클라우드 서비스 엔드포인트를 자동으로 사용합니다. IBM Cloud Kubernetes Service 클러스터에 대한 프라이빗 클라우드 서비스 엔드포인트를 사용으로 설정할 필요가 없습니다.

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

새 IBM Cloud Kubernetes Service 클러스터는 IBM Cloud Container Registry에 액세스할 권한을 부여하기 위해 이미지 가져오기 시크릿에 API 키를 저장합니다. 이러한 이미지 풀 시크릿을 사용하여 icr.io 레지스트리 도메인에 저장된 이미지에서 컨테이너를 배치할 수 있습니다. 클러스터가 시크릿으로 작성되지 않은 경우 이미지 풀 시크릿을 클러스터에 추가할 수 있습니다. 2019년 2월 25일전에 작성된 클러스터의 경우, 이미지 가져오기 시크릿에 레지스트리 토큰 대신 API 키를 저장하도록 클러스터를 업데이트해야 합니다.

시작하기 전에

  1. 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

  2. IBM Cloud에 대한 IBM Cloud Kubernetes Service 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 ks cluster ls
    
  2. 다음 명령을 실행하여 클러스터의 서비스 ID를 작성하고 서비스 ID에 IBM Cloud Container Registry에 대한 IAM 독자 서비스 액세스 역할을 지정하십시오. 이 명령은 또한 서비스 ID 인증 정보를 위장하는 API 키를 만들어 API 키를 클러스터의 Kubernetes 이미지 풀 시크릿에 저장합니다. 이미지 가져오기 시크릿은 default Kubernetes 네임스페이스에 있습니다.

    ibmcloud ks cluster pull-secret apply --cluster CLUSTER_NAME_OR_ID
    

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

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

    kubectl get secrets | grep icr-io
    

    출력 예

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

  5. 선택 사항: 방화벽을 사용 중인 경우, 사용 중인 도메인의 레지스트리 서브넷으로의 아웃바운드 네트워크 트래픽이 허용되도록 설정하십시오.

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

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

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

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

이미지 가져오기 시크릿은 사용하도록 지정된 Kubernetes 네임스페이스에만 유효합니다. 컨테이너를 배치하려는 모든 네임스페이스에 대해 이러한 단계를 반복하십시오. DockerHub의 이미지에는 이미지 가져오기(pull) 시크릿이 필요하지 않습니다.

시작하기 전에:

  1. IBM Cloud Container Registry에 네임스페이스를 설정하고 이 네임스페이스에 이미지를 푸시하십시오.
  2. 클러스터를 작성하십시오.
  3. 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

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

배치에 사용할 이미지 가져오기 시크릿을 네임스페이스에 이미 작성한 경우에는 작성된 imagePullSecret을 사용하여 컨테이너 배치를 참조하십시오.

기존 이미지 풀 시크릿 복사

default Kubernetes 네임스페이스에 대해 자동으로 작성된 것과 같은 이미지 가져오기 시크릿을 클러스터 내의 다른 네임스페이스로 복사할 수 있습니다. 예를 들어, 특정 네임스페이스에 대한 액세스를 제한하거나 다른 IBM Cloud 계정에서 이미지를 가져오기 위해 이 네임스페이스에 대해 다른 IBM Cloud IAM API 키 인증 정보를 사용하려면 대신 이미지 가져오기 시크릿을 작성하십시오.

  1. 클러스터에서 사용 가능한 Kubernetes 네임스페이스를 나열하거나 사용할 네임스페이스를 작성하십시오.

    kubectl get namespaces
    

    출력 예

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

    네임스페이스를 작성하려는 경우

    kubectl create namespace <namespace_name>
    
  2. IBM Cloud Container Registry의 default Kubernetes 네임스페이스에 있는 기존 이미지 가져오기 시크릿을 나열하십시오.

    kubectl get secrets -n default | grep icr-io
    

    출력 예

    all-icr-io          kubernetes.io/dockerconfigjson        1         16d
    
  3. all-icr-io 네임스페이스의 default 이미지 가져오기 시크릿을 선택한 네임스페이스로 복사하십시오. 새 이미지 풀 시크릿의 이름은 <namespace_name>-icr-<region>-io입니다.

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

    kubectl get secrets -n <namespace_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. 클러스터에서 사용 가능한 Kubernetes 네임스페이스를 나열하거나 레지스트리 이미지에서 컨테이너를 배치할 위치에서 사용할 네임스페이스를 작성하십시오.

    kubectl get namespaces
    

    출력 예

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

    네임스페이스를 작성하려는 경우

    kubectl create namespace <namespace_name>
    
  2. 이미지 풀 시크릿에서 IAM 정책과 API 키 인증 정보에 사용되는 클러스터에 대한 IBM Cloud IAM 서비스 ID를 작성하십시오. 서비스 ID에 나중에 검색하는 데 도움이 되는 설명(예: 클러스터 및 네임스페이스 이름 포함)을 제공했는지 확인하십시오.

    ibmcloud iam service-id-create <cluster_name>-<namespace>-id --description "Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>"
    
  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 키를 작성하십시오. 서비스 ID와 유사한 API 키의 이름을 지정하고 이전에 작성한 서비스 ID(<cluster_name>-<kube_namespace>-id)를 포함시키십시오. 나중에 키를 검색하는 데 도움이 되는 설명을 API 키에 제공해야 합니다.

    ibmcloud iam service-api-key-create <cluster_name>-<namespace>-key <cluster_name>-<namespace>-id --description "API key for service ID <service_id> in Kubernetes cluster <cluster_name> namespace <namespace>"
    
  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 도메인마다 클러스터의 각 네임스페이스에 대해 이 단계를 반복하십시오.

    kubectl --namespace <namespace> create secret docker-registry <secret_name> --docker-server=<registry_URL> --docker-username=iamapikey --docker-password=<api_key_value> --docker-email=<docker_email>
    
    --namespace <namespace>
    필수. 서비스 ID 이름에 사용한 클러스터의 Kubernetes 네임스페이스를 지정합니다.
    <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. 시크릿이 작성되었는지 확인하십시오. <namespace> 을 이미지 풀 시크릿을 생성한 namespace 으로 대체하십시오.

    kubectl get secrets --namespace <namespace>
    
  8. 컨테이너를 배치할 때 네임스페이스의 모든 팟(Pod)에서 이미지 가져오기 시크릿을 사용할 수 있도록 Kubernetes 서비스 계정에 이미지 가져오기 시크릿을 추가하십시오.

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

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

시작하기 전에:

  1. 클러스터를 작성하십시오.
  2. 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

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

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

    kubectl --namespace <namespace> create secret docker-registry <secret_name>  --docker-server=<registry_URL> --docker-username=<docker_username> --docker-password=<docker_password> --docker-email=<docker_email>
    
    --namespace <namespace>
    필수. 시크릿을 사용하고 컨테이너를 배치하려는 클러스터의 Kubernetes 네임스페이스입니다. 클러스터에서 사용 가능한 네임스페이스를 나열하려면 kubectl get namespaces를 실행하십시오.
    <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. 시크릿이 작성되었는지 확인하십시오. <namespace>을(를) 이미지 가져오기 시크릿을 작성한 네임스페이스의 이름으로 바꾸십시오.

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

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

팟 배치에서 이미지 가져오기 시크릿을 정의하거나, 네임스페이스에 Kubernetes 서비스 계정을 지정하지 않은 모든 배치에서 사용할 수 있도록 Kubernetes 서비스 계정에 이미지 가져오기 시크릿을 저장할 수 있습니다.

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

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

선택한 네임스페이스의 Kubernetes 서비스 계정에 이미지 가져오기 시크릿 저장

모든 Kubernetes 네임스페이스에는 default라는 Kubernetes 서비스 계정이 있습니다. 네임스페이스 내에서 이 서비스 계정에 이미지 가져오기 시크릿을 추가하여 레지스트리에서 이미지를 가져오도록 팟(Pod)에 대한 액세스 권한을 부여할 수 있습니다. 서비스 계정을 지정하지 않는 배치에서는 이 Kubernetes 네임스페이스에 대한 default 서비스 계정을 자동으로 사용합니다.

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

    kubectl describe serviceaccount default -n <namespace_name>
    

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

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

    • 이미지 가져오기(pull) 시크릿이 정의되지 않은 경우 이미지 가져오기(pull) 시크릿을 추가하기 위한 명령 예제
        kubectl patch -n <namespace_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'
        ```
    - 이미지 가져오기(pull) 시크릿이 이미 정의된 경우 이미지 가져오기(pull) 시크릿을 추가하기 위한 명령 예제
    
    ```sh {: pre}
        kubectl patch -n <namespace_name> serviceaccount/default --type='json' -p='[{"op":"add","path":"/imagePullSecrets/-","value":{"name":"<image_pull_secret_name>"}}]'
        ```
    
  3. 이미지 풀 시크릿이 default 서비스 계정에 추가되었는지 확인하십시오.

    kubectl describe serviceaccount default -n <namespace_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)이(가) 표시되면 kubectl get secrets -n namespace을(를) 실행하여 서비스 계정과 동일한 네임스페이스에 이미지 가져오기 시크릿이 있는지 확인하십시오.

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

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

    kubectl apply -f mypod.yaml
    

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

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

시작하기 전에: 계정에 로그인하십시오. If applicable, target the appropriate resource group. 클러스터에 대한 컨텍스트를 설정하십시오.

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

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

    kubectl 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 <namespace>
    
  3. 네임스페이스의 컨테이너가 권한 키를 사용하여 권한 있는 이미지 가져오기 시크릿을 가져올 수 있도록 이미지를 네임스페이스의 서비스 계정에 추가하십시오. 자세한 정보는 이미지 가져오기 시크릿을 사용하여 컨테이너 배치를 참조하십시오.

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

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

    kubectl get pod <pod_name> -n <namespace>
    

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

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 문서를 참조하십시오.