如何疑難排解 Amazon EKS 的 Amazon ECR 問題?
使用 Amazon Elastic Kubernetes Service (Amazon EKS) 時,我無法從 Amazon Elastic Container Registry (Amazon ECR) 提取映像檔。
簡短描述
因為下列其中一個原因,您無法從 Amazon ECR 提取映像檔:
- 您無法與 Amazon ECR 端點通訊。
- 您在工作節點的節點執行個體角色中沒有適當權限。
- 您尚未建立介面 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 角色
在下列範例中,工作節點的執行個體 AWS Identity and Access Management (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 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 網站上的映像。
確認您的儲存庫政策正確
儲存庫政策是 IAM 政策的子集,可控制對個別 Amazon ECR 儲存庫的存取權限。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 原則中的執行個體 IAM 角色 ARN,而不是執行個體設定檔 ARN。
建立介面 VPC 端點
若要從 Amazon ECR 提取映像,您必須設定介面 VPC 端點。請參閱為 Amazon ECS 建立 VPC 端點。
確認您的 Fargate Pod 執行角色設定正確
當您從 Amazon 託管儲存庫擷取映像時,如果您的 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
若要疑難排解此錯誤,請務必將 Fargate 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": "*" } ] }
注意: 使用您的 AWS 區域名稱取代 example-region。使用帳號取代 1111222233334444,並使用您的叢集名稱取代 example-cluster。
相關內容
- 已提問 1 年前lg...
- 已提問 4 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 7 個月前
- AWS 官方已更新 2 年前