一、背景介紹
多集群架構下,不同 Kubernetes 集群間的服務如何互通是核心挑戰。Karmada 支持 Kubernetes Multi?cluster Service APIs(MCS),通過 ServiceExport
和 ServiceImport
實現跨集群服務發現與調用,幫助多集群服務統一管理和訪問。安裝和部署可以參考此鏈接。
二、關鍵資源與概念
資源類型 | 作用描述 | 創建位置 |
---|---|---|
ServiceExport | 聲明某服務要被跨集群導出 | 控制面集群 (Host) |
ServiceImport | 表示控制面集群導入該服務,實現跨集群訪問 | 控制面集群 (Host) |
PropagationPolicy | 用于跨集群傳播資源 | 控制面集群 (Host) |
三、ServiceExport 和 ServiceImport 的使用場景
3.1 ServiceExport 使用場景
- 服務提供方向外共享服務時使用
某個成員集群中有服務需要暴露給其他集群訪問時,需在該成員集群創建對應的ServiceExport
資源。 - 標識“這是一個跨集群共享的服務”,Karmada 根據此資源在控制面集群生成對應的
ServiceImport
,并同步給需要訪問的集群。 - 典型場景:多活架構中,各集群運行不同服務副本,需統一暴露給消費者集群。
3.2 ServiceImport 使用場景
- 服務消費方集群創建,代表該集群“導入”了某個跨集群服務,形成本地訪問入口。
- 通過
ServiceImport
,目標集群會自動創建與原服務對應的“派生服務”(Derived Service),Pod 可直接訪問。 - 典型場景:需要訪問其他集群服務的集群,為服務調用端提供訪問接口。
四、環境準備
- Karmada 已安裝并運行,控制面集群和多個成員集群已加入;
- 集群網絡環境已經打通;
- 各集群 Pod 和 Service CIDR 不沖突,網絡連通;
- 已安裝
ServiceExport
和ServiceImport
CRD,并通過PropagationPolicy
同步到成員集群。
五、操作流程
1. 在成員集群部署服務
例如,在成員集群 Member1 中部署示例應用:
apiVersion: apps/v1
kind: Deployment
metadata:name: serve
spec:replicas: 1selector:matchLabels:app: servetemplate:metadata:labels:app: servespec:containers:- name: serveimage: jeremyot/serve:0a40de8args:- "--message='hello from cluster member1 (Node: {{env \"NODE_NAME\"}} Pod: {{env \"POD_NAME\"}} Address: {{addr}})'"env:- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name
---
apiVersion: v1
kind: Service
metadata:name: serve
spec:ports:- port: 80targetPort: 8080selector:app: serve
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:name: mcs-workload
spec:resourceSelectors:- apiVersion: apps/v1kind: Deploymentname: serve- apiVersion: v1kind: Servicename: serveplacement:clusterAffinity:clusterNames:- member1
部署完成后,確保 Service 和 Deployment 運行正常。
2. 創建 ServiceExport
在控制面集群創建 ServiceExport
,聲明將 serve
服務導出:
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceExport
metadata:name: serve
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:name: serve-export-policy
spec:resourceSelectors:- apiVersion: multicluster.x-k8s.io/v1alpha1kind: ServiceExportname: serveplacement:clusterAffinity:clusterNames:- member1
通過 PropagationPolicy,將該 ServiceExport
資源傳播到 Member1。
3. 創建 ServiceImport 并傳播到目標成員集群
在控制面集群創建對應的 ServiceImport
,表示該服務已被導入:
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceImport
metadata:name: serve
spec:type: ClusterSetIPports:- port: 80protocol: TCP
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:name: serve-import-policy
spec:resourceSelectors:- apiVersion: multicluster.x-k8s.io/v1alpha1kind: ServiceImportname: serveplacement:clusterAffinity:clusterNames:- member2
再用 PropagationPolicy 將 ServiceImport
傳播到目標成員集群 Member2。
4. 訪問跨集群服務
在 Member2 集群中,Pod 可以訪問導入的服務,示例命令:
kubectl --context member2 exec -it <pod-name> -- curl <derived-service-cluster-ip>:80
這表示 Member2 集群中的 Pod 能通過 ServiceImport
自動創建的服務訪問 Member1 的應用,實現跨集群服務調用。