簡體   English   中英

為不會過期的谷歌容器注冊表創建圖像拉取密碼?

[英]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_USERDOCKER_PASSWORD來對 Google Container Registry 進行身份驗證? 查看GCR 文檔,它說密碼是您可以通過運行獲得的訪問令牌:

$ gcloud auth print-access-token

這實際上有效......一段時間。 問題似乎是這個訪問令牌在(我認為是)一小時后過期。 我需要一個在創建我的圖像拉取密碼時不會過期的密碼(或其他東西)。 否則 Kubernetes 集群在一個小時左右后無法下載新鏡像。 這樣做的正確方法是什么?

這真的很棘手,但經過大量的跟蹤和錯誤之后,我想我已經可以正常工作了。

  1. 轉到 Google Developer Console > Api Manager > Credentials 並單擊“創建憑據”並創建“服務帳戶密鑰”
  2. 在“服務帳戶”下選擇新的並將新密鑰命名為“gcr”(讓密鑰類型為 json)
  3. 創建密鑰並將文件存儲在磁盤上(從這里我們假設它存儲在~/secret.json
  4. 現在從命令行使用 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 ”生成一個條目。

  5. 將“ https://eu.gcr.io ”下的JSON結構復制到一個名為“~/docker-config.json”的新文件中,刪除換行符! 例如:

    {"https://eu.gcr.io": { "auth": "<key>","email": "your@email.se"}}

  6. Base64 編碼此文件:

    $ cat ~/docker-config.json | base64

  7. 這將打印一個很長的 base64 編碼字符串,復制該字符串並將其粘貼到圖像拉取機密定義中(稱為~/pullsecret.yaml ):

 apiVersion: v1 kind: Secret metadata: name: mykey data: .dockercfg: <paste base64 encoded string here> type: kubernetes.io/dockercfg
  1. 現在創建秘密:

    $ kubectl create -f ~/pullsecret.yaml

  2. 現在您可以從 pod 中使用這個 pull secret,例如:
 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)

您還可以授予集群運行的服務帳戶訪問 GCS 存儲桶的權限:

  eu.artifacts.{project-id}.appspot.com

這個答案有一些gsutil命令來實現這一點。

此答案可確保只有一組 docker 憑據包含在您的 Kubernetes 密鑰中,並為您處理換行符。

按照 Johan 的精彩回答中的前三個步驟進行操作:

  1. 轉到 Google Developer Console > Api Manager > Credentials 並單擊“創建憑據”並創建“服務帳戶密鑰”

  2. 在“服務帳戶”下選擇新的並將新密鑰命名為“gcr”(讓密鑰類型為 json)

  3. 創建密鑰並將文件存儲在磁盤上(從這里我們假設它存儲在~/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

  1. 轉到API 管理器 > 憑證
  2. 單擊“創建憑據”>服務帳戶密鑰
    • 服務帳號:新的服務帳號
      • 名稱:任何你想要的,比如Docker Registry (read-only)
      • 作用:存儲(向下滾動)>存儲對象查看器
    • 密鑰類型: JSON
  3. 下載為keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\\n' ' ')
  5. 現在你可以使用它了。

登錄后,您只需運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM