2. CAPI 核心概念回顾

在深入多集群发布流水线与回滚策略之前,必须重新校准对 Cluster API (CAPI) 核心资源模型的理解。CAPI 的本质是使用 Kubernetes 原生声明式 API 来管理 Kubernetes 集群的生命周期。其核心抽象围绕“集群是什么”以及“集群如何被构建”展开,主要由以下七个关键概念构成。

2.1 核心资源模型总览

CAPI 将物理/虚拟集群的拓扑结构映射为一组 Kubernetes 自定义资源 (CRD)。这些资源通过控制器协作,最终达到用户定义的期望状态。下表总结了每个核心资源的职责与层级关系:

资源名称 职责定位 是否可选 典型对应关系
Cluster 顶层聚合对象,定义集群元数据、网络、控制面与基础设施的引用 必选 一个逻辑集群的根
Machine 代表一台具体的计算节点(虚拟机或裸金属) 必选 一台服务器实例
MachineDeployment 声明式管理一组同质化 Machine 的滚动更新与扩缩容 可选 K8s Deployment 的 CAPI 等价物
MachineSet 保证一组 Machine 副本数稳定,是 MachineDeployment 的下级控制器 可选 K8s ReplicaSet 的 CAPI 等价物
ControlPlane 管理控制面组件(etcd、apiserver、controller-manager、scheduler)的生命周期 必选 KubeadmControlPlane / AWSControlPlane
BootstrapProvider 生成节点初始化所需的证书、令牌和云-init 脚本 必选 KubeadmConfig / EKSConfig
InfrastructureProvider 提供底层基础设施资源的创建与销毁(网络、存储、实例) 必选 AWSCluster / DockerCluster / vSphereMachine
关键认知: Cluster 对象本身并不直接创建任何虚拟机。它更像一个“聚合根”,通过引用(spec.infrastructureRef 和 spec.controlPlaneRef)将 InfrastructureProvider 和 ControlPlane 资源串联起来。真正的资源创建由对应的 Provider 控制器完成。

2.2 资源关系与生命周期

下图展示了 CAPI 核心资源之间的依赖与所有权关系。注意 MachineDeployment 与 MachineSet 的层级关系,以及 Cluster 如何作为顶层协调者。

CAPI 核心资源关系图 CAPI 核心资源模型与依赖关系 Cluster ControlPlane InfrastructureProvider BootstrapProvider MachineDeployment MachineSet Machine controlPlaneRef infrastructureRef 通过 Machine 引用 owns owns infrastructureRef bootstrapRef 说明:实线表示直接引用(ref),虚线表示间接引用。Machine 同时引用 BootstrapProvider 和 InfrastructureProvider 完成节点初始化。

2.3 核心概念深度解析

2.3.1 Cluster — 聚合根

Cluster 对象是整个 CAPI 体系的入口。它不直接管理节点,而是通过 spec.controlPlaneRef 和 spec.infrastructureRef 将控制面与基础设施的创建委托给专门的 Provider。Cluster 控制器负责协调这两个子资源的就绪状态,并在两者都就绪后更新 Cluster 的 status.controlPlaneReady 和 status.infrastructureReady 字段。

apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: prod-cluster-01
spec:
  clusterNetwork:
    pods:
      cidrBlocks: ["10.96.0.0/12"]
    services:
      cidrBlocks: ["10.32.0.0/16"]
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    name: prod-cluster-01-cp
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: AWSCluster
    name: prod-cluster-01-aws

2.3.2 Machine — 节点原子单元

Machine 是 CAPI 中最底层的计算资源抽象。每个 Machine 对应一个具体的虚拟机或裸金属实例。它通过 spec.bootstrap.dataSecretName 引用 BootstrapProvider 生成的初始化数据,通过 spec.infrastructureRef 引用 InfrastructureProvider 定义的资源规格。Machine 控制器负责将这两个 Provider 的输出组合起来,完成节点的创建与加入。

回滚关键点: 在回滚场景中,Machine 是直接操作对象。回滚一个 MachineDeployment 本质上是创建一组新的 Machine(对应旧版本模板),并逐步删除当前版本的 Machine。Machine 的 status.phase 字段(Pending、Provisioning、Running、Deleting、Failed)是判断回滚进度的核心指标。

2.3.3 MachineDeployment 与 MachineSet — 声明式节点管理

MachineDeployment 是管理无状态工作节点组的首选方式。它提供了声明式更新策略(RollingUpdate、OnDelete)、副本数管理以及历史版本回滚能力。MachineSet 作为 MachineDeployment 的下级控制器,负责维持一组 Machine 的副本数稳定。当 MachineDeployment 更新模板时,它会创建一个新的 MachineSet,并逐步缩容旧的 MachineSet。

特性 MachineDeployment MachineSet
更新策略 支持 RollingUpdate / OnDelete 不支持,仅维持副本数
回滚能力 原生支持 kubectl rollout undo 无直接回滚,需手动调整
版本追踪 通过 Revision 历史记录 无版本概念
典型用途 生产环境工作节点管理 MachineDeployment 的内部实现

2.3.4 ControlPlane — 控制面生命周期

ControlPlane 资源(如 KubeadmControlPlane)负责管理 Kubernetes 控制面组件的生命周期。它支持高可用配置(多副本 etcd 与 apiserver)、版本升级、以及证书轮换。在回滚场景中,ControlPlane 的回滚通常比 MachineDeployment 更敏感,因为控制面版本回退可能导致 API 兼容性问题。

2.3.5 BootstrapProvider 与 InfrastructureProvider — 插件化扩展

这两个 Provider 是 CAPI 可扩展性的核心。BootstrapProvider 负责生成节点加入集群所需的引导数据(如 kubeadm join 命令、证书、令牌)。InfrastructureProvider 负责创建底层基础设施资源(如 AWS EC2 实例、VPC、安全组)。CAPI 通过接口契约(Contract)与 Provider 交互,使得同一套 CAPI 控制面可以管理不同云厂商的集群。

回滚注意事项: 当回滚 MachineDeployment 时,BootstrapProvider 生成的引导数据通常不需要回滚(因为新节点总是使用当前集群的令牌加入)。但 InfrastructureProvider 的资源(如安全组规则、负载均衡器配置)可能需要回滚,这取决于 Provider 的实现。建议在回滚前检查 Provider 的 spec 字段是否与目标版本兼容。

2.4 资源创建流程时序

下图展示了从创建 Cluster 对象到节点就绪的完整时序,帮助理解各资源之间的协作顺序:

CAPI 资源创建时序图 CAPI 资源创建时序(简化) 时间 1. 用户创建 Cluster 对象 2. Cluster 控制器创建 ControlPlane 和 InfrastructureProvider 3. InfrastructureProvider 创建底层资源(VPC、子网、安全组) 4. ControlPlane 控制器创建控制面节点(Machine + Bootstrap) 5. 用户创建 MachineDeployment,自动生成 MachineSet 和 Machine

2.5 与回滚策略的关联

理解上述核心概念后,可以明确回滚策略在 CAPI 中的落地位置:

  • 回滚粒度: 回滚操作通常作用于 MachineDeployment 和 ControlPlane 两个层级。MachineDeployment 回滚影响工作节点,ControlPlane 回滚影响控制面。
  • 版本追踪: MachineDeployment 的 spec.template 变更会触发新的 Revision。回滚时通过 spec.rollbackTo.revision 指定目标版本。
  • Provider 兼容性: 回滚时必须确保目标版本的 Machine 模板与当前 InfrastructureProvider 和 BootstrapProvider 的 API 版本兼容。跨版本回滚(如 v1alpha4 → v1beta1)可能导致 Provider 无法识别。
  • 状态观察: 回滚进度通过观察 MachineSet 的 status.availableReplicas 和 Machine 的 status.phase 来判定。
实战建议: 在编写多集群发布流水线时,建议为每个 MachineDeployment 保留至少 3 个历史 Revision(通过 spec.revisionHistoryLimit 控制)。同时,在回滚前执行 kubectl describe machinedeployment 确认当前模板与目标模板的差异,避免因 Provider 字段变更导致回滚失败。