Karmada 让多集群治理变得像单集群一样简单,实现了真正意义上的“云原生舰队”统一调度与管理。
Karmada 是由 “Kubernetes” 和 “Armada” 组合而来的。Armada 在英语中意味着”舰队”,通常指由许多船只组成的大型水面作战力量。在这里,它象征着多个集群的集合,每个集群如同一艘强大的战舰,共同组成了一个强大的”舰队”,协同工作以提高效率和资源利用率。
更多关于 Karmada 的详细信息,请访问 Karmada 官方文档。
Karmada 系统由一个控制平面(Control Plane)和多个成员集群(Member Cluster)组成。控制平面各组件协同工作,将资源分发到成员集群,并收集其状态。
```mermaid “Karmada 架构” graph TD subgraph “Karmada 控制平面” KA[“karmada-apiserver”] — ETCD[“etcd”] KA — KCM[“karmada-controller-manager”] KA — KS[“karmada-scheduler”] KA — KW[“karmada-webhook”] KA — KD[“karmada-descheduler”] KA — KAAS[“karmada-aggregated-apiserver”] KA — KUBC[“kube-controller-manager”] KA — KSR[“karmada-search”]
KCM -.- KUBC
KS -.- KSE["karmada-scheduler-estimator"]
end
User([用户]) -->|使用| KCTL["karmadactl"]
KCTL -->|管理| KA
subgraph "成员集群"
MC1["成员集群 1"]
MC2["成员集群 2"]
MCN["成员集群 N"]
end
KCM -->|分发资源| MC1 & MC2 & MCN
KS -->|调度到| MC1 & MC2 & MCN
KSE -->|资源估算| MC1 & MC2 & MCN
KD -->|驱逐工作负载| MC1 & MC2 & MCN
MC1 & MC2 & MCN -->|状态上报| KA ```
{width=3158 height=1200}
Karmada 具备以下核心特性,适用于多云和大规模多集群场景:
Karmada 的核心能力是根据策略将资源从控制平面传播到成员集群。流程如下:
```mermaid “Karmada 资源传播流程” flowchart TD User([用户]) –>|1. 创建| RT[“资源模板”] User –>|2. 创建| PP[“传播策略(PropagationPolicy/ClusterPropagationPolicy)”]
subgraph "资源检测"
RD["ResourceDetector"] -->|3. 匹配| RT & PP
RD -->|4. 创建| RB["ResourceBinding/ClusterResourceBinding"]
end
subgraph "调度"
KS["karmada-scheduler"] -->|5. 监听| RB
KS -->|6. 调度到集群| RB
end
subgraph "绑定与执行"
BC["BindingController"] -->|7. 监听| RB
BC -->|8. 创建| WO["Work 对象"]
EC["ExecutionController"] -->|9. 监听| WO
EC -->|10. 应用到集群| MC["成员集群"]
end
subgraph "依赖处理"
DD["DependenciesDistributor"] -->|11. 检测| DEP["依赖资源"]
DD -->|12. 创建| ARB["附加 ResourceBindings"]
ARB -->|13. 同步流程| BC
end
RB -->|被监听| DD ```
{width=1920 height=1525}
简要步骤说明:
下图展示了 Karmada 各类自定义资源(CRD)之间的关系:
```mermaid “Karmada 资源关系” classDiagram class PropagationPolicy { +ResourceSelectors[] +Placement +SchedulerName +PropagateDeps: bool +Failover: FailoverBehavior }
class ClusterPropagationPolicy {
+ResourceSelectors[]
+Placement
+SchedulerName
+PropagateDeps: bool
+Failover: FailoverBehavior
}
class ResourceBinding {
+Resource: ObjectReference
+Clusters[]: TargetCluster
+ReplicaRequirements
}
class ClusterResourceBinding {
+Resource: ObjectReference
+Clusters[]: TargetCluster
+ReplicaRequirements
}
class Work {
+Manifests[]
+Status: WorkStatus
}
class Placement {
+ClusterAffinity
+SpreadConstraints[]
+ClusterTolerations[]
+ReplicaScheduling
}
PropagationPolicy --> Placement
ClusterPropagationPolicy --> Placement
ResourceBinding --> "1..*" Work: creates
ClusterResourceBinding --> "1..*" Work: creates ```
{width=1920 height=722}
Karmada 支持两种资源同步模式:
Karmada 以标准 Kubernetes 资源定义为模板(如 Deployment、Service、ConfigMap 等),无需修改即可用于多集群传播。
策略内容包括资源选择器、目标集群约束、调度策略(副本分布/复制)、依赖传播、故障转移等。
用于为特定集群定制资源(如镜像仓库、存储类型、资源规格等)。
记录原始资源、目标集群、副本数、调度结果和聚合状态。
在理解 Karmada 的多集群调度机制时,最核心的概念之一就是 Work 对象(Work CRD)。
Work 对象 是 Karmada 控制平面中由执行控制器(Execution Controller)创建的中间层资源,用于描述“要同步到某个成员集群的 Kubernetes 资源清单”。
它本身不运行在成员集群中,而是控制平面与成员集群之间的“契约对象(contract object)”。
```mermaid “Work 对象在调度流程中的位置” flowchart TD A[用户创建 Deployment / Service 等资源] –> B[PropagationPolicy 匹配] B –> C[生成 ResourceBinding / ClusterResourceBinding] C –> D[“调度目标集群 (Scheduler)”] D –> E[生成 Work 对象 - 每个目标集群一个] E –> F[karmada-agent 下发 Work 到对应集群] F –> G[成员集群创建实际 Deployment/Pod] G –> H[状态回传到 Work 与 ResourceBinding]

{width=1920 height=8627}
`
> 由此可见,**Work 并非业务资源本身,而是分发“任务描述”**。
### Work 对象示例
当用户在控制平面中创建一个 `nginx` Deployment 并定义传播策略分发到两个集群(`member1`、`member2`)时,Karmada 会在控制平面中为每个目标集群生成一个 Work 对象:
```yaml
apiVersion: work.karmada.io/v1alpha1
kind: Work
metadata:
name: nginx-default-member1
namespace: karmada-es-member1 # 命名空间代表目标集群
spec:
workload:
manifests:
- apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
字段解释:
spec.workload.manifests:定义要下发的资源清单;metadata.namespace:标识目标集群(如 karmada-es-member1);status.conditions:存储该集群中资源的执行状态。下表说明了 Work 对象的同步与执行流程:
| 阶段 | 说明 |
|---|---|
| 1️⃣ 创建 | 控制平面根据调度结果为每个目标集群生成一个 Work。 |
| 2️⃣ 监听 | karmada-agent 监控对应命名空间(如 karmada-es-member1)的 Work。 |
| 3️⃣ 下发 | agent 将 Work 中的 manifests apply 到本地集群。 |
| 4️⃣ 状态上报 | agent 回传资源状态(副本数、可用性等)。 |
| 5️⃣ 聚合 | 控制平面汇总状态到 ResourceBinding,形成全局视图。 |
下表对比了 Karmada 多集群调度中的关键对象:
| 概念 | 所在位置 | 作用 | 是否运行在成员集群 |
|---|---|---|---|
| Deployment / Service | 用户层 | 定义业务资源模板 | ❌ |
| PropagationPolicy | 控制平面 | 定义资源传播策略 | ❌ |
| ResourceBinding | 控制平面 | 绑定资源与目标集群 | ❌ |
| Work | 控制平面 | 下发资源清单到目标集群 | ❌ |
| Pod / Deployment 副本 | 成员集群 | 实际运行的业务资源 | ✅ |
# 查看所有 Work 对象
kubectl get work -A --context karmada-apiserver
# 查看某个 Work 内容
kubectl get work nginx-default-member1 -n karmada-es-member1 -o yaml
# 在成员集群中验证实际部署
kubectl get deployment nginx -n default --context member1
karmada-agent 执行;Karmada 调度器基于插件框架,参考 Kubernetes 调度器,主要流程如下:
```mermaid “Karmada 调度系统” flowchart TD subgraph “调度器组件” GS[“genericScheduler”] –>|使用| FWK[“Framework”] FWK –>|包含| FP[“Filter 插件”] FWK –>|包含| SP[“Score 插件”]
FP -->|如| TT["TaintToleration"]
FP -->|如| CA["ClusterAffinity"]
FP -->|如| AE["APIEnablement"]
FP -->|如| SC["SpreadConstraint"]
SP -->|如| CL["ClusterLocality"]
SP -->|如| CAScore["ClusterAffinity"]
end
RB["ResourceBinding"] -->|调度| GS
GS -->|1. 过滤集群| FILTER["findClustersThatFit"]
FILTER -->|2. 打分集群| SCORE["prioritizeClusters"]
SCORE -->|3. 选择集群| SELECT["selectClusters"]
SELECT -->|4. 分配副本| ASSIGN["assignReplicas"]
KSE["karmada-scheduler-estimator"] -->|提供资源信息| GS ```
{width=1920 height=1133}
调度流程:
状态收集:
本节通过一个 Nginx 应用的多集群部署示例,帮助理解 Karmada 的声明式多集群调度与资源传播流程。
我们希望将一个 Nginx 应用同时部署到多个集群中:
karmada-hostmember1、member2下图展示了 Karmada 多集群部署的主要流程:
```mermaid “多集群部署流程” sequenceDiagram participant User as 用户 participant Karmada-API as Karmada API Server participant Controller as 控制器管理器 participant Scheduler as 调度器 participant Member1 as 集群 member1 participant Member2 as 集群 member2
User->>Karmada-API: 创建 Deployment(模板)
User->>Karmada-API: 创建 PropagationPolicy
Karmada-API->>Controller: 触发资源与策略匹配
Controller->>Scheduler: 生成 ResourceBinding 并请求调度
Scheduler->>Controller: 决策:派发至 member1、member2
Controller->>Member1: 创建 Work 对象并下发资源
Controller->>Member2: 创建 Work 对象并下发资源
Member1-->>Controller: 上报运行状态
Member2-->>Controller: 上报运行状态
Controller-->>User: 聚合显示全局状态(Running) ```
{width=1920 height=853}
该流程清晰地展示了「模板 → 策略 → 调度 → 传播 → 状态汇聚」的完整生命周期。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
与普通 Kubernetes Deployment 完全一致,无需修改。
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
namespace: default
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- member1
- member2
该策略定义了“哪些资源”需要被传播,以及“传播到哪些集群”。
# 1. 创建应用模板
kubectl --context karmada-apiserver apply -f nginx-deployment.yaml
# 2. 创建传播策略
kubectl --context karmada-apiserver apply -f propagation-policy.yaml
# 3. 查看资源绑定结果
kubectl --context karmada-apiserver get resourcebinding -n default
# 4. 验证 Work 下发到成员集群
kubectl --context member1 get deployment nginx -n default
kubectl --context member2 get deployment nginx -n default
执行后,Karmada 将在每个目标集群中自动创建对应的 Deployment,副本状态会同步回控制平面。
部署完成后,控制平面会聚合每个成员集群的运行状态。
kubectl --context karmada-apiserver get work -A
kubectl --context karmada-apiserver get resourcebinding -n default -o yaml
输出中可看到每个集群的资源同步状态与副本数。例如:
status:
aggregatedStatus:
- clusterName: member1
applied: true
availableReplicas: 1
- clusterName: member2
applied: true
availableReplicas: 1
下图总结了 Karmada 多集群调度与资源传播的核心机制:
mermaid "Karmada 多集群调度与传播 Pipeline"
flowchart TD
A[用户创建 Deployment/Service] --> B[PropagationPolicy 匹配资源]
B --> C[控制器生成 ResourceBinding]
C --> D[Scheduler 调度目标集群]
D --> E[Work 控制器分发资源]
E --> F[成员集群创建真实资源]
F --> G[状态上报与聚合显示]
{width=1920 height=6882}
✅ 这就是 Karmada 的核心能力:声明式多集群资源传播与调度闭环。
通过上面的流程可以看到:
在多云或混合云场景下,Karmada 可作为「多集群控制平面」的核心基础设施,实现真正意义上的 Kubernetes Federation 3.0。
Karmada 为多 Kubernetes 集群资源管理提供了完整方案,继承并扩展了 Federation 思想,具备更强大的调度、覆盖和状态聚合能力。通过兼容 Kubernetes API,组织可无缝实现多集群治理,极大提升云原生基础设施的灵活性与可扩展性。