[英]Unable to pull docker image into Kubernetes Pod from Google Container Registry
[英]Creating image pull secret for google container registry that doesn't expire?
我正在嘗試讓 Kubernetes 從另一個項目的 Google Container Registry 下載圖像。 根據文檔,您應該使用以下方法創建圖像拉取機密:
$ 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 文檔,它說密碼是您可以通過運行獲得的訪問令牌:
$ gcloud auth print-access-token
這實際上有效......一段時間。 問題似乎是這個訪問令牌在(我認為是)一小時后過期。 我需要一個在創建我的圖像拉取密碼時不會過期的密碼(或其他東西)。 否則 Kubernetes 集群在一個小時左右后無法下載新鏡像。 這樣做的正確方法是什么?
這真的很棘手,但經過大量的跟蹤和錯誤之后,我想我已經可以正常工作了。
~/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 ”下的JSON結構復制到一個名為“~/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
或將其添加到服務帳戶。
使用 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 中的所有行合並為一行。 為此,您可以用paste
替換cat
:
--docker-password=$(paste -s your_service_account.json)
此答案可確保只有一組 docker 憑據包含在您的 Kubernetes 密鑰中,並為您處理換行符。
按照 Johan 的精彩回答中的前三個步驟進行操作:
轉到 Google Developer Console > Api Manager > Credentials 並單擊“創建憑據”並創建“服務帳戶密鑰”
在“服務帳戶”下選擇新的並將新密鑰命名為“gcr”(讓密鑰類型為 json)
創建密鑰並將文件存儲在磁盤上(從這里我們假設它存儲在~/secret.json
)
接下來,運行這些命令以生成所需的 Docker 憑據並將其注入到您的集群中:
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 --username _json_key --password "$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 拉取鏡像的gcr-key
,請在您的spec
部分包含gcr-key
密鑰名稱:
spec:
imagePullSecrets:
- name: gcr-key
containers:
- image: ...
從官方途徑,您可以:
$ 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
以保留設置。
不需要鏡像拉取密鑰,可以通過 IAM 配置完成
我嘗試了其他答案,但無法使用 Image Pull Secret 方法。
但是我發現這可以通過授予對 Kubernetes 集群所在項目中的Compute Engine 默認服務帳戶的訪問權限來完成。 此服務帳號是由 GCP 自動創建的。
如此處所述: https : //cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry
您需要執行以下命令來授予對為 Container Registry 提供服務的 Cloud Storage 存儲分區的訪問權限
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
電子郵件地址:
The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.