Comment résoudre les problèmes d'Amazon ECR avec Amazon EKS ?

Dernière mise à jour : 17/01/2023

Je ne peux pas extraire d'images d'Amazon Elastic Container Registry (Amazon ECR) lorsque j'utilise Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Vous ne pouvez pas extraire d'images depuis Amazon ECR pour l'une des raisons suivantes :

  • Vous ne pouvez pas communiquer avec les points de terminaison Amazon ECR.
  • Vous ne disposez pas des autorisations appropriées dans le rôle d'instance de nœud de vos nœuds de travail.
  • Vous n'avez pas créé de points de terminaison d'un VPC d'interface.

Pour résoudre ces problèmes, effectuez une ou plusieurs des opérations suivantes, en fonction de votre cas d'utilisation :

  • Résolution des problèmes de communication entre les composants masters et les points de terminaison Amazon ECR.
  • Mettez à jour le rôle d'instance de nœud de vos composants masters.
  • Confirmez que vos stratégies de référentiel sont correctes.
  • Vérifiez si vos stratégies de référentiel autorisent l'accès si votre EKS se trouve dans un autre compte AWS.
  • Créer des points de terminaison d'un VPC d'interface.
  • Vérifiez que votre rôle d'exécution AWS Fargate est correctement configuré.

Résolution

Résolution des problèmes de communication entre les composants masters et les points de terminaison Amazon ECR

Si vos composants masters ne peuvent pas communiquer avec les points de terminaison Amazon ECR, il se peut que vous receviez le message d'erreur suivant :

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)

Pour résoudre cette erreur, confirmez les points suivants :

  • Le sous-réseau de votre nœud de travail possède un routage vers Internet. Vérifiez la table de routage associée à votre sous-réseau.
  • Le groupe de sécurité associé à votre nœud de travail autorise le trafic Internet sortant.
  • La stratégie d'entrée et de sortie pour vos listes de contrôle d'accès (ACL) réseau autorise l'accès à Internet.

Mettre à jour le rôle IAM d'instance de vos composants masters

Supposons que le rôle AWS Identity and Access Management (IAM) de l'instance de votre composant master ne dispose pas de l'autorisation requise pour extraire des images depuis Amazon ECR. L'erreur suivante s'affichera alors sur votre 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

Pour résoudre cette erreur, vérifiez que vos composants masters utilisent la stratégie gérée AWS Identity and Access Management (IAM) AmazonEC2ContainerRegistryReadOnly. Vous pouvez également mettre à jour le profil d'instance Amazon Elastic Compute Cloud (Amazon EC2) de vos nœuds de travail avec les autorisations IAM suivantes :

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

Important : une bonne pratique consiste à utiliser la stratégie AmazonEC2ContainerRegistryReadOnly au lieu de créer une stratégie dupliquée.

Le rôle IAM d'instance mis à jour autorise vos nœuds de travail à accéder à Amazon ECR et extraire des images via le kubelet. Le kubelet est responsable de l'extraction et de l'actualisation périodique des informations d'identification Amazon ECR. Pour plus d'informations, consultez les Images Kubernetes (sur le site Web de Kubernetes).

Confirmez que vos stratégies de référentiel sont correctes

Les stratégies de référentiel sont un sous-ensemble de stratégies IAM qui contrôlent l'accès aux référentiels Amazon ECR individuels. Les stratégies IAM sont généralement utilisées pour appliquer des autorisations pour l'ensemble du service Amazon ECR, mais peuvent également contrôler l'accès à des ressources spécifiques.

1.    Ouvrez la console Amazon ECR pour vous connecter à votre compte principal.

2.    Accédez à la région AWS qui contient le référentiel ECR.

3.    Dans le volet de navigation, choisissez Référentiels, puis choisissez le référentiel que vous souhaitez vérifier.

4.    Dans le volet de navigation, choisissez Autorisations, puis vérifiez si votre référentiel dispose des autorisations appropriées.

Cet exemple de stratégie permet à un utilisateur IAM spécifique de décrire le référentiel et les images contenus dans le référentiel :

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

Vérifiez que vos stratégies de référentiel autorisent l'accès si votre EKS se trouve dans un autre compte AWS

Si vous n'avez pas accès aux images de conteneur d'un autre compte AWS, le kubelet échoue et renvoie l'erreur suivante :

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

L'exemple de stratégie suivant permet au rôle IAM d'instance d'un compte AWS de décrire et d'extraire des images de conteneur d'un référentiel ECR d'un autre compte 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": "*"
    }
  ]
}

Remarque : Utilisez l'ARN du rôle IAM d'instance dans la stratégie ECR, et non l'ARN du profil d'instance.

Créer des points de terminaison d'un VPC d'interface

Pour extraire des images d'Amazon ECR, vous devez configurer les points de terminaison d'un VPC d'interface. Consultez la section Création des points de terminaison d'un VPC pour Amazon ECS des points de terminaison d'un VPC d'interface Amazon ECR (AWS PrivateLink).

Vérifiez que votre rôle d'exécution du pod Fargate est correctement configuré

Si votre pod Fargate CoreDNS est bloqué dans l'état ImagePullBackOff lorsque vous récupérez des images depuis des référentiels hébergés par Amazon, le message d'erreur suivant s'affiche :

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

Pour résoudre cette erreur, assurez-vous que vous avez configuré le rôle d'exécution du pod Fargate de manière à utiliser la stratégie AmazonEKSFargatePodExecutionRolePolicy. Assurez-vous qu'une stratégie de confiance similaire à celle qui suit est également associée au rôle :

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

Remarque :

Assurez-vous de remplacer ce qui suit dans la stratégie :

  • exemple de Région avec le nom de votre Région AWS
  • 1111222233334444 avec le numéro de compte
  • exemple de cluster avec le nom de votre cluster

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?