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.

oc 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.

oc 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, os novos clusters têm segredos de extração de imagem que usam chaves de API para que o cluster possa extrair as imagens de qualquer registro regional do icr.io para os contêineres implementados no projeto default do Red Hat OpenShift.

  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.

    oc get pod <pod_name> -o yaml
    

    Saída de exemplo

    ...
    imagePullSecrets:
    - name: all-icr-io
    ...
    
  4. Se nenhum segredo de extração de imagem estiver listado, configure-o em seu projeto.

    1. Verifique se o projeto default tem segredos de extração de imagem do icr-io para cada registro regional que você deseja usar. Se nenhum segredo icr-io estiver listado no projeto, utilize o comando ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID> para criar os segredos de extração de imagem no projeto default.
      oc get secrets -n default | grep "icr-io"
      
    2. Copie o segredo de extração de imagem all-icr-io do projeto default Red Hat OpenShift para o projeto em que deseja implementar sua carga de trabalho.
    3. Inclua a imagem do segredo de extração de imagens na conta de serviço deste Red Hat OpenShiftprojeto do , para que todos os pods no projeto usem as credenciais de segredo de extração de imagens.
  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 projeto default Red Hat OpenShift. Se outro ID de serviço foi criado, como para acessar um projeto do Red Hat OpenShift diferente ou para modificar as permissões de IAM da IBM Cloud, 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 <project>                                                                                                                                         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 projeto default, inclua a opção -n.

      oc get secret <image_pull_secret_name> -o yaml [-n <project>]
      
    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 os contêineres que são executados no projeto default do Red Hat OpenShift. No entanto, se você modificou as configurações padrão ou se estiver usando um projeto do Red Hat OpenShift diferente, poderá não ter 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 de serviço de cluster, as políticas da IBM Cloud IAM, a chave de API e os segredos de extração de imagem para os contêineres que são executados no projeto default do Red Hat OpenShift.
        ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>
        
      2. Recrie sua implementação no projeto default do Red Hat OpenShift. 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.