Como soluciono problemas do Amazon ECR com o Amazon EKS?

6 minuto de leitura
0

Não consigo extrair imagens do Amazon Elastic Container Registry (Amazon ECR) quando uso o Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrição

Você não consegue extrair imagens do Amazon ECR por um dos seguintes motivos:

  • Não é possível se comunicar com os endpoints do Amazon ECR.
  • Não há permissões apropriadas no perfil de instância de nó do seu nó de processamento.
  • Os endpoints da VPC de interface não foram criados.

Para resolver esses problemas, use uma ou mais das seções de resolução a seguir, dependendo do seu caso de uso.

Resolução

Solucionar problemas de comunicação entre os nós de processamento e endpoints do Amazon ECR

Se os seus nós de processamento não conseguirem se comunicar com os endpoints do Amazon ECR, você receberá a seguinte mensagem de erro:

Failed to pull image "ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag": rpc error: code = Unknown desc =
Error response from daemon: Get https://ACCOUNT.dkr.ecr.REGION.amazonaws.com/v2/: net/http:
request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Para resolver esse erro, confirme o seguinte:

  • A sub-rede do seu nó de processamento tem uma rota para a internet. Verifique a tabela de rotas associada à sua sub-rede.
  • O grupo de segurança associado ao seu nó de processamento permite o tráfego de saída da Internet.
  • A regra de entrada e saída das suas listas de controle de acesso (ACLs) à rede permite o acesso à internet.

Atualize o perfil do IAM da instância dos seus nós de processamento

Suponha que o perfil do AWS Identity and Access Management (IAM) da instância do seu nó de trabalho não tenha a permissão necessária para extrair imagens do Amazon ECR. Em seguida, será exibido o seguinte erro do seu pod do Amazon EKS:

Warning  Failed     14s (x2 over 28s)  kubelet, ip-000-000-000-000.us-west-2.compute.internalFailed to pull image "ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag": rpc error: code = Unknown desc = Error response from daemon: Get https://ACCOUNT.dkr.ecr.REGION.amazonaws.com/v2/imagename/manifests/tag: no basic auth credentials
Warning  Failed     14s (x2 over 28s)  kubelet, ip-000-000-000-000.us-west-2.compute.internal  Error: ErrImagePull
Normal   BackOff    2s (x2 over 28s)   kubelet, ip-000-000-000-000.us-west-2.compute.internal  Back-off pulling image "ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag"
Warning  Failed     2s (x2 over 28s)   kubelet, ip-000-000-000-000.us-west-2.compute.internal  Error: ImagePullBackOff

Para resolver esse erro, confirme se seus nós de processamento usam a política gerenciada AmazonEC2ContainerRegistryReadOnly do AWS Identity and Access Management (IAM). Ou atualize o perfil de instância do Amazon Elastic Compute Cloud (Amazon EC2) dos seus nós de trabalho com as seguintes permissões do IAM:

"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:GetLifecyclePolicy",
"ecr:GetLifecyclePolicyPreview",
"ecr:ListTagsForResource",
"ecr:DescribeImageScanFindings"

**Importante:**A prática recomendada é usar a política AmazonEC2ContainerRegistryReadOnly em vez de criar uma política duplicada.

O perfil do IAM da instância atualizada dá aos nós de processamento a permissão de acessar o Amazon ECR e extrair imagens por meio do kubelet. O kubelet é responsável por buscar e atualizar periodicamente as credenciais do Amazon ECR. Para mais informações, consulte Imagens do Kubernetes (no site do Kubernetes).

Confirmar se as políticas do seu repositório estão corretas

Políticas de repositório são um subconjunto das políticas do IAM que controlam o acesso a repositórios individuais do Amazon ECR. As políticas do IAM geralmente são usadas para aplicar permissões para todo o serviço do Amazon ECR, mas também podem controlar o acesso a recursos específicos.

1.    Abra o console do Amazon ECR para sua conta principal.

2.    Navegue até a região da AWS que contém o repositório do ECR.

3.    No painel de navegação, escolha Repositories (Repositórios) e escolha o repositório que você deseja verificar.

4.    No painel de navegação, escolha Permissions (Permissões) e verifique se o seu repositório tem as permissões corretas.

Esse exemplo de política permite que um usuário específico do IAM descreva o repositório e as imagens dentro dele:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ECR Repository Policy",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/MyUsername"
      },
      "Action": [
        "ecr:DescribeImages",
        "ecr:DescribeRepositories"
      ]
    }
  ]
}

Confirmar se as suas políticas de repositório permitem acesso caso o seu EKS esteja em uma conta diferente da AWS

Se você não tiver acesso às imagens de contêiner em outra conta da AWS, o kubelet falhará com o seguinte erro:

Failed to pull image "cross-aws-account-id:.dkr.ecr.REGION.amazonaws.com/repo-name:image-tag": rpc error: code = Unknown desc = Error response from daemon: pull access denied for arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name, repository does not exist or may require 'docker login': denied: User: arn:aws:sts::<aws-account-containing-eks-cluster>:assumed-role/<node-instance-role-for-worker-node is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name

O exemplo de política a seguir permite que o perfil do IAM da instância em uma conta da AWS descreva e extraia imagens de contêiner de um repositório do ECR em outra conta da AWS:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/eksctl-cross-account-ecr-access-n-NodeInstanceRole"
      },
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:GetRepositoryPolicy",
        "ecr:DescribeRepositories",
        "ecr:ListImages",
        "ecr:DescribeImages",
        "ecr:BatchGetImage",
        "ecr:GetLifecyclePolicy",
        "ecr:GetLifecyclePolicyPreview",
        "ecr:ListTagsForResource",
        "ecr:DescribeImageScanFindings"
      ],
      "Resource": "*"
    }
  ]
}

Observação: use o ARN do perfil do IAM da instância na política de ECR, e não o ARN do perfil de instância.

Criar endpoints de VPC de interface

Para extrair imagens do Amazon ECR, você deve configurar endpoints de VPC de interface. Consulte a seção Criar endpoints de VPC para o Amazon ECS de Endpoints de VPC de interface do Amazon ECR (AWS PrivateLink).

Confirmar se o seu perfil de execução do pod do Fargate está configurado corretamente

Se o seu pod CoreDNS do Fargate estiver preso no estado ImagePullBackOff quando você recuperar imagens dos repositórios hospedados na Amazon, você receberá a seguinte mensagem de erro:

Warning   Failed           27s (x2 over 40s)  kubelet            Failed to pull image "151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest ": rpc error: code = Unknown desc = failed to pull and unpack image "151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest ": failed to resolve reference "151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest ": pulling from host 151284513677.dkr.ecr.eu-central-1.amazonaws.com failed with status code [manifests latest]: 401 Unauthorized

Para solucionar esse erro, certifique-se de configurar o perfil de execução do pod do Fargate para usar AmazonEKSFargatePodExecutionRolePolicy. Certifique-se de que uma política de confiança semelhante à seguinte também esteja anexada ao perfil:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:eks:example-region:1111222233334444:fargateprofile/example-cluster/*"
        }
      },
      "Principal": {
        "Service": "eks-fargate-pods.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Observação:

certifique-se de substituir o seguinte na política:

  • example-region pelo nome da sua região da AWS
  • 1111222233334444 pelo número da conta
  • **example-cluster ** pelo nome do seu cluster
AWS OFICIAL
AWS OFICIALAtualizada há um ano