Kubernetes pods 无法从容器注册表 (gcp) 中提取图像

Kubernetes pods can't pull images from container registry (gcp)

我想用存在于 'eu.gcr.io'(同一项目)上的新映像更新我在 kubernetes 上的部署,我之前已经这样做过。但是现在 pods 无法拉取图像,因为他们没有被授权这样做。这是我们在 pod 日志中得到的错误。

Failed to pull image "eu.gcr.io/my-gcp-project/my-image:v1.009": 
rpc error: code = Unknown desc = Error response from daemon: 
unauthorized: You don't have the needed permissions to perform this operation,
and you may have invalid credentials.

集群上的服务帐户具有 kubernetes adminstorage admin 角色,应该是 sufficient。但是即使我创建了服务帐户项目编辑器(为了调试)它仍然不起作用(同样的错误)。

我也曾尝试创建一个全新的集群(默认设置)并在那里应用我的部署,但后来我遇到了完全相同的问题。

我不确定我还能尝试什么。

非常感谢任何帮助或建议。

编辑:

我刚刚发现我仍然可以拉取和部署旧镜像。但是我构建的每个新图像都不能被 kubernetes pods.

您需要创建一个 docker-registry secret 并在您的 pod 定义中使用 imagePullSecrets:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

查看此guide了解更多信息

根据您的描述

I just found out that I can still pull and deploy older images. But every new image I build cannot be pulled by the kubernetes pods.

我假设你可以通过命令拉取 docker 图像,但不是 kubectl。

docker pull eu.gcr.io/my-gcp-project/my-image:v1.009 

参考本文Using Google Container Registry with Kubernetesdocker拉取和[=22=拉取docker图像的认证不同]kubectl。

您是否向 GKE 提供了访问令牌?

kubectl create secret docker-registry gcr-access-token \
--docker-server=eu.gcr.io \
--docker-username=oauth2accesstoken \
--docker-password="$(gcloud auth print-access-token)" \
--docker-email=any@valid.email

k8s 集群中使用的服务帐户或用户无权访问 gcr(google 容器注册表)。要允许访问,有两种方法,以便 k8s 节点可以从 gcr 中拉取图像并部署 pods.

方法 1:使容器注册表 Public(不推荐)仅用于实验室或测试目的。

方法 2:将存储对象管理员或存储对象查看器角色添加到分配给您的 k8s 集群和节点的服务帐户。 (推荐)