首页 文章

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

提问于
浏览
14

我正在尝试让Kubernetes从另一个项目的Google Container Registry下载图像 . 根据docs,你应该使用以下方法创建一个图像拉秘密:

$ 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 docs,它表示密码是您可以通过运行获得的访问令牌:

$ gcloud auth print-access-token

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

6 回答

  • 2

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

    • 转到Google Developer Console> Api Manager>凭据,然后单击"Create credentials"并创建"service account key"

    • 在"service account"下选择new并命名新密钥"gcr"(让密钥类型为json)

    • 创建密钥并将文件存储在磁盘上(从这里我们假设它存储在 ~/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 " into a new file called "~ / docker-config.json”下的JSON结构,删除换行符!例如:

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

    • Base64编码此文件:

    $ cat ~/docker-config.json | base64

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

    apiVersion:v1
    善良:秘密
    元数据:
    姓名:mykey
    数据:
    .dockercfg:<在此处粘贴base64编码的字符串>
    键入:kubernetes.io/dockercfg

    • 现在创建秘密:

    $ kubectl create -f ~/pullsecret.yaml

    • 现在您可以从pod中使用此拉取秘密,例如:

    apiVersion:v1
    亲切:Pod
    元数据:
    名字:foo
    命名空间:awesomeapps
    规格:
    容器:

    • 图片:“janedoe / awesomeapp:v1”
      名字:foo
      imagePullSecrets:
    • 姓名:mykey

    或将其添加到service account .

  • 1

    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后的一个重要细节是 join all the lines in the json into one row.

  • 2

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

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

    This回答有一些 gsutil 命令来实现这一点 .

  • 12

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

    按照约翰的好答案,遵循相同的前三个步骤:

    • 转到Google Developer Console> Api Manager>凭据,然后点击“创建凭据”并创建“服务帐户密钥”

    • 在“服务帐户”下选择新密码并将新密钥命名为“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 -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中提取图像的Pod时,请在 spec 部分中包含 gcr-key 机密名称:

    spec:
      imagePullSecrets:
        - name: gcr-key
      containers:
      - image: ...
    
  • 7

    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

    • 转到API Manager > Credentials

    • 单击"Create credentials"> Service account key

    • 服务帐户:新服务帐户

    • 姓名:你想要的任何东西,比如 Docker Registry (read-only)

    • 角色:存储(向下滚动)> Storage Object Viewer

    • 键类型: JSON

    • 下载为 keyfile.json

    • JSON_KEY=$(cat keyfile.json | tr '\n' ' ')

    • 现在你可以使用它了 .

    登录后,您只需运行 docker pull 即可 . 您还可以复制更新的 ~/.dockercfg 以保留设置 .

  • 1

    No image pull secret is needed, it can be done by an IAM configuration

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

    但是我发现这可以通过授予对Kubernetes集群所在项目中的 Compute Engine default service account 的访问权限来完成 . 此服务帐户由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
    

    EMAIL-ADDRESS:

    The email address of the service account called: **Compute Engine default service account** in the GCP project where the Kubernetes cluster run
    

相关问题