一、背景介绍
多集群架构下,不同 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: 1
selector:
matchLabels:
app: serve
template:
metadata:
labels:
app: serve
spec:
containers:
- name: serve
image: jeremyot/serve:0a40de8
args:
- "--message='hello from cluster member1 (Node: {{env \"NODE_NAME\"}} Pod: {{env \"POD_NAME\"}} Address: {{addr}})'"
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
---
apiVersion: v1
kind: Service
metadata:
name: serve
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: serve
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: mcs-workload
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: serve
- apiVersion: v1
kind: Service
name: serve
placement:
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/v1alpha1
kind: ServiceExport
name: serve
placement:
clusterAffinity:
clusterNames:
- member1
通过 PropagationPolicy,将该 ServiceExport
资源传播到 Member1。
3. 创建 ServiceImport 并传播到目标成员集群
在控制面集群创建对应的 ServiceImport
,表示该服务已被导入:
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceImport
metadata:
name: serve
spec:
type: ClusterSetIP
ports:
- port: 80
protocol: TCP
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: serve-import-policy
spec:
resourceSelectors:
- apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceImport
name: serve
placement:
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 的应用,实现跨集群服务调用。