通過多叢集服務,讓您無需建立負載平衡,即可實現Kubernetes服務的跨叢集訪問。本文通過樣本介紹如何在Fleet執行個體上建立ServiceExport、ServiceImport等資源來管理多叢集服務,實現Kubernetes服務的跨叢集訪問。
前提條件
已開啟艦隊管理功能。具體操作,請參見開啟艦隊管理功能。
艦隊的Fleet執行個體已添加2個關聯集群(服務提供者叢集、服務消費者叢集)。具體操作,請參見添加關聯集群。
確保關聯集群的版本為1.22及以上版本。
擷取服務提供者叢集和服務消費者叢集的Kubeconfig,並通過kubectl串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
概述
通過多叢集服務實現Kubernetes服務的跨叢集訪問,打破了多叢集服務訪問的邊界。多叢集服務樣本如下圖所示。

管理員在服務提供者叢集(ACK Cluster 1)和服務消費者叢集(ACK Cluster 2)中,建立應用相關資源,包含Namespace、Deployment和Service;建立多叢集Service資源,包括ServiceExport和ServiceImport。
多叢集艦隊Fleet監聽子叢集的ServiceExport和ServiceImport資源,同步多叢集Service對應的Endpoint資訊。
在服務消費者叢集ACK Cluster 2上,Client Pod可跨叢集訪問服務提供者叢集ACK Cluster 1上的Service1。
步驟一:建立服務提供者相關資源
如果您的服務提供者叢集ACK Cluster 1已經部署了Kubernetes服務和相關資源,可以跳過此步驟。
在服務提供者叢集ACK Cluster 1上,執行以下命令,建立服務提供者命名空間。
樣本的命名空間為
provider-ns。kubectl create ns provider-ns在服務提供者叢集ACK Cluster 1上,建立服務提供者Kubernetes服務和相關的Deployment等資源。
使用以下內容,建立一個
app-meta.yaml檔案。apiVersion: v1 # 服務提供者。 kind: Service metadata: name: service1 namespace: provider-ns spec: ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: web-demo sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-demo name: web-demo namespace: provider-ns spec: replicas: 2 selector: matchLabels: app: web-demo template: metadata: labels: app: web-demo spec: containers: - image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/web-demo:0.4.0 name: web-demo env: - name: ENV_NAME value: cluster1-beijing執行以下命令,在服務提供者叢集ACK Cluster 1中建立資源。
kubectl apply -f app-meta.yaml執行以下命令,在服務提供者叢集ACK Cluster 1中建立ServiceExport資源,指定需要開放多叢集訪問的Kubernetes服務。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport metadata: name: service1 # 名稱與待開放的Kubernetes服務名稱相同。 namespace: provider-ns # 與待開放的Kubernetes服務在同一個命名空間。具體參數說明如下:
參數
說明
metadata.name
待開放的Kubernetes服務名稱。
metadata.namespace
待開放的Kubernetes服務所在的命名空間。
步驟二:配置消費者叢集
在服務消費者叢集ACK Cluster 2上,執行以下命令,建立服務提供者命名空間。
樣本的命名空間為
provider-ns。kubectl create ns provider-ns在服務消費者叢集ACK Cluster 2中,使用以下內容,建立ServiceImport資源。
apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport metadata: name: service1 namespace: provider-ns spec: ports: # 與待開放的Kubernetes服務ports相同。 - name: http port: 80 protocol: TCP type: ClusterSetIP以上範例程式碼中ServiceImport的
spec欄位僅定義了部分參數。關於spec完整的參數說明如下表所示。參數
說明
metadata.name
服務名稱,需要與待開放的Kubernetes服務名稱相同。
metadata.namespace
服務命名空間。需要與待開放的Kubernetes服務命名空間一致。
spec. ports. name
Port名稱。需要與待開放的Kubernetes服務相應欄位一致。
spec. ports. protocol
協議。需要與待開放的Kubernetes服務相應欄位一致。
spec. ports. appProtocol
應用協議。需要與待開放的Kubernetes服務相應欄位一致。
spec. ports. port
Port。需要與待開放的Kubernetes服務相應欄位一致。
spec. ips
服務VIP。由Fleet執行個體分配,無需填寫。
spec. type
支援
ClusterSetIP和Headless。當待開放的Kubernetes服務的
ClusterIP為None時,表示服務為Headless服務,設定type為Headless。否則,設定
type為ClusterSetIP。spec. sessionAffinity
會話關聯,支援
ClientIP和None。需要與待開放的Kubernetes服務相應欄位一致。spec. sessionAffinityConfig
會話關聯配置。需要與待開放的Kubernetes服務相應欄位一致。
步驟三:訪問多叢集服務
在服務消費者叢集Cluster 2中的Client Pod可以通過以下兩種方式訪問服務提供者叢集ACK Cluster 1中的Service 1。
方式一:通過新的Service名稱訪問
服務消費者叢集ACK Cluster 2建立ServiceImport後,Fleet執行個體會在服務消費者叢集ACK Cluster 2中,建立一個以amcs-為首碼的Kubernetes服務代表多叢集Service。
在服務消費者叢集ACK Cluster 2的Client Pod中,可以通過訪問amcs-service1.provider-ns來訪問服務提供者叢集ACK Cluster 1中的Service 1。
在服務消費者叢集ACK Cluster 2上執行以下命令,擷取相關Service資訊。
kubectl get service -n provider-ns預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE amcs-service1 ClusterIP 172.xx.xx.xx <none> 80/TCP 26m在服務消費者叢集ACK Cluster 2的Client Pod上執行以下命令,訪問服務提供者叢集ACK Cluster 1中的Service 1。
curl amcs-service1.provider-ns
方式二:通過新的Service網域名稱訪問
在服務消費者叢集Cluster 2中安裝或升級CoreDNS,版本要求1.9.3及以上。具體操作,請參見CoreDNS和管理組件。
修改CoreDNS組件的配置Corefile。
執行如下命令,修改CoreDNS組件的ConfigMap檔案。
kubectl edit configmap coredns -n kube-system在Corefile檔案中新增一行配置項
multicluster clusterset.local,支援多叢集服務網域名稱解析。apiVersion: v1 data: Corefile: | .:53 { errors health { lameduck 15s } ready multicluster clusterset.local #增加配置項,支援多叢集服務網域名稱解析。 kubernetes cluster.local in-addr.arpa ip6.arpa { pods verified ttl 30 fallthrough in-addr.arpa ip6.arpa } ... } kind: ConfigMap metadata: name: coredns namespace: kube-system
在服務消費者叢集Cluster 2的Client Pod上執行如下命令,訪問服務提供者叢集Cluster 1中的Service 1。
curl service1.provider-ns.svc.clusterset.local(可選)通過修改服務消費者叢集Cluster 2中Client Pod的
dnsConfig.searches,訪問多叢集服務。在Client Pod的
dnsConfig.searches欄位中增加搜尋clusterset.local的網域名稱。apiVersion: apps/v1 kind: Deployment metadata: name: client-pod namespace: consumer-ns spec: ... template: ... spec: dnsPolicy: "ClusterFirst" dnsConfig: searches: #dnsConfig,增加搜尋clusterset.local網域名稱。 - svc.clusterset.local - clusterset.local - consumer-ns.svc.cluster.local - svc.cluster.local - cluster.local containers: - name: client-pod ...執行如下命令,訪問多叢集服務。
curl service1.provider-ns
相關文檔
除了命令列方式,您也可以通過控制台方式管理多叢集服務。具體操作,請參見通過控制台管理多叢集服務。