今天是我玩 GCR 和 GKE 的第一天。如果我的问题听起来很幼稚,请道歉。
所以我在 GCR 中创建了一个新的注册表。它是私有(private)的。使用 this文档,我使用命令获取了我的访问 token
gcloud auth print-access-token
#<MY-ACCESS_TOKEN>
我知道我的用户名是
oauth2accesstoken
当我尝试时在我的本地笔记本电脑上
docker login https://eu.gcr.io/v2
Username: oauth2accesstoken
Password: <MY-ACCESS_TOKEN>
我得到:
Login Successful
所以现在是时候创建一个
docker-registry
Kubernetes 中的 secret 。我运行了以下命令:
kubectl create secret docker-registry eu-gcr-io-registry --docker-server='https://eu.gcr.io/v2' --docker-username='oauth2accesstoken' --docker-password='<MY-ACCESS_TOKEN>' --docker-email='<MY_EMAIL>'
然后我的 Pod 定义如下所示:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app
image: eu.gcr.io/<my-gcp-project>/<repo>/<my-app>:latest
ports:
- containerPort: 8090
imagePullSecrets:
- name: eu-gcr-io-registry
但是当我启动 pods 时,我得到了错误:
Warning Failed 4m (x4 over 6m) kubelet, node-3 Failed to pull image "eu.gcr.io/<my-gcp-project>/<repo>/<my-app>:latest": 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. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
我检查了 YAML 文件并执行了
base64 --decode
验证了我的 secret 在 .dockerconfigjson
这是正确的。那么我在这里错过了什么?
最佳答案
如果您的 GKE 集群和 GCR 注册表在同一个项目中:您不需要配置身份验证。 GKE 集群被授权从同一项目中的私有(private) GCR 注册表中提取,而无需配置。 (很可能你就是这个!)
如果您的 GKE 集群和 GCR 注册表位于不同的 GCP 项目中:按照以下说明授予 GKE 集群的“服务帐户”访问 GCR 集群中的私有(private)镜像的权限:https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry
简而言之,这可以通过以下方式完成:
gsutil iam ch serviceAccount:[PROJECT_NUMBER]-compute@developer.gserviceaccount.com:objectViewer gs://[BUCKET_NAME]
在哪里
[BUCKET_NAME]
是存储 GCR 图像的 GCS 存储桶(如 artifacts.[PROJECT-ID].appspot.com
)和 [PROJECT_NUMBER]
是 数字 托管您的 GKE 集群的 GCP 项目 ID。
关于kubernetes - 将图像从 GCR 拉入 GKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52908401/