Come posso risolvere i problemi di Amazon ECR con Amazon EKS?

5 minuti di lettura
0

Non riesco a estrarre immagini da Amazon Elastic Container Registry (Amazon ECR) quando utilizzo Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrizione

Non puoi estrarre immagini da Amazon ECR per uno dei seguenti motivi:

  • Non puoi comunicare con gli endpoint Amazon ECR.
  • Non disponi delle autorizzazioni appropriate nel ruolo di istanza del nodo di lavoro.
  • Non hai creato endpoint VPC di interfaccia.

Per risolvere questi problemi, utilizza una o più delle seguenti sezioni di risoluzione, a seconda del tuo caso d'uso.

Risoluzione

Risolvi i problemi di comunicazione tra i nodi di lavoro e gli endpoint Amazon ECR

Se i tuoi nodi di lavoro non riescono a comunicare con gli endpoint Amazon ECR, ricevi il seguente messaggio di errore:

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)

Per risolvere questo errore, conferma quanto segue:

  • La sottorete per il tuo nodo di lavoro ha un percorso verso Internet. Controlla la tabella delle rotte associata alla tua sottorete.
  • Il gruppo di sicurezza associato al nodo di lavoro consente il traffico Internet in uscita.
  • La regola di ingresso e uscita per le liste di controllo degli accessi alla rete (ACL) consente l'accesso a Internet.

Aggiorna il ruolo IAM dell'istanza dei tuoi nodi di lavoro

Supponiamo che il ruolo di AWS Identity and Access Management (IAM) dell'istanza del tuo nodo di lavoro non disponga dell'autorizzazione richiesta per estrarre immagini da Amazon ECR. Quindi, ricevi il seguente errore dal tuo pod 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

Per risolvere questo errore, conferma che i tuoi nodi di lavoro utilizzino la policy gestita di AmazonEC2ContainerRegistryReadOnly di AWS Identity and Access Management (IAM). Oppure, aggiorna il profilo di istanza Amazon Elastic Compute Cloud (Amazon EC2) dei tuoi nodi di lavoro con le seguenti autorizzazioni 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: È consigliabile utilizzare la politica AmazonEC2ContainerRegistryReadOnly invece di creare una politica duplicata.

Il ruolo IAM dell'istanza aggiornato consente ai nodi di lavoro di accedere ad Amazon ECR e di estrarre immagini attraverso il kubelet. Il kubelet è responsabile del recupero e dell'aggiornamento periodico delle credenziali Amazon ECR. Per ulteriori informazioni, consulta le immagini Kubernetes (dal sito Web Kubernetes).

Conferma che le politiche del tuo repository siano corrette

Le politiche dei repository sono un sottoinsieme delle policy IAM che controllano l'accesso ai singoli repository Amazon ECR. Le policy IAM vengono generalmente utilizzate per applicare le autorizzazioni per l'intero servizio Amazon ECR, ma possono anche controllare l'accesso a risorse specifiche.

  1. Apri la console Amazon ECR per il tuo account principale.

  2. Accedi alla regione AWS che contiene il repository ECR.

  3. Nel riquadro di navigazione, scegli Repository, quindi scegli il repository che desideri controllare.

  4. Nel riquadro di navigazione, scegli Autorizzazioni, quindi controlla se il tuo repository dispone delle autorizzazioni corrette.

Questa politica di esempio consente a un utente IAM specifico di descrivere il repository e le immagini all'interno del repository:

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

Verifica che le politiche del tuo repository consentano l'accesso se EKS si trova in un account AWS diverso

Se non hai accesso alle immagini dei contenitori in un altro account AWS, il kubelet fallisce con il seguente errore:

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

La seguente policy di esempio consente al ruolo IAM dell'istanza in un account AWS di descrivere ed estrarre immagini dei container da un repository ECR in un altro account 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: Usa l'ARN del ruolo IAM dell'istanza nella policy ECR, non il profilo di istanza ARN.

Crea endpoint VPC di interfaccia

Per estrarre immagini da Amazon ECR, devi configurare gli endpoint VPC di interfaccia. Consulta la sezione Creazione degli endpoint VPC per Amazon ECS dell'interfaccia Amazon ECR Endpoint VPC (AWS PrivateLink).

Verifica che il ruolo di esecuzione del tuo pod Fargate sia configurato correttamente

Se il tuo pod Fargate CoreDNS è bloccato nello stato ImagePullBackOff quando recuperi immagini dai repository ospitati su Amazon, ricevi il seguente messaggio di errore:

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

Per risolvere questo errore, assicurati di aver impostato il ruolo di esecuzione del pod Fargate per utilizzare AmazonEFargatePodExecutionRolePolicy. Assicurati che al ruolo sia associata anche una politica di fiducia simile alla seguente:

{
  "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:

Assicurati di sostituire quanto segue nella politica:

  • regione-esempio con il nome della tua regione AWS
  • 1111222233334444 con il numero di conto
  • example-cluster con il nome del tuo cluster
AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa