CAPI 基础概念:CAPI(Cluster API)是什么、核心组件介绍

Cluster API(简称 CAPI)是 Kubernetes 社区推出的一个声明式、可扩展的集群生命周期管理项目。它允许运维人员使用 Kubernetes 原生的 API 和工具(如 kubectl、GitOps 工作流)来创建、配置、升级和销毁 Kubernetes 集群。CAPI 的核心思想是将“集群”本身视为一个 Kubernetes 资源对象,从而将基础设施管理纳入 Kubernetes 的声明式治理体系。

核心价值:CAPI 使得管理多个 Kubernetes 集群(跨云、混合云、裸金属)变得像管理 Pod 一样简单,通过 CRD(Custom Resource Definition)和控制器模式实现基础设施即代码(IaC)。

2.1 CAPI 是什么

CAPI 不是一个独立的集群安装工具,而是一个构建在 Kubernetes 之上的集群管理框架。它通过一组 CRD 和控制器,将底层基础设施(如 AWS EC2、Azure VM、vSphere 虚拟机)的创建、配置和生命周期管理抽象为 Kubernetes 资源对象。用户只需定义期望的集群状态(如节点数量、Kubernetes 版本、机器规格),CAPI 控制器便会自动协调实际状态与期望状态。

CAPI 的典型工作流如下:

  1. 定义集群模板:用户创建 Cluster 和 MachineDeployment 资源清单。
  2. 提交到管理集群:将清单应用到作为“管理集群”的 Kubernetes 集群中。
  3. 控制器协调:CAPI 控制器读取资源,调用基础设施提供商(如 AWS、Azure)的 API 创建虚拟机。
  4. 引导 Kubernetes:在新建的虚拟机上安装并配置 Kubernetes 组件,形成“工作集群”。
  5. 持续管理:用户通过更新资源清单来扩缩容、升级或销毁集群。
关键区别:传统工具(如 Terraform、Ansible)是“过程式”的,而 CAPI 是“声明式”的。你告诉 CAPI 集群“应该是什么样”,它负责“如何变成这样”。

2.2 核心组件详解

CAPI 的核心组件围绕三个主要资源对象展开:Cluster、Machine 和 MachineDeployment。它们共同构成了集群管理的声明式模型。

组件名称 资源类型 核心职责 类比 Kubernetes 原生对象
Cluster CRD 定义集群的全局配置、网络、基础设施提供商信息 Namespace(逻辑边界)
Machine CRD 代表一个具体的、单一的节点(虚拟机或物理机) Pod(单个实例)
MachineDeployment CRD 管理一组同质化的 Machine,支持滚动更新、扩缩容 Deployment(副本管理)

2.2.1 Cluster

Cluster 资源是 CAPI 中最高级别的抽象,它定义了一个 Kubernetes 集群的完整蓝图。一个 Cluster 对象包含以下关键信息:

  • 基础设施提供商引用:指向一个具体的 AWSCluster、AzureCluster 等提供商特定资源,用于定义 VPC、子网、安全组等网络基础设施。
  • 控制平面引用:指向一个 KubeadmControlPlane 或 ControlPlane 资源,用于定义控制平面节点的配置(如版本、副本数)。
  • 集群网络:定义 Pod 网络 CIDR、Service 网络 CIDR 等。
  • 拓扑信息:可选字段,用于定义集群的拓扑结构(如跨可用区部署)。
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
  name: my-production-cluster
spec:
  infrastructureRef:
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: AWSCluster
    name: my-production-cluster-aws
  controlPlaneRef:
    apiVersion: controlplane.cluster.x-k8s.io/v1beta1
    kind: KubeadmControlPlane
    name: my-production-cluster-cp
  clusterNetwork:
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12

2.2.2 Machine

Machine 资源对应集群中的一个具体节点。它封装了该节点的所有配置,包括:

  • 基础设施模板引用:指向一个 AWSMachineTemplate 或 AzureMachineTemplate,定义虚拟机规格(如实例类型、磁盘大小、镜像)。
  • 引导数据:用于初始化节点的脚本或配置(如 cloud-init)。
  • 版本信息:该节点上运行的 Kubernetes 版本。
  • 状态信息:当前节点的生命周期状态(如 Running、Provisioning、Failed)。
注意:在生产环境中,通常不直接创建 Machine 对象,而是通过 MachineDeployment 来管理。直接创建的 Machine 被称为“孤儿 Machine”,需要手动管理其生命周期。

2.2.3 MachineDeployment

MachineDeployment 是 CAPI 中用于管理一组同质化 Machine 的控制器。它提供了与 Kubernetes Deployment 类似的声明式更新和扩缩容能力。其核心功能包括:

  • 副本管理:确保指定数量的 Machine 始终处于运行状态。
  • 滚动更新:支持逐步替换旧版本的 Machine,实现零停机升级。
  • 回滚:当更新失败时,可以快速回滚到之前的 MachineTemplate 版本。
  • 扩缩容:通过调整 replicas 字段,动态增加或减少节点数量。
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: my-production-worker-md
spec:
  clusterName: my-production-cluster
  replicas: 3
  template:
    spec:
      clusterName: my-production-cluster
      version: v1.28.0
      bootstrap:
        configRef:
          apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
          kind: KubeadmConfigTemplate
          name: my-production-worker-bootstrap
      infrastructureRef:
        apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
        kind: AWSMachineTemplate
        name: my-production-worker-aws-template

2.3 核心组件关系图

下图展示了 Cluster、MachineDeployment、Machine 以及底层基础设施之间的层级关系与数据流向。

CAPI 核心组件关系图 Cluster MachineDeployment Machine (worker-0) Machine (worker-1) Machine (worker-2) 基础设施提供商 (AWS / Azure / vSphere / 裸金属) 说明:Cluster 定义集群边界;MachineDeployment 管理一组同质化 Machine;每个 Machine 对应一个基础设施实例。

2.4 组件生命周期与状态机

CAPI 中的每个核心组件都遵循一个明确的状态机。以 Machine 为例,其典型生命周期状态包括:

  • Pending:资源已创建,但基础设施尚未开始创建。
  • Provisioning:基础设施提供商正在创建虚拟机。
  • Running:虚拟机已创建,Kubernetes 节点已加入集群。
  • Deleting:正在销毁虚拟机。
  • Failed:创建或运行过程中出现不可恢复的错误。
最佳实践:在 CI/CD 流水线中,应监控 MachineDeployment 的 status.readyReplicas 字段,确保在回滚或升级操作后,所有节点都达到 Running 状态,再继续后续步骤。

2.5 核心组件对比总结

维度 Cluster Machine MachineDeployment
粒度 集群级 节点级 节点组级
是否直接管理 是(用户创建) 通常不直接创建 是(用户创建)
更新策略 不可变(需重建) 不可变(需替换) 滚动更新 / 回滚
扩缩容 不支持 不支持 支持(调整 replicas)
与回滚护栏的关系 定义回滚目标集群 回滚的最小单元 回滚的执行载体