Comment puis-je dépanner les problèmes d'Amazon ECR avec Amazon EKS ?

Lecture de 6 minute(s)
0

Je ne parviens pas à extraire des 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 des images d’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 votre composant master.
  • Vous n'avez pas créé de points de terminaison d'interface d’un VPC.

Pour résoudre ces problèmes, utilisez une ou plusieurs des sections de résolution suivantes, selon votre cas d'utilisation.

Résolution

Résolvez les problèmes de communication entre les composants master et les points de terminaison Amazon ECR

Si vos composants master ne peuvent pas communiquer avec les points de terminaison Amazon ECR, vous recevrez 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 composant master possède une route vers Internet. Vérifiez la table de routage associée à votre sous-réseau.
  • Le groupe de sécurité associé à votre composant master autorise le trafic Internet sortant.
  • La stratégie d'entrée et de sortie de vos listes de contrôle d'accès réseau (ACL) autorise l'accès à Internet.

Mettez à jour le rôle IAM d'instance de vos composants master

Supposez que l'instance AWS Identity and Access Management (IAM) de votre composant master ne dispose pas de l'autorisation requise pour extraire des images d'Amazon ECR. Le message d'erreur suivant s'affiche alors à partir de 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 master utilisent la politique gérée d'AmazonEC2ContainerRegistryReadOnly AWS Identity and Access Management (IAM). Vous pouvez également mettre à jour le profil d'instance Amazon Elastic Compute Cloud (Amazon EC2) de vos composants master 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"

**Remarque :**Il est recommandé d'utiliser la stratégie AmazonEC2ContainerRegistryReadOnly au lieu de créer une politique dupliquée.

Le rôle IAM de l'instance mis à jour donne à vos composants master l'autorisation d'accéder à Amazon ECR et d'extraire des images via le kubelet. Le kubelet est chargé de récupérer et d'actualiser régulièrement les informations d'identification Amazon ECR. Pour plus d'informations, consultez les Images de Kubernetes (sur le site Web de Kubernetes).

Vérifiez que les stratégies de votre référentiel sont correctes

Les politiques de référentiel sont un sous-ensemble des politiques 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 à 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 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 qu'il contient :

{
  "Version": "2012-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 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 depuis 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 de l'instance dans la stratégie ECR, et non l'ARN du profil d'instance.

Créez des points de terminaison d'interface d’un VPC

Pour extraire des images depuis Amazon ECR, vous devez configurer les points de terminaison d’un VPC d’interface . Consultez la section Créer des points de terminaison d’un VPC pour Amazon ECS de la section Points de terminaison d’un VPC de l'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, veillez à configurer le rôle d'exécution du pod Fargate de manière à utiliser AmazonEKSFargatePodExecutionRolePolicy. Assurez-vous qu'une stratégie de confiance similaire à la suivante 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 :

Veillez à remplacer ce qui suit dans la stratégie :

  • example-region par le nom de votre Région AWS
  • 1111222233334444 par le numéro de compte
  • example-cluster par le nom de votre cluster
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an