Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GKE中提取docker图像_Docker_Kubernetes_Google Kubernetes Engine - Fatal编程技术网

在GKE中提取docker图像

在GKE中提取docker图像,docker,kubernetes,google-kubernetes-engine,Docker,Kubernetes,Google Kubernetes Engine,抱歉,如果这是重复的,我还没有找到类似问题的解决方案。 我正在尝试将docker图像上传到Google Kubernetes引擎。 我以前做得很成功,但这次似乎找不到我的运气 我已经用kubectl和我的Google帐户在本地设置了Google SDK,该帐户是项目所有者,拥有所有必需的权限。 当我使用 kubectl create deployment hello-app --image=gcr.io/{project-id}/hello-app:v1 我在我的GKE控制台上看到部署一直崩溃

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

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

kubectl create deployment hello-app --image=gcr.io/{project-id}/hello-app:v1
我在我的GKE控制台上看到部署一直崩溃,因为它“无法从存储库中提取映像。ErrImagePull无法从注册表中提取映像”

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

  • 检查图像名称中的拼写错误
  • 手动拉取图像时检查错误(在Cloud Shell中一切正常)
  • 检查图像拉秘密设置 因此,基于此,我从一个具有项目视图权限的新服务帐户中手动添加了“gcr json密钥”,并将“gcr访问令牌”添加到kubectl默认服务帐户中
  • 检查群集的防火墙以确保群集可以连接到“”。顺便说一句,对于新设置的集群来说,这不应该是一个问题
pods本身提供以下错误代码:

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".]
我现在的问题是,我做错了什么,或者我如何才能找出为什么我的豆荚不能拉我的图像


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"
        }
    ]
}

它确实采取了几个步骤,您引用的博客文章似乎正确地包含了这些步骤。因此,我怀疑您的错误在其中一个步骤中

两件事:

  • 错误消息显示,
    无法提取图像“gcr.io/{project id}/hello app:v1”
    。您是否编辑了错误消息以删除您的
    {project id}
    ?如果不是,那就是一个问题

  • 我的下一个问题是第二行:
    无法解析json键
    。这表明您创建的秘密不正确:

  • 创建服务帐户并生成密钥
  • 如图所示,准确地创建机密:
    kubectl创建机密docker注册表gcr json项…
    (在
    默认
    命名空间中,除非
    --命名空间=…
    不同)
  • 使用
    ImagePullSecrets
  • 由于
    ImagePullSecrets
    的要求,我不知道还有一种类似的
    kubectl run
    替代方案,但是,您可以尝试从主机使用Docker访问您的图像:

    见:

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

    这证明:

    • 服务帐户和密钥是正确的
    • 容器图像是正确的
    这就剩下了,你的秘密创造和你的库伯内特斯规格测试

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

    如果服务帐户只需要提取图像,请使用
    storageobjectviewer
    角色/storage.objectViewer


    它确实采取了几个步骤,您引用的博客文章似乎正确地包含了这些步骤。因此,我怀疑您的错误在其中一个步骤中

    两件事:

    • 错误消息显示,
      无法提取图像“gcr.io/{project id}/hello app:v1”
      。您是否编辑了错误消息以删除您的
      {project id}
      ?如果不是,那就是一个问题

    • 我的下一个问题是第二行:
      无法解析json键
      。这表明您创建的秘密不正确:

  • 创建服务帐户并生成密钥
  • 如图所示,准确地创建机密:
    kubectl创建机密docker注册表gcr json项…
    (在
    默认
    命名空间中,除非
    --命名空间=…
    不同)
  • 使用
    ImagePullSecrets
  • 由于
    ImagePullSecrets
    的要求,我不知道还有一种类似的
    kubectl run
    替代方案,但是,您可以尝试从主机使用Docker访问您的图像:

    见:

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

    这证明:

    • 服务帐户和密钥是正确的
    • 容器图像是正确的
    这就剩下了,你的秘密创造和你的库伯内特斯规格测试

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

    如果服务帐户只需要提取图像,请使用
    storageobjectviewer
    角色/storage.objectViewer


    谢谢你详细的评论我确实编辑了错误,并更改了此帖子的项目id。-它很可能是json密钥。在第二步中,您提到要像在文章中一样添加密钥,这是否包括密钥文件的路径?因为我使用了我的本地路径,也就是说,
    kubectl创建秘密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电子邮件=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上,此构造将密钥文件的值复制并粘贴到环境变量中