Wie behebe ich Amazon ECR-Probleme mit Amazon EKS?

Lesedauer: 5 Minute
0

Ich kann keine Images aus Amazon Elastic Container Registry (Amazon ECR) abrufen, wenn ich Amazon Elastic Kubernetes Service (Amazon EKS) verwende.

Kurzbeschreibung

Sie können aus einem der folgenden Gründe keine Bilder aus Amazon ECR abrufen:

  • Sie können nicht mit Amazon ECR-Endpunkten kommunizieren.
  • Sie verfügen nicht über die entsprechenden Berechtigungen in der Knoten-Instance-Rolle Ihres Worker-Knotens.
  • Sie haben keine Schnittstellen-VPC-Endpunkte erstellt.

Verwenden Sie je nach Anwendungsfall einen oder mehrere der folgenden Lösungsabschnitte, um diese Probleme zu lösen.

Lösung

Beheben von Problemen bei der Kommunikation zwischen Worker-Knoten und Amazon ECR-Endpunkten

Wenn Ihre Worker-Knoten nicht mit den Amazon ECR-Endpunkten kommunizieren können, erhalten Sie die folgende Fehlermeldung:

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)

Überprüfen Sie Folgendes, um diesen Fehler zu beheben:

  • Das Subnetz für Ihren Worker-Knoten hat eine Route zum Internet. Überprüfen Sie die Ihrem Subnetz zugeordnete Routing-Tabelle.
  • Die Ihrem Worker-Knoten zugeordnete Sicherheitsgruppe erlaubt ausgehenden Internet-Datenverkehr.
  • Die Regel für Eingangs- und Ausgangsverkehr für Ihre Netzwerk-Zugriffssteuerungslisten (ACLs) ermöglicht den Zugriff auf das Internet.

Aktualisieren der Instance-IAM-Rolle Ihrer Worker-Knoten

Nehmen wir an, dass die Rolle der AWS Identity and Access Management(IAM)-Instance Ihres Worker-Knotens nicht über die erforderliche Berechtigung verfügt, um Images aus Amazon ECR abzurufen. Dann erhalten Sie die folgende Fehlermeldung von Ihrem Amazon EKS-Pod:

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

Um diesen Fehler zu beheben, stellen Sie sicher, dass Ihre Worker-Knoten die verwaltete AWS Identity and Access Management(IAM)-Richtlinie AmazonEC2ContainerRegistryReadOnly verwenden. Oder aktualisieren Sie das Amazon Elastic Compute Cloud (Amazon EC2) Instance-Profil Ihrer Worker-Knoten mit den folgenden IAM-Berechtigungen:

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

Wichtig: Es hat sich bewährt, die AmazonEC2ContainerRegistryReadOnly-Richtlinie zu verwenden, anstatt eine doppelte Richtlinie zu erstellen.

Die aktualisierte Instance-IAM-Rolle gewährt Ihren Worker-Knoten die Berechtigung, auf Amazon ECR zuzugreifen und Images über das Kubelet abzurufen. Das Kubelet ist dafür verantwortlich, Amazon ECR-Anmeldedaten abzurufen und regelmäßig zu aktualisieren. Weitere Informationen finden Sie unter Kubernetes-Images (von der Kubernetes-Website).

Überprüfen, ob Ihre Repository-Richtlinien korrekt sind

Repository-Richtlinien sind eine Teilmenge der IAM-Richtlinien, die den Zugriff auf einzelne Amazon ECR-Repositorys regeln. IAM-Richtlinien werden im Allgemeinen verwendet, um Berechtigungen für den gesamten Amazon ECR-Service anzuwenden, können aber auch den Zugriff auf bestimmte Ressourcen regeln.

1.    Öffnen Sie die Amazon ECR-Konsole für Ihr Hauptkonto.

2.    Navigieren Sie zu der AWS-Region, die das ECR-Repository enthält.

3.    Wählen Sie im Navigationsbereich Repositorys und dann das Repository aus, das Sie überprüfen möchten.

4.    Wählen Sie im Navigationsbereich Berechtigungen aus und überprüfen Sie dann, ob Ihr Repository über die richtigen Berechtigungen verfügt.

Diese Beispielrichtlinie ermöglicht es einem bestimmten IAM-Benutzer, das Repository und die Images im Repository zu beschreiben:

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

Überprüfen, ob Ihre Repository-Richtlinien den Zugriff zulassen, wenn sich Ihr EKS in einem anderen AWS-Konto befindet

Wenn Sie in einem anderen AWS-Konto keinen Zugriff auf Container-Images haben, schlägt das Kubelet fehl und folgender Fehler wird angezeigt:

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

Die folgende Beispielrichtlinie ermöglicht es der Instance-IAM-Rolle in einem AWS-Konto, Container-Images zu beschreiben und aus einem ECR-Repository in einem anderen AWS-Konto abzurufen:

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

Hinweis: Verwenden Sie den ARN der Instance-IAM-Rolle in der ECR-Richtlinie, nicht den ARN des Instance-Profils.

Schnittstellen-VPC-Endpunkte erstellen

Um Images aus Amazon ECR abzurufen, müssen Sie die Schnittstellen-VPC-Endpunkte konfigurieren. Weitere Informationen finden Sie im Abschnitt Erstellen der VPC-Endpunkte für Amazon ECS unter VPC-Endpoints der Amazon ECR-Schnittstelle (AWS PrivateLink).

Vergewissern Sie sich, dass Ihre Fargate-Pod-Ausführungsrolle korrekt konfiguriert ist

Wenn Ihr Fargate CoreDNS-Pod beim Abrufen von Images aus von Amazon gehosteten Repositorys im ImagePullbackOff-Status hängen bleibt, erhalten Sie die folgende Fehlermeldung:

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

Um diesen Fehler zu beheben, stellen Sie sicher, dass Sie die Fargate-Pod-Ausführungsrolle so einrichten, dass sie die AmazonEKSFargatePodExecutionRolePolicy verwendet. Stellen Sie sicher, dass der Rolle auch eine Vertrauensrichtlinie zugeordnet ist, die der folgenden ähnelt:

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

Hinweis:

Achten Sie darauf, die folgenden Punkte in der Richtlinie zu ersetzen:

  • example-region mit dem Namen Ihrer AWS-Region
  • 1111222233334444 mit der Kontonummer
  • example-cluster mit dem Namen Ihres Clusters
AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr