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

时间:2016-03-29 11:59:29

标签: google-cloud-platform kubernetes google-kubernetes-engine google-container-registry

我正在尝试让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_USERDOCKER_PASSWORD来验证Google Container Registry?查看docs,它说密码是您可以通过运行获得的访问令牌:

$ gcloud auth print-access-token

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

6 个答案:

答案 0 :(得分:14)

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

  1. 转到Google Developer Console> Api经理>凭据并单击"创建凭据"并创建一个"服务帐户密钥"
  2. 在"服务帐户"选择new并命名新密钥" 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. 将JSON结构复制到" https://eu.gcr.io"进入名为"〜/ docker-config.json"的新文件,删除换行符!例如:

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

  6. Base64对此文件进行编码:

    $ cat ~/docker-config.json | base64

  7. 这将打印一个长的base64编码字符串,复制此字符串并将其粘贴到图像拉秘密定义(称为~/pullsecret.yaml)中:

  8. 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中的这个拉取秘密,例如:
    3. 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)

您还可以授予群集运行的服务帐户作为GCS存储桶的访问权限:

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

This回答有一些gsutil命令可以实现这一点。

答案 3 :(得分:2)

此答案确保您的Kubernetes秘密中只包含一组泊坞窗凭据,并为您处理修剪换行符。

按照Johan的好回答中的前三个步骤:

  1. 转到Google Developer Console&gt; Api经理&gt;凭据并单击“创建凭据”并创建“服务帐户密钥”

  2. 在“服务帐户”下选择新密码并将新密钥命名为“gcr”(让密钥类型为json)

  3. 创建密钥并将文件存储在磁盘上(从这里我们假设它存储在steps[]下)

  4. 接下来,运行这些命令以生成并将所需的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

  1. 转到API Manager > Credentials
  2. 点击&#34;创建凭据&#34; &GT; 服务帐户密钥
    • 服务帐户:新服务帐户
      • 姓名:您想要的任何内容,例如Docker Registry (read-only)
      • 角色:存储(向下滚动)&gt; 存储对象查看器
    • 键类型: JSON
  3. 下载为keyfile.json
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. 现在你可以使用它。
  6. 登录后,您只需运行docker pull即可。您还可以复制更新的~/.dockercfg以保留设置。

答案 5 :(得分:1)

不需要图像拉取秘密,可以通过IAM配置完成

我尝试了其他答案,但我无法使用Image Pull Secret方法。

但是我发现可以通过在Kubernetes群集所在的项目中授予对计算引擎默认服务帐户的访问权限来完成此操作。此服务帐户由GCP自动创建。

如下所述: https://cloud.google.com/container-registry/docs/access-control#granting_users_and_other_projects_access_to_a_registry

您需要执行以下命令以授予对容器注册表

服务的云存储桶的访问权限
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