【问题标题】:Pulling docker image in GKE在 GKE 中拉取 docker 镜像
【发布时间】:2021-03-08 13:11:44
【问题描述】:

抱歉,如果这是重复的,我还没有找到类似问题的解决方案。 我正在尝试将 docker 映像上传到 Google Kubernetes Engine。 我以前也成功过,但这次似乎找不到运气了。

我使用 kubectl 和我的 Google 帐户在本地设置了 Google SDK,该帐户是项目所有者并拥有所有必需的权限。 当我使用

kubectl create deployment hello-app --image=gcr.io/{project-id}/hello-app:v1

我在我的 GKE 控制台上看到部署,由于它“无法从存储库中拉取图像。ErrImagePull 无法从注册表中拉取图像”而持续崩溃。

它提供了 4 条建议,我现在已经检查了三次:

  • 检查图片名称中的拼写错误。
  • 手动拉取图像时检查错误(在 Cloud Shell 中一切正常)
  • 检查镜像拉取密码设置 因此,基于此https://blog.container-solutions.com/using-google-container-registry-with-kubernetes,我从具有项目查看权限的新服务帐户中手动将“gcr-json-key”以及“gcr-access-token”添加到 kubectl 默认服务帐户。
  • 检查集群的防火墙以确保集群可以连接到''。 Afaik,这不应该是新设置的集群的问题。

pod 自身提供以下错误代码:

Failed to pull image "gcr.io/{project id}/hello-app:v1": 
[rpc error: code = Unknown desc = Error response from daemon: 
Get https://gcr.io/v2/{project id}/hello-app/manifests/v1: unknown: Unable to parse json key., 
rpc error: code = Unknown desc = Error response from daemon: 
Get https://gcr.io/v2/{project id}/hello-app/manifests/v1: 
unauthorized: Not Authorized., rpc error: code = Unknown desc = Error response from daemon: 
pull access denied for gcr.io/{project id}/hello-app, 
repository does not exist or may require 'docker login': denied: 
Permission denied for "v1" from request "/v2/{project id}/hello-app/manifests/v1".]

我现在的问题是,我做错了什么或如何找出我的 pod 无法提取我的图像的原因?


Kubernetes 默认服务帐户规范:

kubectl get serviceaccount -o json
{
    "apiVersion": "v1",
    "imagePullSecrets": [
        {
            "name": "gcr-json-key"
        },
        {
            "name": "gcr-access-token"
        }
    ],
    "kind": "ServiceAccount",
    "metadata": {
        "creationTimestamp": "2020-11-25T15:49:16Z",
        "name": "default",
        "namespace": "default",
        "resourceVersion": "6835",
        "selfLink": "/api/v1/namespaces/default/serviceaccounts/default",
        "uid": "436bf59a-dc6e-49ec-aab6-0dac253e2ced"
    },
    "secrets": [
        {
            "name": "default-token-5v5fb"
        }
    ]
}

【问题讨论】:

    标签: docker kubernetes google-kubernetes-engine


    【解决方案1】:

    它确实需要几个步骤,您引用的博客文章似乎正确。因此,我怀疑您的错误出在其中一个步骤中。

    几件事:

    • 错误消息显示Failed to pull image "gcr.io/{project id}/hello-app:v1"。您是否编辑了错误消息以删除您的{project id}?如果不是,那就是一个问题。

    • 我接下来关心的是第二行:Unable to parse json key。这表明您错误地创建了密钥:

    1. 创建服务帐号并生成密钥
    2. 完全创建 Secret,如图所示:kubectl create secret docker-registry gcr-json-key...(在 default 命名空间中,除非 --namespace=... 不同)
    3. 使用ImagePullSecrets 更新 Kubernetes 规范

    由于 ImagePullSecrets 的要求,我不知道有替代的 kubectl run 等效项,但是您可以尝试使用主机上的 Docker 访问您的映像:

    见:https://cloud.google.com/container-registry/docs/advanced-authentication#json-key

    然后尝试 docker pull gcr.io/{project id}/hello-app:v1 确保 {project id} 被替换为正确的 GCP 项目 ID。

    这证明:

    • 服务帐号和密钥正确
    • 容器镜像正确

    剩下的是,您创建的 Secret 和要测试的 Kubernetes 规范。

    注意Project Viewer 的服务帐户 IAM 权限对于 GCR 访问来说过于宽泛,请参阅permissions

    如果服务帐户只需要提取图像,请使用 StorageObject Viewer (roles/storage.objectViewer)。

    【讨论】:

    • 感谢您的详尽评论。 - 我确实编辑了错误并为这篇文章更改了我的项目 ID。 - 它很可能是 json 键。在第二步中,您提到要完全按照帖子中的方式添加密钥,这是否包括密钥文件的路径?因为我使用了本地路径,即kubectl create secret docker-registyr gcr-json-key --docker-name=gcr.io --docker-username=_json_key --docker-password="$(cat C:/user/{path to local key}/key.json)" --docker-email=any@valid.email - 关于 Kubernetes 规范,我附上了默认的 kubectl serviceaccount 规范。
    • 鉴于本地路径和确切显示的版本都有效,我是否必须将我的密钥上传到云存储并将kubectl create secret ...中的路径更改为云存储目录?
    • 您似乎在 Windows 上运行。命令$(cat C:/user/{path to local key} 可能不正确。 cat C:/user/{path to local key 是否显示您的密钥? echo $(cat C:/user/{path to local key} 做同样的事情吗?在 Linux 上,此构造会将密钥文件的值复制并粘贴到环境变量中。
    • 不,您可以从本地文件系统生成密钥(请参阅我之前的评论)。 kubectl 负责在您的集群上为您生成密钥。
    • 我没有使用将imagePullSecrets 添加到 Kubernetes 默认服务帐户的机制,但是它是有意义的并且应该可以工作。我通常从部署规范中引用秘密。我将尝试这种方法,因为我在 GHCR 上有一个集群和一个可以测试的私有注册表
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2023-04-03
    相关资源
    最近更新 更多