2. CAPI 核心概念:Cluster、Machine、MachineDeployment、MachineSet、Infrastructure Provider
Cluster API (CAPI) 的核心在于将 Kubernetes 集群的生命周期管理声明式化。理解其五大核心概念是掌握多租户集群快速创建与发布的基础。这些概念共同构成了一个从“集群定义”到“节点管理”的完整抽象层。
2.1 核心概念总览
下表概括了五个核心概念在 CAPI 体系中的角色与职责:
| 概念 | 角色 | 管理对象 | 关键特性 |
|---|---|---|---|
| Cluster | 集群蓝图 | 整个集群的规格、网络、控制平面端点 | 顶层资源,关联 Infrastructure Cluster |
| Machine | 单节点实例 | 一台虚拟机或物理机的生命周期 | 直接映射到基础设施上的计算实例 |
| MachineDeployment | 节点组控制器 | 一组同配置的 Machine(工作节点) | 提供滚动更新、扩缩容、自愈能力 |
| MachineSet | 副本集执行器 | 确保指定数量的 Machine 副本运行 | 由 MachineDeployment 管理,通常不直接操作 |
| Infrastructure Provider | 基础设施适配器 | 将 CAPI 资源翻译为云平台 API 调用 | 实现多云/混合云的关键插件 |
2.2 核心概念关系与工作流
下图展示了 CAPI 资源对象之间的层级关系与创建集群时的典型工作流:
2.3 深入理解各核心概念
2.3.1 Cluster
Cluster 资源是 CAPI 的顶层资源,它定义了集群的元数据、网络配置、控制平面端点信息,并关联到具体的 Infrastructure Cluster 资源(如 AWSCluster、VSphereCluster)。它不直接管理节点,而是作为集群的“身份证明”和“配置中心”。
2.3.2 Machine
Machine 资源代表一个具体的计算实例(虚拟机或裸金属服务器)。它包含了实例的规格(如 CPU、内存、磁盘)、镜像信息、网络配置等。Machine 的生命周期由 CAPI 控制器管理,包括创建、监控、修复和删除。
2.3.3 MachineDeployment
MachineDeployment 是管理一组同配置 Machine 的声明式控制器。它提供了类似 Kubernetes Deployment 的功能:
- 滚动更新:逐步替换旧版本的 Machine,确保服务不中断。
- 扩缩容:通过调整副本数,动态增加或减少工作节点。
- 自愈:当 Machine 故障时,自动创建新的 Machine 替换。
2.3.4 MachineSet
MachineSet 是 MachineDeployment 的底层执行者,它确保指定数量的 Machine 副本始终运行。通常用户不直接操作 MachineSet,而是通过 MachineDeployment 来间接管理。MachineSet 负责处理副本数的精确控制。
2.3.5 Infrastructure Provider
Infrastructure Provider 是 CAPI 实现多云和混合云的关键。它是一个插件,负责将 CAPI 的通用资源(如 Machine)转换为特定云平台的 API 调用。例如:
- AWS Provider:将 Machine 转换为 EC2 实例。
- vSphere Provider:将 Machine 转换为 vSphere 虚拟机。
- OpenStack Provider:将 Machine 转换为 OpenStack 实例。
2.4 核心概念对比:MachineDeployment vs. MachineSet
| 对比维度 | MachineDeployment | MachineSet |
|---|---|---|
| 用户操作对象 | 是,用户直接管理 | 否,由 MachineDeployment 管理 |
| 更新策略 | 支持滚动更新、蓝绿部署 | 仅支持替换更新 |
| 扩缩容 | 支持声明式扩缩容 | 支持,但通常不直接使用 |
| 自愈 | 支持,自动替换故障 Machine | 支持,确保副本数 |
| 版本管理 | 支持版本回滚 | 不支持版本管理 |
cluster.x-k8s.io/cluster-name 标签,确保 MachineDeployment 与目标 Cluster 正确关联。错误的标签会导致 Machine 无法加入集群。
2.5 核心概念在 YAML 中的体现
以下是一个简化的 MachineDeployment YAML 示例,展示了如何引用 Cluster 和定义工作节点规格:
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
name: my-workload-md
namespace: default
labels:
cluster.x-k8s.io/cluster-name: my-cluster
spec:
replicas: 3
selector:
matchLabels:
cluster.x-k8s.io/cluster-name: my-cluster
template:
spec:
clusterName: my-cluster
version: v1.28.0
bootstrap:
configRef:
apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
name: my-cluster-md-0
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSMachineTemplate
name: my-cluster-md-0
在这个 YAML 中:
clusterName字段将 MachineDeployment 关联到名为my-cluster的 Cluster 资源。infrastructureRef引用了 AWSMachineTemplate,这是 Infrastructure Provider 提供的资源,定义了 EC2 实例的具体规格。bootstrap引用了 KubeadmConfigTemplate,定义了节点加入集群的引导配置。