4. CAPI 架构深度解析:管理集群与工作集群、Provider 模式、控制平面与节点管理

Cluster API (CAPI) 的核心架构围绕“管理集群”与“工作集群”的职责分离展开,并通过强大的 Provider 模式实现了对异构基础设施的抽象。本章将深入剖析这一架构,帮助您理解 CAPI 如何实现声明式的集群生命周期管理。

4.1 管理集群与工作集群:职责分离

CAPI 将 Kubernetes 集群分为两种逻辑角色,这种分离是架构设计的基石:

  • 管理集群 (Management Cluster):运行 CAPI 控制器(cluster-api-controller)和各类 Provider 控制器。它负责编排和监控所有工作集群的创建、升级、扩缩容和销毁。管理集群本身不运行用户业务负载。
  • 工作集群 (Workload Cluster):由管理集群通过声明式 API 创建和管理的“业务”集群。它运行用户的容器化应用,对 CAPI 控制器的存在无感知。
关键理解: 管理集群是“大脑”,工作集群是“四肢”。一个管理集群可以管理成百上千个工作集群,形成“一管多”的拓扑结构。管理集群本身也可以是一个自托管的工作集群,但需要遵循特定的引导流程。

下图展示了管理集群与工作集群之间的核心交互关系:

管理集群与工作集群交互架构 管理集群 (Management Cluster) CAPI 控制器 基础设施 Provider 控制器 引导/控制平面 Provider 控制器 工作集群 (Workload Cluster) 控制平面 (Control Plane) 节点 (Node) 用户 Pod / 业务应用 声明式 API (CRDs) 状态上报 / 事件 管理集群通过 Kubernetes 原生 CRD 定义工作集群的期望状态,并持续调和至实际状态

4.2 Provider 模式:基础设施抽象

Provider 是 CAPI 架构中最具扩展性的设计。它将 CAPI 核心逻辑与具体基础设施(如 AWS、vSphere、OpenStack)解耦。每个 Provider 都是一个独立的 Kubernetes 控制器,负责实现特定资源的生命周期管理。

Provider 分为四大类,下表总结了它们的职责与典型实现:

Provider 类型 核心职责 典型 CRD 示例 常见实现
基础设施 Provider 管理虚拟机、网络、存储等底层资源 AWSCluster, VSphereMachine AWS, Azure, GCP, vSphere, OpenStack
引导 Provider 生成节点启动所需的配置(如 cloud-init) KubeadmConfig Kubeadm (官方), EKS, AKS
控制平面 Provider 管理 Kubernetes 控制平面组件的生命周期 KubeadmControlPlane Kubeadm (官方), EKS, AKS
ClusterResourceSet Provider 在工作集群创建后自动应用附加资源(如 CNI) ClusterResourceSet 官方 (通用)
架构优势: Provider 模式使得 CAPI 核心代码无需关心底层细节。新增一个基础设施平台,只需开发对应的 Provider 控制器,而无需修改 CAPI 核心逻辑。这极大地降低了多集群管理在不同环境中的适配成本。

下图展示了 Provider 模式如何协同工作,完成一个工作集群的创建:

Provider 模式协同工作流程 用户 1. 提交 Cluster 清单 CAPI 核心控制器 基础设施 Provider 引导 Provider 控制平面 Provider 虚拟机 / 网络 / 存储 节点启动配置 (cloud-init) kubeadm / etcd / API Server 工作集群就绪

4.3 控制平面与节点管理

CAPI 通过两个核心 CRD 来管理集群的控制平面和节点:KubeadmControlPlane 和 MachineDeployment。它们分别对应有状态和无状态组件的生命周期。

4.3.1 控制平面管理:KubeadmControlPlane

KubeadmControlPlane (KCP) 是 CAPI 管理控制平面节点的标准方式。它封装了 kubeadm 的复杂性,提供了声明式的控制平面生命周期管理:

  • 版本管理:通过 spec.version 字段声明 Kubernetes 版本,KCP 会自动执行滚动升级。
  • 高可用:通过 spec.replicas 控制控制平面节点数量(通常为 3 或 5),确保 etcd 和 API Server 的高可用。
  • 故障自愈:当控制平面节点发生故障时,KCP 会自动创建新节点替换,并重新加入集群。
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
  name: my-cluster-control-plane
spec:
  replicas: 3
  version: v1.28.0
  machineTemplate:
    infrastructureRef:
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: AWSMachineTemplate
      name: my-cluster-cp-template
  kubeadmConfigSpec:
    clusterConfiguration:
      controllerManager:
        extraArgs:
          bind-address: "0.0.0.0"
    initConfiguration:
      nodeRegistration:
        name: '{{ ds.meta_data.local_hostname }}'

4.3.2 节点管理:MachineDeployment 与 MachineSet

工作节点(Worker Node)的管理通过 MachineDeployment 实现,其概念与 Kubernetes 原生的 Deployment 完全一致:

CAPI 资源 对应原生资源 职责
MachineDeployment Deployment 声明式管理一组 Machine 的滚动更新、扩缩容
MachineSet ReplicaSet 确保指定数量的 Machine 副本运行
Machine Pod 代表一个具体的节点(虚拟机或裸金属)
重要区别: Machine 不等同于 Kubernetes Node 对象。Machine 是 CAPI 对基础设施资源的抽象,而 Node 是 kubelet 注册到集群后的 Kubernetes 对象。CAPI 控制器会负责将 Machine 与对应的 Node 进行绑定。

以下是一个 MachineDeployment 的示例,它定义了如何创建和管理一组工作节点:

apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: my-cluster-worker-md-0
spec:
  clusterName: my-cluster
  replicas: 5
  selector:
    matchLabels:
      cluster.x-k8s.io/cluster-name: my-cluster
  template:
    spec:
      version: v1.28.0
      bootstrap:
        configRef:
          apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
          kind: KubeadmConfigTemplate
          name: my-cluster-worker-config
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: AWSMachineTemplate
        name: my-cluster-worker-template

4.4 架构总结:声明式集群生命周期

综合以上组件,CAPI 的完整架构形成了一个清晰的声明式闭环:

  1. 用户定义:通过 Cluster、KubeadmControlPlane、MachineDeployment 等 YAML 清单声明集群的期望状态。
  2. 核心调和:CAPI 核心控制器监听这些 CRD 的变化,创建对应的 Machine 和 Cluster 状态对象。
  3. Provider 执行:基础设施 Provider 创建虚拟机,引导 Provider 生成启动脚本,控制平面 Provider 初始化 Kubernetes 组件。
  4. 状态反馈:Provider 将实际状态(如 IP 地址、节点就绪状态)写回 CRD 的 status 字段。
  5. 持续调和:CAPI 控制器持续比较期望状态与实际状态,自动修复偏差(如节点故障、版本不一致)。
架构启示: 理解管理集群与工作集群的分离、Provider 的插件化设计,以及控制平面与节点的差异化治理,是掌握 CAPI 的关键。这种架构不仅适用于多云管理,也为 GitOps 流水线集成提供了天然的 API 基础。