Amazon EKS によるの Amazon ECR の問題をトラブルシューティングする方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) を使用しているときに、Amazon Elastic Container Registry (Amazon ECR) からイメージを取り出すことができません。
簡単な説明
次のいずれかの理由により、Amazon ECR から画像を取得することができません。
- Amazon ECR エンドポイントと通信できない。
- ワーカーノードのノードインスタンスロールに適切な権限がない。
- インターフェイス VPC エンドポイントが作成されていない。
ユースケースに応じて、以下の解決策を 1 つ以上実行してください。
解決策
ワーカーノードと Amazon ECR エンドポイント間の通信のトラブルシューティング
ワーカーノードが Amazon ECR エンドポイントと通信できない場合は、次のエラーメッセージが表示されます。
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)
このエラーを解決するには、以下を確認します。
- ワーカーノードのサブネットに、インターネットへのルートがあること。これには、サブネットに関連付けられているルートテーブルを確認してください。
- ワーカーノードに関連付けられているセキュリティグループで、アウトバウンドのインターネットトラフィックが許可されていること。
- ネットワークアクセスコントロールリスト (ACL) のイングレスおよびエグレスルールにより、インターネットへのアクセスが許可されていること。
ワーカーノードのインスタンス IAM ロールの更新
以下の例では、ワーカーノードのインスタンスの AWS Identity and Access Management (AWS IAM) ロールに、Amazon ECR からイメージを取得するのに必要な権限がありません。この場合、Amazon EKS ポッドから次のエラーが返されます。
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
このエラーを解決するには、ワーカーノードが AmazonEC2ContainerRegistryReadOnly のAWS Identity and Access Management (IAM) マネージドポリシーを使用していることを確認してください。または、次の IAM 権限を使用してワーカーノードの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスプロファイルを更新してください。
"ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:DescribeImages", "ecr:BatchGetImage", "ecr:GetLifecyclePolicy", "ecr:GetLifecyclePolicyPreview", "ecr:ListTagsForResource", "ecr:DescribeImageScanFindings"
**重要:**ベストプラクティスは、AmazonEC2ContainerRegistryReadOnly ポリシーを使用することです。重複したポリシーを作成しないでください。
更新されたインスタンスの IAM ロールにより、Amazon ECR にアクセスし、kubelet を介してイメージを取得する権限がワーカーノードに付与されます。kubelet は Amazon ECR 認証情報を取得し、定期的に更新します。詳細については、Kubernetes ウェブサイトの「Images」を参照してください。
リポジトリポリシーが正しいことを確認する
リポジトリポリシーは、個々の Amazon ECR リポジトリへのアクセスを制御する IAM ポリシーのサブセットです。IAM ポリシーは通常、Amazon ECR サービス全体にアクセス権限を適用するために使用されますが、特定のリソースへのアクセスを制御することもできます。
- プライマリアカウントの Amazon ECR コンソールを開きます。
- ECR リポジトリを含む AWS リージョンに移動します。
- ナビゲーションペインで [リポジトリ] を選択し、確認するリポジトリを選択します。
- ナビゲーションペインで [アクセス許可] を選択し、リポジトリに正しいアクセス許可があるかどうかを確認します。
このポリシーの例では、特定の IAM ユーザーがリポジトリとリポジトリ内のイメージを記述できます。{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECR Repository Policy", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/MyUsername" }, "Action": [ "ecr:DescribeImages", "ecr:DescribeRepositories" ] } ] }
EKS が別の AWS アカウントにある場合は、リポジトリポリシーがアクセスを許可していることを確認します。
別の AWS アカウントのコンテナイメージにアクセスできない場合、kubelet は次のエラーで失敗します。
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
次のポリシー例では、ある AWS アカウントのインスタンス IAM ロールが、別の AWS アカウントの ECR リポジトリからコンテナイメージを記述して取り出せるようにします。
{ "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": "*" } ] }
注: ECR ポリシーでは、インスタンスプロファイル ARN ではなく、インスタンス IAM ロールの ARN を使用してください。
インターフェイス VPC エンドポイントの作成
Amazon ECR からイメージを取得するには、インターフェイス VPC エンドポイントを設定する必要があります。「Amazon ECS 用の VPC エンドポイントの作成」を参照してください。
Fargate ポッド実行ロールが正しく設定されていることを確認する
Amazon がホストするリポジトリからイメージを取得するときに、Fargate CoreDNS ポッドが ImagePullBackOff 状態のままになっている場合は、次のエラーメッセージが表示されます。
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
このエラーをトラブルシューティングするには、必ず AmazonEKSFargatePodExecutionRolePolicy を使用するように Fargate ポッド実行ロールを設定してください。次のような信頼ポリシーがロールに添付されていることも確認してください。
{ "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": "*" } ] }
**注:**example-region は AWS リージョンの名前に置き換えます。1111222233334444 はアカウント番号に、example-cluster はクラスターの名前に置き換えてください。
関連するコンテンツ
- 質問済み 1年前lg...