我正在尝试让Kubernetes从另一个项目的Google Container Registry下载图像。根据{{3}},你应该使用:
创建一个图像拉秘密$ 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?查看docs,它说密码是您可以通过运行获得的访问令牌:
$ gcloud auth print-access-token
这实际上有效......暂时。问题似乎是这个访问令牌在(我相信是)一小时之后到期。我需要一个在创建图像拉秘密时不会过期的密码(或其他东西)。否则Kubernetes群集在一小时左右后无法下载新图像。这样做的正确方法是什么?
答案 0 :(得分:14)
这真的很棘手,但经过大量的追踪和错误,我认为我已经开始工作了。
~/secret.json
下)现在从命令行使用Docker登录GCR:
$ docker login -e your@email.se -u _json_key -p "$(cat ~/secret.json)" https://eu.gcr.io
这将生成" https://eu.gcr.io"的条目。在~/.docker/config.json
文件中。
将JSON结构复制到" https://eu.gcr.io"进入名为"〜/ docker-config.json"的新文件,删除换行符!例如:
{"https://eu.gcr.io": { "auth": "<key>","email": "your@email.se"}}
Base64对此文件进行编码:
$ cat ~/docker-config.json | base64
这将打印一个长的base64编码字符串,复制此字符串并将其粘贴到图像拉秘密定义(称为~/pullsecret.yaml
)中:
apiVersion: v1 kind: Secret metadata: name: mykey data: .dockercfg: <paste base64 encoded string here> type: kubernetes.io/dockercfg
现在创建秘密:
$ kubectl create -f ~/pullsecret.yaml
apiVersion: v1 kind: Pod metadata: name: foo namespace: awesomeapps spec: containers: - image: "janedoe/awesomeapp:v1" name: foo imagePullSecrets: - name: mykey
或将其添加到service account。
答案 1 :(得分:8)
kubectl
更容易kubectl create secret docker-registry mydockercfg \
--docker-server "https://eu.gcr.io" \
--docker-username _json_key \
--docker-email not@val.id \
--docker-password=$(cat your_service_account.json)
从谷歌下载your_service_account.json后的一个重要细节是 将json中的所有行加入一行。
答案 2 :(得分:2)
答案 3 :(得分:2)
此答案确保您的Kubernetes秘密中只包含一组泊坞窗凭据,并为您处理修剪换行符。
按照Johan的好回答中的前三个步骤:
转到Google Developer Console&gt; Api经理&gt;凭据并单击“创建凭据”并创建“服务帐户密钥”
在“服务帐户”下选择新密码并将新密钥命名为“gcr”(让密钥类型为json)
创建密钥并将文件存储在磁盘上(从这里我们假设它存储在steps[]
下)
接下来,运行这些命令以生成并将所需的Docker凭据注入您的集群:
~/secret.json
当您指定从GCR中提取图片的Pod时,请在export GCR_KEY_JSON=$(cat ~/secret.json | tr -d '\n')
mv ~/.docker/config.json ~/.docker/config-orig.json
cat >~/.docker/config.json <<EOL
{
"auths": {
"gcr.io": {}
}
}
EOL
docker login -e not@val.id -u _json_key -p "$GCR_KEY_JSON" https://gcr.io
export DOCKER_CONFIG_JSON_NO_NEWLINES=$(cat ~/.docker/config.json | tr -d '\n')
mv ~/.docker/config-orig.json ~/.docker/config.json
cat >secrets.yaml <<EOL
apiVersion: v1
kind: Secret
metadata:
name: gcr-key
data:
.dockerconfigjson: $(echo -n ${DOCKER_CONFIG_JSON_NO_NEWLINES} | base64 | tr -d '\n')
type: kubernetes.io/dockerconfigjson
EOL
kubectl create -f secrets.yaml
部分中添加gcr-key
秘密名称:
spec
答案 4 :(得分:1)
从official ways,你可以:
$ docker login -e 1234@5678.com -u _json_key -p "$JSON_KEY" https://gcr.io
注意:未使用电子邮件,因此您可以随意添加任何内容。
将gcr.io
更改为Google Container Registry中显示的域名(例如eu.gcr.io
)。
获取$JSON_KEY
:
Docker Registry (read-only)
keyfile.json
JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
登录后,您只需运行docker pull
即可。您还可以复制更新的~/.dockercfg
以保留设置。
答案 5 :(得分:1)
不需要图像拉取秘密,可以通过IAM配置完成
我尝试了其他答案,但我无法使用Image Pull Secret方法。
但是我发现可以通过在Kubernetes群集所在的项目中授予对计算引擎默认服务帐户的访问权限来完成此操作。此服务帐户由GCP自动创建。
您需要执行以下命令以授予对容器注册表
服务的云存储桶的访问权限gsutil iam ch serviceAccount:[EMAIL-ADDRESS]:objectViewer gs://[BUCKET_NAME]
<强> BUCKET_NAME:强>
artifacts.[PROJECT-ID].appspot.com for images pushed to gcr.io/[PROJECT-ID], or
[REGION].artifacts.[PROJECT-ID].appspot.com, where [REGION] is:
us for registry us.gcr.io
eu for registry eu.gcr.io
asia for registry asia.gcr.io
电子邮件-ADDRESS:强>
The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run