跳至內容

為什麼使用 Amazon EKS 時,我無法從 Amazon ECR 提取映像檔?

3 分的閱讀內容
0

使用 Amazon Elastic Kubernetes Service (Amazon EKS) 時,我無法從 Amazon Elastic Container Registry (Amazon ECR) 提取映像檔。

簡短說明

因為下列其中一個原因,您無法從 Amazon ECR 提取映像檔:

  • 您無法與 Amazon ECR 端點通訊。
  • 您在工作節點的執行個體 AWS Identity and Access Management (IAM) 角色中沒有適當的許可。
  • 您尚未建立介面虛擬私有雲端 (VPC) 端點

根據您的使用案例,使用下列一個或多個解決方法。

解決方法

對工作節點和 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 角色沒有從 Amazon ECR 提取映像檔的許可時,Amazon EKS Pod 中會發生下列錯誤:

"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 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 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 (映像檔)。

驗證您的儲存庫原則

若要確認您的儲存庫政策正確無誤,請完成下列步驟:

  1. 開啟主要 AWS 帳戶的 Amazon ECR 主控台
  2. 導覽至包含 Amazon ECR 儲存庫的 AWS 區域。
  3. 在瀏覽窗格中,選擇 Repositories (儲存庫),然後選擇您想檢查的儲存庫。
  4. 在導覽窗格中,選擇 Permissions (許可)。然後,檢查您的儲存庫是否具有正確的許可。下列政策範例允許特定 IAM 使用者說明儲存庫和儲存庫內的映像檔:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ECR Repository Policy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/username"
            },
            "Action": [
                "ecr:DescribeImages",
                "ecr:DescribeRepositories"
            ],
            "Resource": "arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name"
        }
    ]
}

注意: 請將 123456789012 替換為您的帳戶 ID、將 username 替換為您的 IAM 使用者或角色名稱、將 REGION 替換為您的區域,將 cross-aws-account-id 替換為您的帳戶 ID,並將 repo-name 替換為您的 Amazon ECR 儲存庫名稱。

設定您的儲存庫政策以允許跨帳戶 Amazon ECR 存取

如果您無法存取另一個帳戶中的容器映像檔,則 kubelet 會失敗並收到下列錯誤訊息:

<aws-account-containing-eks-cluster><node-instance-role-for-worker-node>"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:::assumed-role/ is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name"

若要解決此錯誤,請使用下列政策:

{
    "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": "*"
        }
    ]
}

注意: 請將 123456789012 替換為您的帳戶 ID,並將 eksctl-cross-account-ecr-access-n-NodeInstanceRole 替換為您節點執行個體的 IAM 角色。請在 Amazon ECR 政策中使用執行個體 IAM 角色的 Amazon Resource Name (ARN),而非執行個體設定檔的 ARN。

政策允許某個帳戶中的執行個體 IAM 角色說明並從另一個帳戶中的 Amazon ECR 儲存庫提取容器映像檔。

建立介面 VPC 端點

若要從 Amazon ECR 提取映像檔,您必須為 Amazon ECS 建立設定介面 VPC 端點。

驗證您的 Pod 執行角色組態

當您從 Amazon 託管的儲存庫擷取映像檔時,如果 AWS Fargate CoreDNS Pod 卡在 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"

若要解決此錯誤,請將您的Pod 執行角色設為使用 AmazonEKSFargatePodExecutionRolePolicy

政策範例:

{
    "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": "*"
        }
    ]
}

注意: 請將 123456789012 替換為您的帳戶 ID,並將 eksctl-cross-account-ecr-access-n-NodeInstanceRole 替換為您節點執行個體的 IAM 角色。

AWS 官方已更新 6 個月前