功能介绍
在多集群的网格环境下,不同集群之间的服务之间如果需要互相访问,需要在不同集群下部署相同的服务,因为istio仅在服务名称一致的情况下,才会将集群中的端点信息推送给其他集群的pod;
因此当两个集群中服务不同的时候,需要通过DNS代理才能发现其他集群的服务;比如,在从集群中部署了sleep服务,在主集群中部署了productpage服务,istio控制面并不会将productpage的服务信息下发给从集群中的sidecar,这是因为从集群中没有与productpage同名的服务;
当打开了DNS代理功能后,从sleep发起的对prodcutpage的请求,sidecar会透明的拦截和解析productpage的pod地址,使其能够正常访问;
前提条件
在同一资源池下创建两个容器集群,并将其中一个作为主集群安装网格实例,具体步骤参考:多集群网络规划
在从集群中不存在名为 productpage 的 Service,因为这会导致 istio 向从集群下发网格中 productpage 信息,从而无法验证DNS代理功能;
部署环境
步骤一:在主集群中部署productpage应用
使用以下配置在主集群default命名空间部署productpage;
apiVersion: v1
kind: ServiceAccount
metadata:
name: productpage
---
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- name: productpage
port: 9080
targetPort: 9080
selector:
app: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage
spec:
replicas: 1
selector:
matchLabels:
app: productpage
template:
metadata:
labels:
app: productpage
sidecar.istio.io/inject: "true"
spec:
serviceAccountName: productpage
containers:
- image: 'registry-vpc-crs-huadong1.cnsp-internal.ctyun.cn/library/istio-examples-bookinfo-productpage-v1:1.16.2'
imagePullPolicy: IfNotPresent
name: productpage
ports:
- containerPort: 9080
步骤二:在从集群中部署sleep应用
使用以下配置在从集群default命名空间部署sleep;
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
sidecar.istio.io/inject: "true"
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: registry-vpc-crs-huadong1.cnsp-internal.ctyun.cn/library/curl
command: ["/bin/sleep", "infinity"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
步骤三:验证跨集群服务发现是否可用
在从集群,使用kubectl工具执行命令:`kubectl exec -it deploy/sleep -c sleep -- curl productpage:9080`,结果如下,可以看到此时在没有开启DNS代理功能的情况下,无法跨集群调用服务;
curl: (6) Could not resolve host: productpage
command terminated with exit code 6
设置DNS代理功能
1. 登录CSM控制台,在左侧导航栏,选择Sidecar管理 - Sidecar代理配置,进入配置页面;
2. 在Sidecar配置页面中,选择顶部全局TAB页,点击DNS代理功能选项,选择启用DNS代理功能,最后更新设置;具体如下图;
验证
在从集群中重新部署sleep容器;
在通过sleep容器发送请求,结果如下:
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 1683
server: envoy
date: Fri, 12 Dec 2025 10:23:41 GMT
x-envoy-upstream-service-time: 4