我有一个项目 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"
遇到同样的错误。 我看到创建了节点池,但没有创建节点。 (或者至少它们没有连接到节点池?)
这里有一些错误的图片
解决方案:最后,我想出了什么问题。我仅将令牌创建者角色授予默认服务帐户。当我也为默认服务代理赋予相同的角色时,它开始工作。所以基本上
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",
]
答案 0 :(得分:0)
只是为了确认这是一个服务帐户错误而不是涉及 Terraform 的问题,我建议您:
A.模拟项目 A 的服务帐户并使用此命令确认您就是您想要成为的人 - gcloud auth list
(活动帐户是旁边带有星号的帐户),然后
B.尝试使用 gcloud container clusters create
- here are the reference docs 在项目 B 中创建集群,但您也可以:
--project=project-B
这可能会给您提供更有用的错误消息。或者至少是一个不同的,所以,欢呼吧?
答案 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”应该可以确认请求被路由到哪里。