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.
-
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.kubectl get pod <pod_name> -o yamlSaída de exemplo
... imagePullSecrets: - name: all-icr-io ... -
Se nenhuma imagem de extração de imagem estiver listada, configure o segredo de extração da imagem em seu namespace.
- Verifique se o namespace
defaulttem os segredos de pull de imagemicr-iopara cada registro regional que você deseja usar. Se nenhum segredoicr-ioestiver listado no espaço de nomes, use o comandoibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID>para criar os segredos de extração de imagem no espaço de nomesdefault.kubectl get secrets -n default | grep "icr-io" - Copie o segredo de extração de imagem
all-icr-iodo namespacedefaultdo Kubernetes para o namespace no qual você deseja implementar sua carga de trabalho. - 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.
- Verifique se o namespace
-
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 espaço de nomesdefaultKubernetes. 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-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 <namespace> 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 namespace
default, inclua a opção-n.kubectl get secret <image_pull_secret_name> -o yaml [-n <namespace>] -
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 contêineres que são executados no namespace
defaultdo 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. -
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 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
defaultdo Kubernetes.ibmcloud ks cluster pull-secret apply --cluster <cluster_name_or_ID> - Recrie a sua implementação no namespace
defaultdo 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.
- 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
-
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.
-