为谷歌容器注册表创建图像拉秘密不会过期?

Joh*_*han 15 google-cloud-platform kubernetes google-kubernetes-engine google-container-registry

我正在尝试让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
Run Code Online (Sandbox Code Playgroud)

但是,我不知道DOCKER_USERDOCKER_PASSWORD我应该使用与谷歌容器注册认证?查看GCR文档,它说密码是您可以通过运行获得的访问令牌:

$ gcloud auth print-access-token
Run Code Online (Sandbox Code Playgroud)

这实际上有效......一段时间.问题似乎是这个访问令牌在(我相信是)一小时之后到期.我需要一个在创建图像拉秘密时不会过期的密码(或其他东西).否则Kubernetes群集在一小时左右后无法下载新图像.这样做的正确方法是什么?

Joh*_*han 14

这真的很棘手,但经过大量的追踪和错误,我认为我已经有了它的工作.

  1. 转到Google Developer Console> Api Manager>凭据,然后点击"创建凭据"并创建"服务帐户密钥"
  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

    这将在您的文件中生成" https://eu.gcr.io " 条目~/.docker/config.json.

  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
Run Code Online (Sandbox Code Playgroud)
  1. 现在创建秘密:

    $ kubectl create -f ~/pullsecret.yaml

  2. 现在,您可以使用pod中的此拉秘密,例如:
apiVersion: v1
kind: Pod
metadata: 
  name: foo
  namespace: awesomeapps
spec: 
  containers: 
    - image: "janedoe/awesomeapp:v1"
      name: foo
  imagePullSecrets: 
    - name: mykey
Run Code Online (Sandbox Code Playgroud)

或将其添加到服务帐户.


Gra*_*mic 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)
Run Code Online (Sandbox Code Playgroud)

从谷歌下载your_service_account.json后的一个重要细节是将json中的所有行连接成一行.

  • 或者,在`--docker-password ="$(cat your_service_account.json)"中添加围绕子shell调用的引号" (3认同)

Ric*_*sma 5

此答案可确保只有一组 docker 凭据包含在您的 Kubernetes 密钥中,并为您处理修剪换行符。

请遵循 Johan 出色答案中的前三个步骤:

  1. 转到 Google 开发者控制台 > Api Manager > 凭据,然后单击“创建凭据”并创建“服务帐户密钥”

  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
Run Code Online (Sandbox Code Playgroud)

当您指定从 GCR 提取映像的 Pod 时,请gcr-key在您的spec部分中包含秘密名称:

spec:
  imagePullSecrets:
    - name: gcr-key
  containers:
  - image: ...
Run Code Online (Sandbox Code Playgroud)

  • 这对我帮助很大,谢谢。只是给其他人提个醒,我经历了这个,并且绞尽脑汁地想知道为什么它不起作用,这是因为我们的 Pod 在非默认命名空间中运行,并且密钥需要位于同一命名空间中 - 定义Secrets.yaml 的元数据部分中的命名空间。我知道新手错误,但这可能会减轻其他人同样的痛苦。 (2认同)