我们正在使用共享 VPC 在 GCP 中构建一个新的 Kubernetes 集群。集群是在启用 VPC 原生(即别名 IP)的情况下创建的。共享 VPC 的一切似乎都井然有序。节点、pod 和服务 IP 地址均符合共享 VPC 的预期。我甚至在共享 VPC 子网上的内部负载均衡器上有一个服务,它运行良好。
但当我为外部服务运行最简单的测试时
kubectl create deployment hello-web --image=nginxdemos/hello
kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 80
kubectl get service hello-web
上一个命令指示的公共 IP 从 Chrome 获取“无法访问此站点,xxxx 响应时间过长”。
我在现有集群(既不是 VPC 原生集群,也不是共享 VPC)中运行了上述测试,并且测试成功。那么我可能遗漏了什么呢?
答案1
当 GKE 集群使用同一项目内的网络时,权限会自动存在,以允许 Kubernetes 集群服务帐户在该项目内创建防火墙规则。所以它就可以正常工作。
使用共享 VPC 时,需要授予服务项目 (GKE) 在主机项目中创建防火墙规则的权限。或者您必须手动创建防火墙规则。如果 GKE 集群无法创建防火墙规则,则会将其记录在 Kubernetes 事件中,同时记录创建规则所需的命令。
我的解决方案是将共享 VPC 主机项目中的角色 compute.securityAdmin 授予 GKE 服务项目中的服务帐户:service-[project-number]@container-engine-robot.iam.gserviceaccount.com。
上述角色可能有点过度。至少,服务帐户需要该角色内的 compute.firewalls.* 规则。