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 之后
- 完整的私人回购路径是正确的,图像存在于 ECR 中,在 ReplicationController 中:private_repo/serviceXYZ:latest-develop
- 其他 pods 使用相同的存储库但不同的路径正在工作,例如:private_repo/serviceABC(他们最新的本地图像已经几个月了,我们最近确实部署了它们,这告诉我我们没有在本地但直接从 ECR 拉取它们)
~/.docker/config.json
表示已登录
- 拉取成功的其他服务(无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"
]
收到此消息:
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 之后
- 完整的私人回购路径是正确的,图像存在于 ECR 中,在 ReplicationController 中:private_repo/serviceXYZ:latest-develop
- 其他 pods 使用相同的存储库但不同的路径正在工作,例如:private_repo/serviceABC(他们最新的本地图像已经几个月了,我们最近确实部署了它们,这告诉我我们没有在本地但直接从 ECR 拉取它们)
~/.docker/config.json
表示已登录- 拉取成功的其他服务(无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"
]