GCP Kubernetes没有使用服务帐户来拉取Docker镜像。

3
我正在使用一个Kubernetes托管集群中的最新版本的Google Kubernetes(1.22.8-gke.202)。我还有一个自定义的服务帐户,它可以访问“Artifact Registry Reader”范围,应该授予它从存储库中拉取私有映像的权限 - 我称之为custom-service-account
我已验证节点本身在Compute Engine中链接到custom-service-account服务帐户。Kubernetes设置了一个服务帐户,通过工作负载标识与同名的IAM服务帐户相链接。然而,当我尝试启动从我的私有仓库中拉取的Pod时,它一直失败。
Events:
  Type     Reason             Age                   From                Message
  ----     ------             ----                  ----                -------
  Warning  FailedScheduling   21m (x3 over 24m)     default-scheduler   0/2 nodes are available: 2 node(s) were unschedulable.
  Warning  FailedScheduling   19m                   default-scheduler   no nodes available to schedule pods
  Normal   NotTriggerScaleUp  18m (x25 over 24m)    cluster-autoscaler  pod didn't trigger scale-up: 1 node(s) had taint {reserved-pool: true}, that the pod didn't tolerate
  Normal   Scheduled          18m                   default-scheduler   Successfully assigned default/test-service-a-deployment-5757fc5797-b54gx to gke-personal-XXXX--personal-XXXX--ac9a05b6-16sb
  Normal   Pulling            17m (x4 over 18m)     kubelet             Pulling image "us-central1-docker.pkg.dev/personal-XXXX/my-test-repo/my-test-repo-business-logic:latest"
  Warning  Failed             17m (x4 over 18m)     kubelet             Failed to pull image "us-central1-docker.pkg.dev/personal-XXXX/my-test-repo/my-test-repo-business-logic:latest": rpc error: code = Unknown desc = failed to pull and unpack image "us-central1-docker.pkg.dev/personal-XXXX/my-test-repo/my-test-repo-business-logic:latest": failed to resolve reference "us-central1-docker.pkg.dev/personal-XXXX/my-test-repo/my-test-repo-business-logic:latest": failed to authorize: failed to fetch anonymous token: unexpected status: 403 Forbidden
  Warning  Failed             17m (x4 over 18m)     kubelet             Error: ErrImagePull
  Warning  Failed             16m (x6 over 18m)     kubelet             Error: ImagePullBackOff
  Normal   BackOff            3m27s (x65 over 18m)  kubelet             Back-off pulling image "us-central1-docker.pkg.dev/personal-XXXX/my-test-repo/my-test-repo-business-logic:latest"

我也已经通过ssh登录到节点本身,至少默认情况下使用常规的docker pullcrictl pull命令时会看到相同的错误。

因此,我有以下具体问题:

  • GCP是如何将服务帐户凭据注入尝试启动镜像的Kubernetes/Docker工作程序中的?正常的docker命令似乎没有这些凭据,这是否是预期的?
  • 除了在pod上继承服务帐户之外,我是否需要手动引导一些额外的Kubernetes身份验证?

编辑:此处的结果。

> gcloud container clusters describe personal-XXXX-gke --zone us-central1-a --format="value(workloadIdentityConfig.workloadPool)"
personal-XXXX.svc.id.goog

> gcloud container node-pools describe personal-XXXX-gke-node-pool --cluster personal-XXXX-gke --format="value(config.workloadMetadataConfig.mode)" --zone us-central1-a
GKE_METADATA

> kubectl describe serviceaccount --namespace default be-service-account
Name:                be-service-account
Namespace:           default
Labels:              <none>
Annotations:         iam.gke.io/gcp-service-account: custom-service-account@personal-XXXX.iam.gserviceaccount.com
Image pull secrets:  <none>
Mountable secrets:   be-service-account-token-jmss9
Tokens:              be-service-account-token-jmss9
Events:              <none>

> gcloud iam service-accounts get-iam-policy custom-service-account@personal-XXXX.iam.gserviceaccount.com
bindings:
- members:
  - serviceAccount:personal-XXXX.svc.id.goog[default/be-service-account]
  role: roles/iam.workloadIdentityUser
etag: BwXjqJ9DC6A=
version: 1

你是否查阅过这个链接 https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#troubleshooting? - dany L
@danyL 已确认步骤1-5(已在我的帖子中编辑了具体信息),但不确定如何检查第6步集群网络策略是否正确。我没有明确配置过任何内容,不确定GCP是否会自动设置一个,或者我的VPC级别上的其他防火墙规则是否恰好会阻止它们。但我可以访问开放的Web,所以我认为这不是问题。 - PF1
由于这个错误[unexpected status: 403 Forbidden],我认为这不是网络问题,所以我们现在可以忽略6。你有检查范围吗?https://cloud.google.com/artifact-registry/docs/access-control#gke - dany L
@danyL 服务账户的范围是正确的。您是指节点本身的范围吗? - PF1
@danyL,我已经明确地将“cloud-platform”范围添加到节点池中,这似乎有效。但是文档提到,“默认情况下,使用自定义服务帐户创建集群或节点池会授予cloud-platform访问范围。” 你有什么想法,为什么似乎不是这种情况,以及为什么需要这个特定的范围? - PF1
显示剩余2条评论
2个回答

3

在检查访问工件注册表时,请根据此文档检查权限和范围。


1
这很有帮助,谢谢。我发现其中一个节点池缺少了“cloud-platform”范围,这导致了间歇性的故障。您可以使用“$ gcloud container clusters describe…”命令查看节点池的作用域。 - groksrc

0

根据您的集群创建方式,会添加不同的范围。 https://cloud.google.com/kubernetes-engine/docs/how-to/access-scopes#create_with_sa

在我的情况下,我从控制台(UI)创建了Autopilot集群,并且像您一样做了所有关于链接服务帐户的事情 - 结果是应用的默认服务帐户没有获得cloud-platform范围。

最终我重新创建了具有正确服务帐户(非默认)的集群,以供我的autopilot节点使用。 https://cloud.google.com/sdk/gcloud/reference/container/clusters/create#--scopes。未来创建可能更适合使用CLI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接