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

Dernière mise à jour : 17/12/2021

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 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 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, suivez les étapes de l'une des sections suivantes :

  • Résolution des problèmes de communication entre les nœuds de travail et les points de terminaison Amazon ECR
  • Mettez à jour le rôle d'instance de nœud de vos nœuds de travail
  • 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

Solution

Résolution des problèmes de communication entre les nœuds de travail et les points de terminaison Amazon ECR

Si vos nœuds de travail 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 éléments 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 nœuds de travail

Si le rôle IAM d'instance de votre nœud de travail n'est pas autorisé à extraire des images d'Amazon ECR, il se peut que vous receviez le message d'erreur suivant à 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 nœuds de travail 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.

L'exemple de stratégie suivant permet à un utilisateur IAM spécifique de décrire le référentiel et les images 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 politiques 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<br>

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 :

{<br>    "Version": "2012-10-17",<br>    "Statement": [<br>    {<br>      "Effect": "Allow",<br>      "Principal": {<br>      "AWS": "arn:aws:iam::123456789012:role/eksctl-cross-account-ecr-access-n-NodeInstanceRole"<br>        },<br>            "Action": [<br>                "ecr:GetAuthorizationToken",<br>                "ecr:BatchCheckLayerAvailability",<br>                "ecr:GetDownloadUrlForLayer",<br>                "ecr:GetRepositoryPolicy",<br>                "ecr:DescribeRepositories",<br>                "ecr:ListImages",<br>                "ecr:DescribeImages",<br>                "ecr:BatchGetImage",<br>                "ecr:GetLifecyclePolicy",<br>                "ecr:GetLifecyclePolicyPreview",<br>                "ecr:ListTagsForResource",<br>                "ecr:DescribeImageScanFindings"<br>          ],<br>           "Resource": "*"<br>        }<br>    ]<br>}<br>

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 de l'interface Amazon ECR (AWS PrivateLink).


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


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