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串連叢集。具體操作,請參見通過kubectl、CloudShell或Workbench串連叢集。
基於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!