ACK One多集群Service支持通过MultiClusterService实现用原生Service域名跨集群服务访问。无需修改业务代码、业务Pod的DNSConfig配置或CoreDNS配置,直接使用原生Service便可实现跨集群流量路由。
前提条件
已开启舰队管理功能。
舰队的Fleet实例已添加2个关联集群(Provider Cluster & Consumer Cluster)。具体操作,请参见管理关联集群。
关联集群的版本不低于1.22。
关联集群(Provider Cluster & Consumer Cluster)的Pod CIDR已相互可通。具体操作,请参见多集群服务概述。
说明集群间的Pod CIDR互通后,请确保集群的节点池安全组已放行与之互通集群的Pod CIDR。
获取Provider Cluster、Consumer Cluster和舰队的KubeConfig,并通过kubectl连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
基于MultiClusterService的多集群服务架构
在Consumer Cluster中,通过Client Pod访问Provider Cluster中的Service流程如下:
在Provider Cluster中创建
service1
及应用Pod,在Consumer Cluster中创建要提供服务的service1
。在舰队中创建MultiClusterService(与Service1同名同namespace),并配置Provider Cluster和Consumer Cluster。
在Consumer Cluster中创建Client Pod,可以通过原生Service域名访问到Provider Cluster中的Service1的Pods。
步骤一:在Provider Cluster中部署Service1服务
使用Provider Cluster的KubeConfig,通过以下示例内容,创建
web-demo-svc-provider.yaml
。apiVersion: v1 kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: web-demo namespace: provider-ns spec: replicas: 1 selector: matchLabels: app: web-demo template: metadata: creationTimestamp: null labels: app: web-demo spec: containers: - env: - name: ENV_NAME value: cluster-provider image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0 imagePullPolicy: Always name: web-demo dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler
执行以下命令,部署
service1
服务及应用Pod。kubectl apply -f web-demo-svc-provider.yaml
步骤二:在Consumer Cluster中部署Service1服务
使用Consumer Cluster的KubeConfig,通过以下示例内容,创建
web-demo-svc-consumer.yaml
。说明只需部署Service资源以提供服务域名,无需部署实际的业务Pod。
apiVersion: v1 kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP
执行以下命令,部署
service1
服务。kubectl apply -f web-demo-svc-consumer.yaml
步骤三:在舰队中创建MultiClusterService
使用舰队的KubeConfig,通过以下示例内容,创建
multiclusterservice.yaml
。说明请将
<your consumer cluster id>
和<your provider cluster id>
替换为您关联的集群ID。MultiClusterService的
name
和namespace
需与要提供跨集群访问的服务service1
保持一致。
apiVersion: networking.one.alibabacloud.com/v1alpha1 kind: MultiClusterService metadata: name: service1 namespace: provider-ns spec: consumerClusters: - name: <your consumer cluster id> providerClusters: - name: <your provider cluster id>
执行以下命令,将
service1
对应的MultiClusterService部署到舰队。kubectl apply -f multiclusterservice.yaml
步骤四:通过Client Pod跨集群访问Service1
使用Consumer Cluster的KubeConfig,通过以下示例内容,创建
client-pod.yaml
。apiVersion: v1 kind: Pod metadata: name: curl-client namespace: customer-ns spec: containers: - name: curl-client image: registry-cn-hangzhou.ack.aliyuncs.com/dev/curl:8.11.1 command: ["sh", "-c", "sleep 12000"]
执行以下命令,在Consumer Cluster中部署Client Pod。
kubectl apply -f client-pod.yaml
执行以下命令,在Consumer Cluster中,进入Client Pod,并跨集群访问Provider Cluster的
service1
服务。kubectl exec -it -ncustomer-ns curl-client -- sh curl service1.provider-ns
预期输出:
This is cluster-provider!