GKE 使用什么服务帐号访问 GCR

Mug*_*gen 4 google-compute-engine google-cloud-platform google-kubernetes-engine google-container-registry google-iam

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

kubectl config current-context

#=>

$GKE_CLUSTER
Run Code Online (Sandbox Code Playgroud)

和:

kubectl get pods --namespace=$NAMESPACE

#=>

NAME        READY   STATUS             RESTARTS   AGE 
. . .       . . .   . . .              . . .      . . .
$SOME_POD   0/1     ImagePullBackOff   0          1m
. . .       . . .   . . .              . . .      . . .
Run Code Online (Sandbox Code Playgroud)

和:

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"
. . .       . . .    . . .     . . .           . . .
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • $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
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

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

  • 为了更好地了解自定义节点服务帐户的准确性。必须在项目范围内设置角色 `storage.objectViewer`。在底层 GCR 存储桶上指定它不起作用(对于 `imagePullSecrets`)。 (2认同)

Mik*_*erg 6

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

\n

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

\n
gcloud container clusters describe $GKE_CLUSTER_NAME \\\n--format=\'value(nodeConfig.serviceAccount)\' \\\n--zone=$GKE_CLUSTER_ZONE\n\n#=>\n\ndefault\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
gcloud container clusters describe $GKE_CLUSTER_NAME \\\n--zone=$GKE_CLUSTER_ZONE \\\n--format=\'value[delimiter="\\n"](nodePools[].config.serviceAccount)\'\n\n#=>\n\ndefault\nnot-default@$GCP_PROJECT_NAME.iam.gserviceaccount.com\n. . .\n
Run Code Online (Sandbox Code Playgroud)\n

这里的默认是 \xe2\x80\x9cCompute Engine 默认服务帐户\xe2\x80\x9d: $GCP_PROJECT_ID-compute@developer.gserviceaccount.com

\n

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

\n

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

\n
    \n
  • storage.objects.get
  • \n
  • storage.objects.list
  • \n
\n

你可能会遇到:

\n
\n

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

\n
\n

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

\n
    \n
  • resourcemanager.projects.get
  • \n
  • resourcemanager.projects.list
  • \n
\n

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

\n

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

\n

注意:您可能希望继续使用 GCP Artifact Registry (AR)。有关从 GCR 过渡到 AR 的更多信息,请参见此处

\n


小智 2

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