5

$GKE_CLUSTERGoogle Cloud Platform (GCP) 项目 () 中的一个Google Kubernetes Engine (GKE) 集群 ( $GCP_PROJECT) 似乎无法pullGoogle Container Registry (GCR) Docker 映像:

kubectl config current-context

#=>

$GKE_CLUSTER

和:

kubectl get pods --namespace=$NAMESPACE

#=>

NAME        READY   STATUS             RESTARTS   AGE 
. . .       . . .   . . .              . . .      . . .
$SOME_POD   0/1     ImagePullBackOff   0          1m
. . .       . . .   . . .              . . .      . . .

和:

kubectl get events \
--field-selector involvedObject.name=$SOME_POD \
--namespace=$NAMESPACE

#=>

LAST SEEN   TYPE     REASON    OBJECT          MESSAGE
. . .       . . .    . . .     . . .           . . .
1m          Normal   BackOff   pod/$SOME_POD   Back-off pulling image "$SOME_IMAGE"
. . .       . . .    . . .     . . .           . . .

在哪里:

  • $SOME_POD形式为:deployment-replicaSet-pod
  • $SOME_IMAGE形式为:us.gcr.io/$GCP_PROJECT/name:tag

仅列出服务帐户$GCP_PROJECT

gcloud projects get-iam-policy $GCP_PROJECT \
--filter="serviceAccount" \
--flatten="bindings[].members" \
--format="value(bindings.members.split(':').slice(1:).flatten())"

#=>

XXXXXXXXXXXX-compute@developer.gserviceaccount.com
XXXXXXXXXXXX@cloudbuild.gserviceaccount.com 
XXXXXXXXXXXX@cloudservices.gserviceaccount.com  
service-XXXXXXXXXXXX@compute-system.iam.gserviceaccount.com
service-XXXXXXXXXXXX@container-engine-robot.iam.gserviceaccount.com
service-XXXXXXXXXXXX@containerregistry.iam.gserviceaccount.com  
service-XXXXXXXXXXXX@dlp-api.iam.gserviceaccount.com    
service-XXXXXXXXXXXX@gcf-admin-robot.iam.gserviceaccount.com
PPPPPPPPPPPP@appspot.gserviceaccount.com

GKE 使用以下哪些服务帐户来访问 GCR 托管的 Docker 映像?

4

3 回答 3

8

每个 GKE 节点都有一个与之关联的 IAM 服务帐户。默认情况下,节点会获得 Compute Engine 默认服务帐号,您可以通过导航到 Cloud Console 的 IAM 部分找到该帐号。

如果您使用的是非默认 Compute Engine 服务帐户,您可能需要在项目中授予服务帐户角色/storage.objectViewer 角色。检查此链接以获取更多信息。

于 2019-02-20T20:24:28.820 回答
2

Google Kubernetes Engine (GKE) 不直接访问 Google Container Registry (GCR):与 GKE 集群关联的一个或多个节点池通过 Container Registry API 推送和拉取 Docker 镜像,并通过服务帐户进行身份验证和授权。

如果您的 GKE 集群有一个节点池:

gcloud container clusters describe $GKE_CLUSTER_NAME \
--format='value(nodeConfig.serviceAccount)' \
--zone=$GKE_CLUSTER_ZONE

#=>

default

如果您的 GKE 集群有多个节点池:

gcloud container clusters describe $GKE_CLUSTER_NAME \
--zone=$GKE_CLUSTER_ZONE \
--format='value[delimiter="\n"](nodePools[].config.serviceAccount)'

#=>

default
not-default@$GCP_PROJECT_NAME.iam.gserviceaccount.com
. . .

这里的默认值是“Compute Engine 默认服务帐户”:$GCP_PROJECT_ID-compute@developer.gserviceaccount.com.

注意:默认服务。帐户。与服务不同。帐户。您可以创建的:以数字开头并以域以外的域结尾:@$GCP_PROJECT_NAME.iam.gserviceaccount.com

为了服务。帐户。为了能够pull从 GCR Docker 映像,它需要至少具有一个具有以下关联权限的关联角色:

  • storage.objects.get
  • storage.objects.list

你可能会遇到:

警告:您似乎无权访问项目 [$GCP_PROJECT_NAME],或者它不存在。

如果服务。帐户。至少没有一个具有以下关联权限的关联角色

  • resourcemanager.projects.get
  • resourcemanager.projects.list

包含上述所有四个权限的策划角色就是roles/storage.objectViewer角色。

如果你想将 Docker 镜像存储在另一个 GCP 项目中,你只需要授予 serv。帐户。由 GKE 集群中的节点池使用roles/storage.objectViewer的项目中的角色,您希望存储 Docker 映像(更多信息请参见此处)。

注意:您可能希望继续使用 GCP Artifact Registry (AR)。更多关于从 GCR 过渡到 AR的信息

于 2021-06-22T20:07:32.703 回答
1

对于 GKE,如果您有任何问题(可能与 API 的某些更改有关),您将拥有一个类似“container-engine-robot.iam.gserviceaccount.com”的帐户,您可以删除 GCE 和 GKE 的默认帐户(在“名称”下,您将看到详细信息以及属于每个资源的内容)并使用gcloud 命令重新启用服务以重新创建您的默认服务帐户,如果不只是分配“编辑”角色并重试。

于 2019-02-20T13:10:22.737 回答