k8s - 无法拉取图像....来自守护程序的错误响应:拉取 {private_repo} 的访问被拒绝,存储库不存在

k8s - Failed to pull image....Error response from daemon: pull access denied for {private_repo}, repository does not exist

收到此消息:

Failed to pull image....Error response from daemon: pull access denied for {private_repo}, the repository does not exist or may require 'docker login'

使用 AWS ECR 部署新的 helm chart 之后

  1. 完整的私人回购路径是正确的,图像存在于 ECR 中,在 ReplicationController 中:private_repo/serviceXYZ:latest-develop
  2. 其他 pods 使用相同的存储库但不同的路径正在工作,例如:private_repo/serviceABC(他们最新的本地图像已经几个月了,我们最近确实部署了它们,这告诉我我们没有在本地但直接从 ECR 拉取它们)
  3. ~/.docker/config.json表示已登录
  4. 拉取成功的其他服务(无imagePullSecrets)没有秘密

任何想法表示赞赏。

您没有指定您的 Kubernetes 资源(即 Pod、Deployment 等)。但据我所知,这很可能是因为:

  • 您缺少特定 Pod 定义中的 ImagePullSecrets
    kubectl create secret generic regcred \
      --from-file=.dockerconfigjson=~/.docker/config.json> \
      --type=kubernetes.io/dockerconfigjson
    
    然后是吊舱:
    apiVersion: v1
    kind: Pod
    metadata:
      name: myservice
    spec:
      containers:
      - name: yourXYZservice
        image: serviceXYZ:latest-develop
      imagePullSecrets:
      - name: regcred
    
  • 您的私有 ECR 存储库没有 latest-develop 标签。 在推送之前,标记你的图像并使用标签推送它:
    docker tag <image-id> serviceXYZ:latest-develop
    docker push serviceXYZ:latest-develop
    

您需要向 ECR 进行身份验证才能拉取映像。如果您还没有这样做,请关注 instructions here。基本上,您从 AWS 获得授权令牌以将其传递给 docker login。 ECR 所需的帐户是基于 IAM 的,不同于您本地的 Docker 帐户。

如果您已经这样做,则令牌可能已过期。然后重新登录。

您不必为其他 pods 执行此操作的原因可能是这些图像已构建或拉到本地,因此 Docker 不必下载它(使用 [ Pod 的 =11=] 默认设置为 IfNotPresent)。

问题出在 ECR 中针对此特定回购的权限,我将以下权限设置为 "Effect": "Allow" 并且有效:

"Action": [
    "ecr:BatchCheckLayerAvailability",
    "ecr:BatchGetImage",
    "ecr:CompleteLayerUpload",
    "ecr:DescribeImages",
    "ecr:GetDownloadUrlForLayer",
    "ecr:InitiateLayerUpload",
    "ecr:ListImages",
    "ecr:PutImage",
    "ecr:UploadLayerPart"
  ]