在一个GCP项目下,我有多个Google Kubernetes Engine集群。
我试图了解GKE正在使用哪个服务帐户来创建Pod,特别是,当我尝试从同一项目下的Google Container存储库中读取信息时,遇到了权限被拒绝的错误。
在“ GCP IAM和管理”页面中,我看到一些我不确定其用途的帐户:
XXX-compute@developer.gserviceaccount.com - Compute Engine default service account
XXX@cloudbuild.gserviceaccount.com
XXX@cloudservices.gserviceaccount.com - Google APIs Service Agent
service-XXX@compute-system.iam.gserviceaccount.com Compute Engine Service Agent
service-XXX@container-engine-robot.iam.gserviceaccount.com - Kubernetes Engine Service Agent
service-XXX@containerregistry.iam.gserviceaccount.com - Google Container Registry Service Agent
service-XXX@dlp-api.iam.gserviceaccount.com
service-XXX@gcf-admin-robot.iam.gserviceaccount.com - Google Cloud Functions Service Agent
PPP@appspot.gserviceaccount.com - App Engine default service account
有些人有more info
链接到它们,但是它们都没有任何有关GKE部署使用的实际提示。
答案 0 :(得分:1)
对于GKE,如果您遇到任何问题(可能与API的某些更改有关),则您将拥有一个类似于“ container-engine-robot.iam.gserviceaccount.com”的帐户,可以删除以下帐户的默认帐户: GCE和GKE(在“名称”下,您将看到详细信息,并且属于每个资源),并使用gcloud command重新启用服务,以重新创建默认服务帐户(如果不只是分配“编辑”角色)然后再试一次。
答案 1 :(得分:1)
Google Kubernetes Engine (GKE) 不直接访问 Google Container Registry (GCR):一个或多个与 GKE 集群关联的节点池通过 Container Registry API 推送和拉取 Docker 映像,并通过服务帐户进行身份验证和授权。< /p>
如果您的 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
以外的域结尾。
为了服务。帐户为了能够从 GCR pull
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 映像的项目中(更多关于 here)。
注意:您可能希望继续使用 GCP Artifact Registry (AR)。详细了解从 GCR 过渡到 AR here。
答案 2 :(得分:0)
每个GKE节点都有一个与之关联的IAM服务帐户。默认情况下,将为节点提供Compute Engine默认服务帐户,您可以通过导航到Cloud Console的IAM部分找到该帐户。
如果您使用非默认的Compute Engine服务帐户,则可能需要在项目中授予服务帐户角色/storage.objectViewer角色。检查this link了解更多信息。