我有一个在 Google Kubernetes Engine 上运行的多集群/多区域 k8s 平台。底层 GCP VPC 网络以全局路由模式运行。k8s 服务通过 Alias IP 子网分配内部 IP(clusterIP)地址。
我可以将节点从一个集群 ping 到另一个集群,因此防火墙规则或路由通常没有问题,但我无法跨集群连接到其内部别名 IP 上的各个服务。
我可以从同一集群上的其他节点和容器连接到服务,但如果我在同一区域的 k8s 集群之外创建实例,则无法连接。
即使子网出现在 VPC 路由表中,别名 IP 范围似乎也可能未被路由。
有没有什么方法可以确保所有别名 IP 子网在整个 VPC 中正确路由?
一些细节...
kubectl get services --namespace production
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch LoadBalancer 10.0.64.103 xxx.xxx.xxx.xxx 9200:30182/TCP,9300:31166/TCP 1m
gcloud compute routes list
NAME NETWORK DEST_RANGE NEXT_HOP PRIORITY
default-route-ac89edf7c623eb22 foo 10.0.64.0/19 foo 1000
clusterIP 在列出的子网范围内,但在本地 k8s 集群之外无法访问。
答案1
对于您现有的设置,这是预期的行为。我相信您遇到的是一个别名 IP 的限制,这在本 GCP 文档中有记录“使用别名 IP 创建 VPC 原生集群“:
“内部服务的集群 IP 仅在集群内部可用。如果您想从 VPC 内部访问 Kubernetes 服务,但从集群外部(例如,从 Compute Engine 实例)访问,请使用内部负载均衡器。”
因此你应该考虑使用内部负载平衡能够从外部访问集群内部运行的服务。