【问题标题】:Kubernetes Engine unable to pull image from non-private / GCR repositoryKubernetes Engine 无法从非私有/GCR 存储库中提取映像
【发布时间】:2018-04-27 11:56:12
【问题描述】:

有一段时间我很乐意部署到 Kubernetes Engine,但在开发集成的云容器构建器管道时,我开始遇到麻烦。

我不知道发生了什么变化。我无法再部署到 kubernetes,即使是以前没有云构建器的情况下也是如此。

Pod 推出过程给出了一个错误,表明它无法从注册表中提取。这看起来很奇怪,因为图像存在(我可以使用 cli 提取它们)并且我向我的用户和云构建器服务帐户授予了所有可能相关的权限。

我收到错误 ImagePullBackOff 并在 pod 事件中看到:

拉取图片失败 “gcr.io/my-project/backend:f4711979-eaab-4de1-afd8-d2e37eaeb988”: rpc 错误:代码 = 未知 desc = 未经授权:需要身份验证

发生了什么事?谁需要授权?为了什么?

【问题讨论】:

  • 如果您使用正确的 [:TAG|@DIGEST] 和 localized hostnames,请将云存储对象查看器(也可以尝试使用管理员)分配给您的服务帐户,并导入其 secret,可能是您的集群没有正确的scopes
  • GKE 集群是否也在my-project 中?如果是这样,您能否登录到运行 pod 的节点并运行 journalctl -f -u docker 并复制粘贴 docker-engine 在拉取图像时看到的详细错误?

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


【解决方案1】:

在我的例子中,我的集群没有存储读取权限,这是 GKE 从 GCR 拉取图像所必需的。

我的集群没有适当的权限,因为我通过 terraform 创建了集群并且没有包含 node_config.oauth_scopes 块。通过控制台创建集群时,默认添加Storage读取权限。

【讨论】:

    【解决方案2】:

    我项目中的凭据不知何故搞砸了。我通过重新初始化一些 API(包括 Kubernetes Engine、Deployment Manager 和 Container Builder)解决了这个问题。

    我第一次尝试时没有成功,因为要禁用某些东西,您必须首先禁用所有依赖它的 API。如果您通过 GCloud Web UI 执行此操作,那么您可能会看到并非所有可在 UI 中禁用的服务列表。

    我了解到,使用 gcloud CLI,您可以列出项目的所有 API 并正确禁用所有内容。

    在那之后一切顺利。

    我知道事情搞砸的原因是因为我有一个与生产环境相同的东西的副本,并且这些问题不存在。开发环境进行了很多迭代,并且搞乱了凭据,所以某处事情被破坏了。

    这些是一些有用的命令示例:

    gcloud projects get-iam-policy $PROJECT_ID

    gcloud services disable container.googleapis.com --verbosity=debug

    gcloud services enable container.googleapis.com

    更多信息here,包括如何恢复服务帐户凭据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2021-01-05
      • 2020-04-27
      • 2017-07-05
      • 2020-11-02
      • 2020-07-05
      • 1970-01-01
      相关资源
      最近更新 更多