¿Cómo soluciono los problemas de Amazon ECR con Amazon EKS?

6 minutos de lectura
0

No puedo extraer imágenes de Amazon Elastic Container Registry (Amazon ECR) cuando utilizo Amazon Elastic Kubernetes Service (Amazon EKS).

Descripción breve

No puede extraer imágenes de Amazon ECR por uno de los siguientes motivos:

  • No puede comunicarse con los puntos de enlace de Amazon ECR.
  • No tienes los permisos adecuados en el rol de instancia de nodo de su nodo de trabajo.
  • No ha creado puntos de enlace de VPC de interfaz.

Para resolver estos problemas, utilice una o más de las siguientes secciones de resolución, según su caso de uso.

Resolución

Solucionar problemas de comunicación entre los nodos de trabajo y los puntos de enlace de Amazon ECR

Si sus nodos de trabajo no pueden comunicarse con los puntos de enlace de Amazon ECR, entonces recibirá el siguiente mensaje de error:

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 este error, confirme lo siguiente:

  • La subred de su nodo de trabajo tiene una ruta a Internet. Compruebe la tabla de rutas asociadas a su subred.
  • El grupo de seguridad asociado con su nodo de trabajo permite el tráfico de Internet saliente.
  • Las reglas de entrada y salida de las listas de control de acceso (ACLs) a su red permite el acceso a Internet.

Actualice el rol de IAM de instancias de sus nodos de trabajo

Supongamos que la función AWS Identity and Access Management (IAM) de la instancia de su nodo de trabajo no cuenta con los permisos necesarios para extraer imágenes de Amazon ECR. A continuación, aparece el siguiente error en su pod de 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 este error, confirme que sus nodos de trabajo utilizan la política gestionada de AmazonEC2ContainerRegistryReadOnlyAWS Identity and Access Management (IAM). O bien, actualice el perfil de instancia de Amazon Elastic Compute Cloud (Amazon EC2) de sus nodos de trabajo con los siguientes permisos de 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: Se recomienda utilizar la política AmazonEC2ContainerRegistryReadOnly en lugar de crear una política duplicada.

La función de IAM de instancias actualizada otorga a sus nodos de trabajo el permiso para acceder a Amazon ECR y extraer imágenes a través del kubelet. El kubelet es responsable de obtener y actualizar periódicamente las credenciales de Amazon ECR. Para obtener más información, consulte las imágenes de Kubernetes (en el sitio web de Kubernetes).

Confirme que las políticas de su repositorio son correctas

Las políticas de repositorio son un subconjunto de políticas de IAM que controlan el acceso a los repositorios individuales de Amazon ECR. Las políticas de IAM se utilizan generalmente para aplicar permisos a todo el servicio Amazon ECR, pero también pueden controlar el acceso a recursos específicos.

1.    Abra la consola de Amazon ECR para su cuenta principal.

2.    Navegue hasta la región de AWS que contiene el repositorio de ECR.

3.    En el panel de navegación, elija Repositorios y, a continuación, elija el repositorio que desee comprobar.

4.    En el panel de navegación, seleccione Permisos y, a continuación, compruebe si su repositorio tiene los permisos correctos.

Este ejemplo de política permite a un usuario específico de IAM describir el repositorio y las imágenes que contiene:

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

Confirme que sus políticas de repositorio permiten el acceso si su EKS se encuentra en una cuenta diferente de AWS

Si no tiene acceso a las imágenes del contenedor en otra cuenta de AWS, entonces el kubelet presentará el siguiente error:

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

El siguiente ejemplo de política permite que la función de IAM de instancias de una cuenta de AWS describa y extraiga imágenes de contenedores de un repositorio de ECR en otra cuenta de 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": "*"
    }
  ]
}

Nota: Utilice el ARN del rol de IAM de la instancia en la política de ECR, no el ARN del perfil de instancia.

Crear puntos de enlace de VPC de interfaz

Para extraer imágenes desde Amazon ECR, debe configurar los puntos de enlace de la interfaz VPC. Consulte la sección Creación de puntos de enlace de VPC para Amazon ECS en Puntos de enlace de VPC de la interfaz Amazon ECR (AWS PrivateLink).

Confirme que su función de ejecución del pod de Fargate esté configurada correctamente

Si su pod de Fargate CoreDNS está atascado en el estado ImagePullbackOff al recuperar imágenes de los repositorios alojados en Amazon, recibirá el siguiente mensaje de error:

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 este error, asegúrese de configurar la función de ejecución del pod de Fargate para utilizar AmazonEKSFargatePodExecutionRolePolicy. Asegúrese de que al rol también se adjunte una política de confianza similar a la siguiente:

{
  "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"
    }
  ]
}

Nota:

Asegúrese de reemplazar lo siguiente en la política:

  • ejemplo-región con el nombre de su región de AWS
  • 1111222233334444 con el número de cuenta
  • ejemplo-clúster con el nombre de su clúster
OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año