我正在尝试让Kubernetes从另一个项目的Google Container Registry下载图像 . 根据docs,你应该使用以下方法创建一个图像拉秘密:
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
但我想知道我应该使用哪些 DOCKER_USER
和 DOCKER_PASSWORD
进行Google Container Registry身份验证?查看GCR docs,它表示密码是您可以通过运行获得的访问令牌:
$ gcloud auth print-access-token
这实际上有效......一段时间 . 问题似乎是这个访问令牌在(我相信是)一小时之后到期 . 我需要一个在创建图像拉秘密时不会过期的密码(或其他东西) . 否则Kubernetes群集在一小时左右后无法下载新图像 . 这样做的正确方法是什么?
6 回答
这真的很棘手,但经过大量的追踪和错误,我认为我已经有了它的工作 .
转到Google Developer Console> Api Manager>凭据,然后单击"Create credentials"并创建"service account key"
在"service account"下选择new并命名新密钥"gcr"(让密钥类型为json)
创建密钥并将文件存储在磁盘上(从这里我们假设它存储在
~/secret.json
下)现在从命令行使用Docker登录GCR:
$ docker login -e your@email.se -u _json_key -p "$(cat ~/secret.json)" https://eu.gcr.io
这将在
~/.docker/config.json
文件中为“https://eu.gcr.io”生成一个条目 .{"https://eu.gcr.io": { "auth": "<key>","email": "your@email.se"}}
$ cat ~/docker-config.json | base64
~/pullsecret.yaml
):$ kubectl create -f ~/pullsecret.yaml
名字:foo
imagePullSecrets:
或将其添加到service account .
kubectl更容易
从谷歌下载your_service_account.json后的一个重要细节是 join all the lines in the json into one row.
您还可以将群集运行的服务帐户授予对GCS存储桶的访问权限:
This回答有一些
gsutil
命令来实现这一点 .此答案确保只有一组泊坞窗凭证包含在您的Kubernetes秘密中,并为您处理修剪换行符 .
按照约翰的好答案,遵循相同的前三个步骤:
转到Google Developer Console> Api Manager>凭据,然后点击“创建凭据”并创建“服务帐户密钥”
在“服务帐户”下选择新密码并将新密钥命名为“gcr”(让密钥类型为json)
创建密钥并将文件存储在磁盘上(从这里我们假设它存储在
~/secret.json
下)接下来,运行这些命令以生成所需的Docker凭证并将其注入到集群中:
当您指定从GCR中提取图像的Pod时,请在
spec
部分中包含gcr-key
机密名称:从official ways,您可以:
注意:未使用电子邮件,因此您可以将任何内容放入其中 .
将
gcr.io
更改为Google Container Registry中显示的域名(例如eu.gcr.io
) .为了得到
$JSON_KEY
:转到API Manager > Credentials
单击"Create credentials"> Service account key :
服务帐户:新服务帐户
姓名:你想要的任何东西,比如
Docker Registry (read-only)
角色:存储(向下滚动)> Storage Object Viewer
键类型: JSON
下载为
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
现在你可以使用它了 .
登录后,您只需运行
docker pull
即可 . 您还可以复制更新的~/.dockercfg
以保留设置 .No image pull secret is needed, it can be done by an IAM configuration
我尝试了其他答案,但我无法使用Image Pull Secret方法 .
但是我发现这可以通过授予对Kubernetes集群所在项目中的 Compute Engine default service account 的访问权限来完成 . 此服务帐户由GCP自动创建 .
如下所述:https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry
您需要执行以下命令以授予对为Container Registry提供服务的Cloud Storage存储桶的访问权限
BUCKET_NAME:
EMAIL-ADDRESS: