如何使用另一个项目中的服务帐号创建 GKE

时间:2021-04-19 16:21:25

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

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

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

在项目 A 中, 项目 B 的 default-service-accounts 在我创建的服务帐户 my-service-account 上有 roles/iam.serviceAccountTokenCreator 和 roles/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"

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

这里有一些错误的图片

虚拟机页面 node-pools

GKE 页面 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",
      ]

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

通常出现上述错误可能是以下原因造成的

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

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

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

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

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

    • 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 配置可能不正确(例如解析私有 Google API 或访问公共 google API)。使用 dig 命令或查看 dns 服务器的“etc/resolv.conf”应该可以确认请求被路由到哪里。