要实现istio多集群服务互通,需共享根ca、部署多控制平面并启用东西向网关、配置serviceentry和dns解析。首先生成统一ca证书并注入各集群istio-system命名空间为cacerts密钥;再通过values-istio-multicluster-gateways.yaml部署控制平面,确保istio-eastwestgateway就绪;最后在本地集群创建serviceentry并配置coredns将*.cluster2.global解析至对应网关ip。

要让Istio管理的多个Kubernetes集群之间实现服务互通,必须打破默认的单集群隔离边界,使服务发现、mTLS认证和流量路由能跨越物理集群。这要求每个集群运行独立控制平面,并通过共享根CA、东西向网关和服务条目完成逻辑网格拼接。
准备共享根CA并注入各集群Citadel
从同一套根证书派生中间CA,是跨集群双向TLS成立的前提;若各集群使用不同根CA,证书链无法验证,Sidecar间连接将被拒绝。
在本地机器上进入Istio安装目录,执行以下命令生成统一CA材料(仅需一次):
mkdir -p multicluster-certs && cp -r samples/certs/* multicluster-certs/
对每个目标集群,用该目录下的证书创建密钥:【必须在istio-system命名空间中创建,且密钥名严格为cacerts】
kubectl create namespace istio-system
kubectl create secret generic cacerts -n istio-system \<br> --from-file=multicluster-certs/ca-cert.pem \<br> --from-file=multicluster-certs/ca-key.pem \<br> --from-file=multicluster-certs/root-cert.pem \<br> --from-file=multicluster-certs/cert-chain.pem
部署多控制平面并启用多集群网关
每个集群都需部署完整Istio控制平面,但配置需启用跨集群能力。关键在于使用values-istio-multicluster-gateways.yaml覆盖默认值,它会自动开启东西向网关、禁用Pilot的集群内服务发现限制,并配置CA信任链。
第一步:安装CRD,等待API服务器就绪:
for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
第二步:渲染并应用控制平面清单(注意:helm template只需在任一集群执行一次,生成的istio.yaml可复用于其他集群):
helm template install/kubernetes/helm/istio --name istio --namespace istio-system \<br> -f install/kubernetes/helm/istio/values-istio-multicluster-gateways.yaml > ./istio.yaml
第三步:应用清单并确认Pod全部Running:
kubectl apply -f ./istio.yaml
第四步:检查东西向网关是否已部署:
kubectl get svc -n istio-system istio-eastwestgateway
若无输出,说明values文件未生效或Helm模板渲染失败——此时应重新核对-f路径是否指向正确的多集群配置文件。
配置远程服务导入与DNS解析
本地集群默认只能发现本集群内的服务。要调用cluster2中的service-a,必须显式告诉Istio:“这个服务存在,它在另一个集群,走网关访问”。ServiceEntry负责声明,而coredns或istio-coredns插件负责把service-a.default.svc.cluster2.global解析成cluster2的东西向网关IP。
方法一:手动创建ServiceEntry(适用于少量服务)
在cluster1中执行:
cat apiVersion: networking.istio.io/v1alpha3<br>kind: ServiceEntry<br>metadata:<br> name: service-a-in-cluster2<br>spec:<br> hosts:<br> - service-a.default.svc.cluster2.global<br> location: MESH_INTERNAL<br> ports:<br> - number: 80<br> name: http<br> protocol: HTTP<br> resolution: DNS<br> endpoints:<br> - address: <cluster2-eastwestgateway-ip><br> ports:<br> http: 15443<br>EOF</cluster2-eastwestgateway-ip>
方法二:启用自动服务发现(推荐)
在每个集群安装istio-coredns插件,并配置CoreDNS将*.global域名转发至istio-coredns,再由istio-coredns查询Pilot获取远程服务端点。该方式无需手写ServiceEntry,但要求所有集群的Pilot能通过网络互相访问其XDS接口。
方法三:用istioctl注册远程集群(调试阶段快速验证)
istioctl experimental add-to-mesh external-service \<br> --service-name service-a \<br> --service-namespace default \<br> --cluster-name cluster2 \<br> --ip <cluster2-eastwestgateway-ip></cluster2-eastwestgateway-ip>











