Por que as imagens falham ao serem extraídas do registro com ImagePullBackOff ou erros de autorização?

Nuvem privada virtual Infraestrutura clássica

Quando você implementa uma carga de trabalho que extrai uma imagem do IBM Cloud Container Registry, seus pods falham com um status ImagePullBackOff.

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

Quando você descreve o pod, você vê erros de autenticação semelhantes ao seguinte.

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 "<image>:<tag>" ... Manifest for <image>:<tag> not found

Seu cluster usa uma chave de API que é armazenada em um segredo de extração de imagem para autorizar o cluster a extrair imagens de IBM Cloud Container Registry, ou a imagem com a tag específica não existe no repositório.

Por padrão, novos clusters possuem segredos de pull de imagem que usam chaves de API para que o cluster possa fazer pull de imagens de qualquer registro regional icr.io para contêineres implementados no namespace do Kubernetes default.

  1. Verifique se você usa o nome correto e a tag da imagem em seu arquivo YAML de implementação.

    ibmcloud cr images
    
  2. Verifique seu tráfego de pull e de armazenamento de armazenamento. Se o limite for atingido, libere o armazenamento usado ou peça ao administrador de registro para aumentar a cota.

    ibmcloud cr quota
    
  3. Obtenha o arquivo de configuração de pod de um pod com falha, e procure a seção imagePullSecrets.

    kubectl get pod <pod_name> -o yaml
    

    Saída de exemplo

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. Se nenhuma imagem de extração de imagem estiver listada, configure o segredo de extração da imagem em seu namespace.

    1. Verifique se o namespace default tem os segredos de pull de imagem icr-io para cada registro regional que você deseja usar. Se nenhum segredo icr-io estiver listado no espaço de nomes, use o comando ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> para criar os segredos de extração de imagem no espaço de nomes default.
      kubectl get secrets -n default | grep "icr-io"
      
    2. Copie o segredo de extração de imagem all-icr-io do namespace default do Kubernetes para o namespace no qual você deseja implementar sua carga de trabalho.
    3. Inclua o segredo de extração de imagem na conta de serviço para esse namespace do Kubernetes para que todos os pods no namespace possam usar as credenciais secretas de extração de imagem.
  5. Se os segredos de pull da imagem forem listados no pod, determine qual tipo de credenciais você usa para acessar o IBM Cloud Container Registry.

Resolução de problemas de segredos de extração de imagem que usam chaves de API

Se a configuração do pod tiver um segredo de extração de imagem que usa uma chave de API, verifique se as credenciais da chave de API estão configuradas corretamente.

As etapas a seguir assumem que a chave de API armazena as credenciais de um ID de serviço. Se você configurar seu segredo de extração de imagem para usar uma chave de API de um usuário individual, deverá verificar as permissões e as credenciais do usuário do IBM Cloud IAM.

  1. Localize o ID de serviço que a chave de API usa para o segredo de extração da imagem, revisando a Descrição. O ID de serviço que é criado com o cluster é denominado cluster-<cluster_ID> e é usado no espaço de nomes default Kubernetes. Se você criou outro ID de serviço, como para acessar um namespace do Kubernetes diferente ou para modificar as permissões do IBM Cloud IAM, você customizou a descrição.

    ibmcloud iam service-ids
    

    Saída de exemplo

    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. Verifique se é designado ao ID de serviço pelo menos uma **política de função de acesso de serviço de **Leitor do IBM Cloud IAM para o IBM Cloud Container Registry. Se o ID de serviço não tiver a função de acesso de serviço Leitor, edite as políticas do IAM. Se as políticas estiverem corretas, continue com a próxima etapa para ver se as credenciais são válidas.

    ibmcloud iam service-policies <service_ID_name>
    

    Saída de exemplo

    Policy ID:   a111a111-b22b-333c-d4dd-e555555555e5
    Roles:       Reader
    Resources:
                  Service Name       container-registry
                  Service Instance
                  Region
                  Resource Type      namespace
                  Resource           <registry_namespace>
    
  3. Verifique se as credenciais do segredo de extração de imagem são válidas.

    1. Obtenha a configuração de segredo de extração de imagem. Se o pod não estiver no namespace default, inclua a opção -n.

      kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>]
      
    2. Na saída, copie o valor codificado em base64 do campo .dockerconfigjson.

      apiVersion: v1
      kind: Secret
      data:
        .dockerconfigjson: eyJyZWdp...==
      ...
      
    3. Decode a sequência base64. Por exemplo, no OS X, é possível executar o comando a seguir.

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

      Saída de exemplo

      {"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}}
      
    4. Compare o nome do domínio do registro regional de extração de imagem com o nome de domínio que você especificou na imagem do contêiner. Por padrão, os novos clusters têm segredos de extração de imagem para cada nome de domínio de registro regional para contêineres que são executados no namespace default do Kubernetes. No entanto, se você modificou as configurações padrão ou está usando um namespace diferente do Kubernetes, talvez você não tenha um segredo de extração de imagem para o registro regional. Copie um segredo de extração de imagem para o nome de domínio do registro regional.

    5. Efetue login no registro por meio de sua máquina local usando o username e a password de seu segredo de extração de imagem. Se não for possível efetuar login, talvez seja necessário corrigir o ID do serviço.

      docker login -u iamapikey -p <password_string> <region>.icr.io
      
      1. Recrie o ID do serviço de cluster, as políticas do IBM Cloud IAM, a chave de API e os segredos de extração de imagem para contêineres que são executados no namespace default do Kubernetes.
        ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. Recrie a sua implementação no namespace default do Kubernetes. Se você ainda vir uma mensagem de erro de autorização, repita as Etapas 1-5 com a nova imagem pull de segredos. Se ainda não for possível efetuar login, abra um caso de suporte da IBM Cloud.
    6. Se o login for bem-sucedido, puxe uma imagem localmente. Se o comando falhar com um erro access denied, a conta de registro estará em uma conta do IBM Cloud diferente daquela na qual seu cluster está. Crie um segredo de extração de imagem para acessar imagens na outra conta. Se você consegue baixar uma imagem para o seu computador, isso significa que sua chave de API possui as permissões corretas, mas a configuração da API no seu cluster não está correta.

      docker pull <region>icr.io/<namespace>/<image>:<tag>
      
    7. Verifique se o segredo de extração é referenciado diretamente por meio da implementação ou da conta de serviço usada pela implementação. Se você ainda não resolveu o problema, entre em contato com o suporte.