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'un VPC d'interface.

Selon votre cas d'utilisation, vous pouvez utiliser une ou plusieurs des sections de résolution suivantes.

Résolution

Résolution de 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 obtiendrez 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, vérifiez 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.

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

Dans l’exemple suivant, l'instance Gestion des identités et des accès AWS (AWS IAM) de votre composant master ne dispose pas de l'autorisation requise pour extraire des images d'Amazon ECR. Dans ce cas, votre pod Amazon EKS affiche le message d'erreur suivant :

Warning  Failed     14s (x2 over 28s)  kubelet, ip-000-000-000-000.us-west-2.compute.internal  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/imagename/manifests/tag: no basic auth credentialsWarning  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 bien la politique gérée Gestion des identités et des accès AWS (AWS IAM) AmazonEC2ContainerRegistryReadOnly. 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"

Important : il est recommandé d'utiliser la politique AmazonEC2ContainerRegistryReadOnly. Veillez à ne pas créer de politiques dupliquées.

Le rôle IAM d'instance mis à jour donne à vos composants master l'autorisation d'accéder à Amazon ECR et d'extraire des images via le kubelet. Le kubelet récupère et actualise régulièrement les informations d'identification Amazon ECR. Pour en savoir plus, consultez la section Images sur le site Web de Kubernetes.

Vérification de vos politiques de référentiel

Les politiques de référentiel sont un sous-ensemble de politiques IAM qui contrôlent l'accès aux référentiels Amazon ECR individuels. Les politiques IAM appliquent généralement 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. Choisissez ensuite le référentiel que vous souhaitez vérifier.
  4. Dans le volet de navigation, choisissez Autorisations. Vérifiez ensuite que votre référentiel dispose bien 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 page Création de points de terminaison d’un VPC pour Amazon ECS.

Vérification de la configuration du rôle d'exécution de votre pod Fargate

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

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, vous devez configurer le rôle d'exécution du pod Fargate de manière à utiliser AmazonEKSFargatePodExecutionRolePolicy. Vérifiez qu'une politique de confiance de ce type est également attachée au rôle :

{  
  "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 : remplacez example-region par le nom de votre région AWS. Remplacez 1111222233334444 par le numéro de compte et example-cluster par le nom de votre cluster.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 10 mois