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.
-
Verifique se você usa o nome correto e a tag da imagem em seu arquivo YAML de implementação.
ibmcloud cr images -
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 -
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 yamlSaída de exemplo
... imagePullSecrets: - name: all-icr-io ... -
Se nenhum segredo de extração de imagem estiver listado, configure-o em seu projeto.
- Verifique se o projeto
defaulttem segredos de extração de imagem doicr-iopara cada registro regional que você deseja usar. Se nenhum segredoicr-ioestiver listado no projeto, utilize o comandoibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID>para criar os segredos de extração de imagem no projetodefault.oc get secrets -n default | grep "icr-io" - Copie o segredo de extração de imagem
all-icr-iodo projetodefaultRed Hat OpenShift para o projeto em que deseja implementar sua carga de trabalho. - 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.
- Verifique se o projeto
-
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.
- Se o segredo tiver
icrno nome, você usará uma chave de API para autenticar com os nomes de domínioicr.io. Continue com Resolução de problemas de segredos de extração de imagem que usam chaves de API. - Se você tiver os tipos de segredos, então, use os métodos de autenticação. Avançando, use os nomes de domínio
icr.ioem seus YAMLs de implementação para a imagem de contêiner. Continue com Resolução de problemas de segredos de extração de imagem que usam chaves de API.
- Se o segredo tiver
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.
-
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 projetodefaultRed 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-idsSaí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 -
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> -
Verifique se as credenciais do segredo de extração de imagem são válidas.
-
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>] -
Na saída, copie o valor codificado em base64 do campo
.dockerconfigjson.apiVersion: v1 kind: Secret data: .dockerconfigjson: eyJyZWdp...== ... -
Decode a sequência base64. Por exemplo, no OS X, é possível executar o comando a seguir.
echo -n "<base64_string>" | base64 --decodeSaída de exemplo
{"auths":{"<region>.icr.io":{"username":"iamapikey","password":"<password_string>","email":"<name@abc.com>","auth":"<auth_string>"}}} -
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
defaultdo 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. -
Efetue login no registro por meio de sua máquina local usando o
usernamee apasswordde 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- 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
defaultdo Red Hat OpenShift.ibmcloud oc cluster pull-secret apply --cluster <cluster_name_or_ID> - Recrie sua implementação no projeto
defaultdo 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.
- 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
-
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> -
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.
-