Amazon EKS によるの Amazon ECR の問題をトラブルシューティングする方法を教えてください。

所要時間3分
0

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 をクラスターの名前に置き換える
AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ