如何在Google Cloud的不同Kubernetes集群间访问内部Service
GCP环境下Kubernetes集群间内部访问Service的方案
针对你在GCP上的两个K8s集群需要跨集群内部访问Service的需求,以下是几种无需暴露公网的实现方案:
1. VPC网络对等连接(VPC Peering)+ 自定义DNS解析
这是最直接的GCP原生方案,核心是打通两个集群所在的VPC网络,再配置DNS实现跨集群Service域名解析:
- 确认两个GKE集群均为VPC原生集群(当前GKE默认采用该模式,若为旧版集群需先完成迁移)
- 创建VPC对等连接:
使用gcloud命令在两个VPC之间建立 peering:# 创建ClusterA VPC指向ClusterB VPC的对等连接 gcloud compute networks peerings create clusterA-to-clusterB \ --network=clusterA-vpc \ --peer-network=clusterB-vpc \ --auto-create-routes # 创建ClusterB VPC指向ClusterA VPC的反向对等连接 gcloud compute networks peerings create clusterB-to-clusterA \ --network=clusterB-vpc \ --peer-network=clusterA-vpc \ --auto-create-routes - 配置跨集群DNS解析:
修改每个集群的CoreDNS ConfigMap,添加对方集群的Service域解析规则。以ClusterB访问ClusterA的Service为例:
其中# 编辑ClusterB的coredns配置 kubectl edit configmap coredns -n kube-system # 在Corefile中新增以下解析规则 clusterA.svc.cluster.local:53 { forward . <ClusterA的kube-dns ClusterIP> cache 30 }<ClusterA的kube-dns ClusterIP>可在ClusterA中通过kubectl get svc kube-dns -n kube-system获取。
2. 使用GCP共享VPC(Shared VPC)
如果两个集群属于同一GCP组织,可将它们部署到共享VPC中,实现集群网络天然连通:
- 在GCP控制台创建共享VPC,将两个集群所在项目设置为共享VPC的服务项目
- 将集群迁移或重新创建到共享VPC的子网内
- 此时集群间Pod可直接访问对方的ClusterIP,再通过方案1的CoreDNS配置实现Service域名的跨集群解析
3. 基于Istio服务网格的多集群部署
若需要精细化流量管理(如熔断、灰度发布),可使用GKE上的Istio服务网格:
- 在两个GKE集群中分别部署Istio,开启多集群模式(需先通过VPC对等连接打通集群网络)
- 配置Istio全局服务发现,让两个集群的Service自动同步到彼此的服务注册表
- 完成配置后,可直接在ClusterB中通过
serviceA.namespaceA.svc.cluster.local访问ClusterA的Service,Istio会自动处理跨集群流量路由
注意:所有方案的前提是两个集群的Pod CIDR和Service CIDR不能重叠,否则会引发路由冲突。
内容的提问来源于stack exchange,提问作者Arif
相关产品推荐
相关产品推荐

