【问题标题】:How to create GKE using a service account in another project如何在另一个项目中使用服务帐户创建 GKE
【发布时间】:2021-07-13 20:52:19
【问题描述】:

我有一个项目 A,我在其中创建了一个服务帐户。 我想在项目 B 中创建一个 GKE。

我按照此处列出的服务帐户模拟步骤https://cloud.google.com/iam/docs/impersonating-service-accounts

在项目 A 中, 项目 B 的默认服务帐户在我创建的服务帐户 my-service-account 上有角色/iam.serviceAccountTokenCreator 和角色/iam.serviceAccountUser

在项目 B 中, my-service-account 具有 Kubernetes 管理员角色

当我尝试创建时,我得到了错误

Error: Error waiting for creating GKE NodePool: All cluster resources were brought up, but: only 0 nodes out of 1 have registered; cluster may be unhealthy.

我正在使用 terraform 创建此集群,并且 terraform 使用的服务帐户具有 kubernetes 管理员和服务帐户用户角色。

这是它在控制台中显示的内容 GKE error

编辑:

我尝试使用 Gcloud 命令行创建 GKE

gcloud beta container --project "my-project" clusters create "test-gke-sa" --zone "us-west1-a" --no-enable-basic-auth --cluster-version "1.18.16-gke.502" --release-channel "regular" --machine-type "e2-standard-16" --image-type "COS" --disk-type "pd-standard" --disk-size "100" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" --num-nodes "3" --enable-stackdriver-kubernetes --enable-private-nodes --master-ipv4-cidr "192.168.0.16/28" --enable-ip-alias --network "projects/infgprj-sbo-n-hostgs-gl-01/global/networks/my-network" --subnetwork "projects/my-network/regions/us-west1/subnetworks/my-subnetwork" --cluster-secondary-range-name "gke1-pods" --services-secondary-range-name "gke1-services" --default-max-pods-per-node "110" --no-enable-master-authorized-networks --addons HorizontalPodAutoscaling,HttpLoadBalancing,GcePersistentDiskCsiDriver --enable-autoupgrade --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 0 --enable-shielded-nodes --shielded-secure-boot --node-locations "us-west1-a" --service-account="my-service-account@project-a.iam.gserviceaccount.com"

遇到同样的错误。 我看到创建了节点池,但没有创建节点。 (或者至少它们没有连接到节点池?)

这里有更多错误图片

虚拟机页面

GKE 页面

解决方案:最后,我想出了什么问题。我只将令牌创建者角色授予默认服务帐户。当我也将相同的角色赋予默认服务代理时,它开始工作。所以基本上

role = "roles/iam.serviceAccountTokenCreator",
members = [
        "serviceAccount:{project-number}-compute@developer.gserviceaccount.com",
        "serviceAccount:service-{project-number}@container-engine-robot.iam.gserviceaccount.com",
        "serviceAccount:service-{project-number}@compute-system.iam.gserviceaccount.com",
      ]

【问题讨论】:

  • 您确定这是服务帐户问题吗?
  • 我是这么认为的,因为如果我使用默认服务帐户,它会在没有错误的情况下创建。

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


【解决方案1】:

只是为了确认这是一个服务帐户错误而不是涉及 Terraform 的问题,我建议您:

A.模拟项目 A 的服务帐户,并使用此命令确认您是您想要成为的人 - gcloud auth list(活动帐户是旁边带有星号的帐户),然后

B.尝试使用gcloud container clusters create - here are the reference docs 在项目 B 中创建一个集群,但您也可以:

  1. 转到 控制台 > Kubernetes Engine
  2. 点击“创建”,
  3. 向下滚动到表单底部并单击“命令行”链接以启动一个模式,该模式会生成您要运行的 CLI 命令的语法
  4. 复制、粘贴、调整以使其仅创建一个节点以及您要更改的其他基本设置...确保指定--project=project-B
  5. 运行命令

这可能会给您提供更有用的错误消息。或者至少是一个不同的,所以,万岁?

【讨论】:

  • 感谢您的回答,我尝试使用命令行(将代码粘贴到原始问题中)并得到相同的错误。此时,我正在考虑服务帐户的权限问题
  • @ChandanG 还感兴趣的是,在项目 B 中,my-service-account 具有 Kubernetes Engine Admin 角色,但您没有提到项目 B 的 Compute Engine 默认服务帐户是否已被赋予角色/ iam.serviceAccountUser。 (查看 roles/container.admin 此处:cloud.google.com/kubernetes-engine/docs/how-to/iam#predefined
  • 我认为创建 GKE 本身的用户需要该角色。是的,我已将角色/iam.serviceAccountUser 赋予我的服务帐户
【解决方案2】:

通常上述错误可能是由以下原因引起的

1] 如果是共享 VPC,请验证 IAM permissions 是否正确。

2] 验证已创建自动生成的入口防火墙规则

  • 通常会创建三个防火墙规则

    • gke-${cluster_name}-${random_char}-all : pod 到 pod 通信的防火墙规则

    • gke-${cluster_name}-${random_char}-master : Master 与节点对话的规则

    • gke-${cluster_name}-${random_char}-vms : 节点到节点通信

随机字符:随机字符

3] 检查防火墙规则以阻止出口。

默认情况下,GCP 创建允许所有出口的防火墙规则。如果您删除规则或拒绝所有出口,则必须配置防火墙规则,允许通过 tcp 端口 443、10250 在主 CIDR 块上进行出口。私有集群防火墙规则Private Cluster Firewall Rules 记录了如何获取主 CIDR 块。

-如果您启用其他 GKE 附加组件,您可能需要添加额外的出口防火墙规则。

4] 检查 DNS 配置以与 Google API 进行通信。

利用 Kubelet logs 检查任何 curl 失败的请求。例如:在 kubelet 安装期间无法解析主机或连接超时。 dns 配置可能不正确(例如解析私有谷歌 API 或点击公共谷歌 API)。一个 dig 命令或查看 dns 服务器的“etc/resolv.conf”应该确认请求被路由到哪里。

【讨论】:

  • 不走运,也没有任何错误级别的日志,都只是信息级别,我无法理解。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2019-03-06
  • 2021-09-27
相关资源
最近更新 更多