如何排查 Amazon ECR 与 Amazon EKS 共用时的问题?

上次更新时间:2020 年 1 月 27 日

使用 Amazon Elastic Kubernetes Service (Amazon EKS) 时,我无法从 Amazon Elastic Container Registry (Amazon ECR) 提取映像。

简短描述

您可能出于下列原因之一而无法从 Amazon ECR 提取映像:

  • 您无法与 Amazon ECR 终端节点通信。
  • 您在附加到工作线程节点的实例配置文件中没有适当的权限来从特定 Amazon ECR 存储库中提取映像。

要解决这些问题,请完成下面其中一个部分中的步骤:

  • 排查工作线程节点与 Amazon ECR 终端节点之间的通信问题
  • 更新工作线程节点的实例配置文件,并确认您的存储库策略正确

解决方法

排查工作线程节点与 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)

要解决此错误,请确认以下事项:

  • 您的工作线程节点的子网具有到 Internet 的路由。检查与您的子网关联的路由表
  • 与您的工作线程节点关联的安全组允许出站 Internet 流量。
  • 您的网络访问控制列表 (ACL) 的传入和传出规则允许访问 Internet。

更新您的工作线程节点的实例配置文件

如果您的工作线程节点的实例配置文件没有从 Amazon ECR 提取映像的权限,则您可能会从您的 Amazon EKS pod 收到以下错误消息:

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 策略而非创建重复策略。

更新后的实例配置文件可为您的工作线程节点提供访问 Amazon ECR 并通过 kubelet 提取映像的权限。kubelet 负责获取并定期刷新 Amazon ECR 凭证。有关更多信息,请参阅 Kubernetes 映像

确认您的存储库策略正确

存储库策略是 IAM 策略的子集,控制对单个 Amazon ECR 存储库的访问。IAM 策略通常用于申请对整个 Amazon ECR 服务的权限,但是也可以控制对特定资源的访问。

1.    为您的一级账户打开 Amazon ECR 控制台

2.    在导航窗格中,选择存储库,然后选择您要检查的存储库。

3.    在导航窗格中,选择权限,然后检查您的存储库是否拥有正确的权限。

下面的示例策略允许特定 IAM 用户描述存储库以及存储库中的映像:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "ECR Repository Policy",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/MyUsername"
      },
      "Action": [
        "ecr:DescribeImages",
        "ecr:DescribeRepositories"
      ]
    }
  ]
}

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?