IBM Cloud Docs
ImagePullBackOff 또는 인증 오류로 인해 이미지를 레지스트리에서 가져오지 못하는 이유는 무엇입니까?

ImagePullBackOff 또는 인증 오류로 인해 이미지를 레지스트리에서 가져오지 못하는 이유는 무엇입니까?

가상 프라이빗 클라우드 클래식 인프라

IBM Cloud Container Registry에서 이미지를 가져오는 워크로드를 배치할 때 팟(Pod)에 오류가 발생하며 ImagePullBackOff 상태가 됩니다.

kubectl get pods
NAME         READY     STATUS             RESTARTS   AGE
<pod_name>   0/1       ImagePullBackOff   0          2m

팟(Pod)을 설명할 때 다음과 유사한 인증 오류가 발생합니다.

kubectl describe pod <pod_name>
Failed to pull image "<region>.icr.io/<namespace>/<image>:<tag>" ... unauthorized: authentication required
Failed to pull image "<region>.icr.io/<namespace>/<image>:<tag>" ... 401 Unauthorized
Failed to pull image "registry.ng.bluemix.net/<namespace>/<image>:<tag>" ... unauthorized: authentication required
Failed to pull image "registry.ng.bluemix.net/<namespace>/<image>:<tag>" ... 401 Unauthorized
...
Failed to pull image "<image>:<tag>" ... Manifest for <image>:<tag> not found

클러스터는 이미지 풀 시크릿 에 저장된 API키를 사용하여 클러스터가 IBM Cloud Container Registry에서 이미지를 가져올 수 있도록 권한을 부여하거나 특정 태그가 있는 이미지가 저장소에 없습니다.

기본적으로 새 클러스터에는 API 키를 사용하여 클러스터가 icr.io Kubernetes 네임스페이스에 배치된 컨테이너의 모든 지역 default 레지스트리에서 이미지를 가져올 수 있도록 하는 이미지 가져오기 시크릿이 있습니다.

  1. 배치 YAML 파일에서 이미지의 올바른 이름 및 태그를 사용하는지 확인하십시오.

    ibmcloud cr images
    
  2. 풀 트래픽 및 스토리지 할당량을 확인하십시오. 한계에 도달하면 사용된 스토리지를 비우거나 할당량을 늘리도록 레지스트리 관리자에게 요청하십시오.

    ibmcloud cr quota
    
  3. 장애가 발생한 팟(Pod)의 팟(Pod) 구성 파일을 가져오고 imagePullSecrets 섹션을 찾으십시오.

    kubectl get pod <pod_name> -o yaml
    

    출력 예

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. 이미지 가져오기 시크릿이 나열되어 있지 않은 경우, 네임스페이스에 이미지 가져오기 시크릿을 설정하십시오.

    1. default 네임스페이스에는 사용할 지역 레지스트리마다 icr-io 이미지 가져오기 시크릿이 있는지 확인하십시오. icr-io 시크릿이 네임스페이스에 나열되지 않으면 ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> 명령을 사용하여 default 네임스페이스에서 이미지 풀 시크릿을 작성하십시오.
      kubectl get secrets -n default | grep "icr-io"
      
    2. all-icr-io 이미지 가져오기 시크릿을 default Kubernetes 네임스페이스에서 워크로드를 배치할 네임스페이스로 복사하십시오.
    3. 네임스페이스의 모든 팟(Pod)이 이미지 가져오기 시크릿 인증 정보를 사용할 수 있도록 이미지 가져오기 시크릿을 이 Kubernetes 네임스페이스의 서비스 계정에 추가하십시오.
  5. 팟(Pod)에 이미지 풀 시크릿이 나열되어 있는 경우, IBM Cloud Container Registry에 액세스하는 데 사용하는 인증 정보 유형을 판별하십시오.

API 키를 사용하는 이미지 풀 시크릿 문제점 해결

팟(Pod) 구성에 API 키를 사용하는 이미지 풀 시크릿이 있는 경우, API 키 인증 정보가 올바르게 설정되어 있는지 확인합니다.

다음 단계에서는 API 키가 서비스 ID의 인증 정보를 저장한다고 가정합니다. 개별 사용자의 API 키를 사용하기 위해 이미지 풀 시크릿을 설정한 경우에는 해당 사용자의 IBM Cloud IAM 권한과 인증 정보를 확인해야 합니다.

  1. 설명을 검토하여 API 키가 이미지 풀 시크릿에 사용하는 서비스 ID를 찾으십시오. 클러스터로 작성된 서비스 ID의 이름은 cluster-<cluster_ID>이고 default Kubernetes 네임스페이스에서 사용됩니다. 다른 Kubernetes 네임스페이스에 액세스하거나 IBM Cloud IAM 권한을 수정하는 등 다른 서비스 ID를 작성한 경우 설명을 사용자 정의했습니다.

    ibmcloud iam service-ids
    

    출력 예

    UUID                Name               Created At              Last Updated            Description                                                                                                                                                                                         Locked
    ServiceId-aa11...   <service_ID_name>  2019-02-01T19:01+0000   2019-02-01T19:01+0000   ID for <cluster_name>                                                                                                                                         false
    ServiceId-bb22...   <service_ID_name>  2019-02-01T19:01+0000   2019-02-01T19:01+0000   Service ID for IBM Cloud Container Registry in Kubernetes cluster <cluster_name> namespace <namespace>                                                                                                                                         false
    
  2. 서비스 ID에 IBM Cloud IAM 독자 이상의 IBM Cloud Container Registry에 대한 서비스 액세스 역할 정책이 지정되었는지 확인하십시오. 서비스 ID에 독자 서비스 액세스 역할이 없으면 IAM 정책을 편집하십시오. 정책이 올바른 경우 다음 단계를 계속하여 인증 정보가 올바른지 확인하십시오.

    ibmcloud iam service-policies <service_ID_name>
    

    출력 예

    Policy ID:   a111a111-b22b-333c-d4dd-e555555555e5
    Roles:       Reader
    Resources:
                  Service Name       container-registry
                  Service Instance
                  Region
                  Resource Type      namespace
                  Resource           <registry_namespace>
    
  3. 이미지 풀 보안 인증 정보가 올바른지 확인하십시오.

    1. 이미지 풀 시크릿 구성을 가져오십시오. 팟 (Pod) 이 default 네임스페이스에 없는 경우 -n 옵션을 포함하십시오.

      kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>]
      
    2. 출력에서 .dockerconfigjson 필드의 base64 인코딩된 값을 복사하십시오.

      apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: eyJyZWdp...==
      ...
      
    3. base64 문자열을 디코딩하십시오. 예를 들어, OS X에서 다음 명령을 실행할 수 있습니다.

      echo -n "<base64_string>" | base64 --decode
      

      출력 예

      {"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}}
      
    4. 이미지 풀 시크릿 지역 레지스트리 도메인 이름을 컨테이너 이미지에 지정한 도메인 이름과 비교하십시오. 기본적으로 새 클러스터에는 default Kubernetes 네임스페이스에서 실행되는 컨테이너의 각 지역 레지스트리 도메인 이름에 대한 이미지 가져오기 시크릿이 포함되어 있습니다. 그러나 기본 설정을 수정했거나 다른 Kubernetes 네임스페이스를 사용하는 경우에는 지역 레지스트리에 대힌 이미지 가져오기 시크릿이 없을 수 있습니다. 지역 레지스트리 도메인 이름에 필요한 이미지 풀 시크릿을 복사하십시오.

    5. 이미지 풀 시크릿의 usernamepassword를 사용하여 로컬 머신에서 해당 레지스트리에 로그인하십시오. 로그인할 수 없는 경우 서비스 ID를 수정해야 할 수도 있습니다.

      docker login -u iamapikey -p <password_string> <region>.icr.io
      
      1. 클러스터 서비스 ID, IBM Cloud IAM 정책, API 키 및 default Kubernetes 네임스페이스에서 실행되는 이미지 가져오기 시크릿을 다시 작성하십시오.
        ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. default Kubernetes 네임스페이스에서 배치를 다시 작성하십시오. 권한 오류 메시지가 계속 표시되면 새 이미지 풀 시크릿을 사용하여 1-5단계를 반복하십시오. 여전히 로그인할 수 없는 경우 IBM Cloud 지원 케이스를 여십시오.
    6. 로그인에 성공하면 로컬로 이미지를 가져오십시오. 명령이 실패하고 access denied 오류 메시지가 표시되는 경우 레지스트리 계정은 클러스터가 있는 계정과 다른 IBM Cloud 계정에 있습니다. 다른 계정의 이미지에 액세스하는 이미지 풀 시크릿을 작성하십시오. 이미지를 로컬 시스템으로 가져올 수 있는 경우 API키에 올바른 권한이 있지만 클러스터의 API 설정이 올바르지 않습니다.

      docker pull <region>icr.io/<namespace>/<image>:<tag>
      
    7. 배치가 사용하는 서비스 계정에서 또는 배치에서 가져오기(pull) 시크릿이 직접 참조되는지 확인하십시오. 여전히 문제를 해결할 수 없는 경우 지원 센터에 문의하십시오.