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.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
このエラーを解決するには、ワーカーノードが 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 イメージ (Kubernetes ウェブサイト) を参照してください。
リポジトリポリシーが正しいことの確認
リポジトリポリシーは、個々の Amazon ECR リポジトリへのアクセスを制御する IAM ポリシーのサブセットです。IAM ポリシーは通常、Amazon ECR サービス全体にアクセス権限を適用するために使用されますが、特定のリソースへのアクセスを制御することもできます。
1. プライマリアカウントの Amazon ECR コンソールを開きます。
2. ECR リポジトリを含む AWS リージョンに移動します。
3. ナビゲーションペインで [リポジトリ] を選択し、確認するリポジトリを選択します。
4. ナビゲーションペインで [アクセス許可] を選択し、リポジトリに正しい権限があるかどうかを確認します。
このポリシー例では、特定の 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 ECR インターフェイス VPC エンドポイント (AWS PrivateLink) の VPC Endpoints for Amazon ECS の作成セクションを参照してください。
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", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:eks:example-region:1111222233334444:fargateprofile/example-cluster/*" } }, "Principal": { "Service": "eks-fargate-pods.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
注:
ポリシー内の以下の部分を必ず置き換えてください。
- example-region を AWS リージョンの名前に置き換える
- 1111222233334444 をアカウント番号に置き換える
- example-cluster をクラスターの名前に置き換える
関連するコンテンツ
- 質問済み 4年前lg...
- 質問済み 7ヶ月前lg...