16

我想用'eu.gcr.io'(同一个项目)上存在的新图像更新我在kubernetes上的部署,我以前做过。但是现在 Pod 无法拉取图像,因为它们没有被授权这样做。这是我们在 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 管理员存储管理员角色,应该足够了。但即使我制作了服务帐户项目编辑器(为了调试),它仍然无法正常工作(同样的错误)。

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

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

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

编辑:

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

4

3 回答 3

6

根据你的描述

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

我假设您可以通过命令提取 docker 映像,但不能通过 kubectl。

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

所以参考这篇文章Using Google Container Registry with Kubernetes,通过docker pullkubectl pull docker image 的身份验证是不同的。

您是否向 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
于 2019-03-05T02:00:16.813 回答
3

您将需要创建一个 docker-registry 机密并在您的 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

有关更多信息,请参阅本指南

于 2019-03-02T14:51:10.283 回答
0

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

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

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

于 2021-03-17T17:45:23.330 回答