2. Cluster API 核心概念回顾:Cluster、Machine、MachineDeployment、MachineSet 资源模型与 API 设计哲学

在深入查询优化与样本留存之前,必须重新审视 Cluster API(CAPI)的四个核心资源模型。这些资源不仅是声明式集群生命周期的基石,其 API 设计哲学也直接决定了查询模式、索引策略与数据留存边界。本节从资源定义、关系拓扑与设计意图三个维度进行回顾。

2.1 核心资源模型一览

资源名称 API 版本(典型) 作用域 核心职责 是否直接管理计算实例
Cluster cluster.x-k8s.io/v1beta1 Namespace 定义集群拓扑、基础设施提供商、控制面与网络配置 否
Machine cluster.x-k8s.io/v1beta1 Namespace 表示一台工作节点或控制面节点的期望状态与当前状态 是(通过基础设施模板)
MachineDeployment cluster.x-k8s.io/v1beta1 Namespace 声明式管理一组同质 Machine 的滚动更新、扩缩容与自愈 间接(通过 MachineSet)
MachineSet cluster.x-k8s.io/v1beta1 Namespace 保证指定数量的 Machine 副本运行,支持原地升级与回滚 间接(通过 Machine)
关键区分:Machine 是“原子单元”,直接映射到一台虚拟机或裸金属实例;MachineDeployment 与 MachineSet 是“编排单元”,负责副本管理与版本控制。Cluster 是“聚合根”,持有全局拓扑与提供商引用。

2.2 资源关系拓扑与所有权链

四个资源之间通过 ownerReferences 与 cluster.x-k8s.io/cluster-name 标签形成严格的所有权树。理解这一拓扑是设计高效查询与样本留存策略的前提。

所有权链(自上而下):
Cluster → MachineDeployment → MachineSet → Machine → InfrastructureMachine(如 AWSMachine / GCPMachine)

以下 SVG 图展示了核心资源之间的层级关系与标签传递路径:

Cluster API 核心资源关系拓扑 Cluster API 核心资源关系拓扑 Cluster MachineDeployment MachineSet Machine InfrastructureMachine 标签传递路径 cluster.x-k8s.io/cluster-name topology.cluster.x-k8s.io/owned machine-template-hash

2.3 API 设计哲学:声明式、分层与可组合

Cluster API 的设计哲学可以归纳为三个核心原则,这些原则直接影响查询优化策略:

  • 声明式终态驱动:用户通过 spec 描述期望状态,控制器通过 status 报告当前状态。查询必须区分 spec 字段(如 spec.replicas)与 status 字段(如 status.readyReplicas),避免全量拉取。
  • 分层抽象与关注点分离:Cluster 层不关心 Machine 细节,MachineDeployment 不直接管理基础设施。这种分层使得查询可以按层级裁剪——例如只查询 status.phase 为 Failed 的 Machine,而不必遍历整个集群。
  • 可组合性与模板化:MachineDeployment 通过 spec.template.spec 引用 Machine 模板,Machine 通过 spec.infrastructureRef 引用基础设施模板。这种组合模式要求查询时支持跨资源引用解析,对索引设计提出挑战。

2.4 关键字段与查询关注点

资源 关键查询字段 查询优化关注点
Cluster status.phase, spec.infrastructureRef, spec.controlPlaneRef 按阶段过滤、关联控制面与基础设施提供商
Machine status.phase, status.nodeRef, spec.clusterName, metadata.labels 按生命周期阶段、节点关联、集群标签过滤
MachineDeployment spec.replicas, status.readyReplicas, spec.template.spec.version 按副本状态、Kubernetes 版本过滤
MachineSet spec.replicas, status.availableReplicas, metadata.ownerReferences 按可用副本数、所属 MachineDeployment 过滤
常见陷阱:直接对 status.phase 做字符串匹配时,注意 Pending、Provisioning、Running、Deleting、Failed 等阶段之间的转换路径。查询 Failed 状态的 Machine 时,应同时检查 status.failureReason 与 status.failureMessage 以获取根因。

2.5 设计哲学对查询优化的启示

从 API 设计哲学出发,可以推导出以下查询优化原则:

  1. 按层级裁剪:优先在 Cluster 级别过滤,再下钻到 MachineDeployment 或 MachineSet,避免全量扫描。
  2. 利用标签索引:Cluster API 控制器自动为资源添加 cluster.x-k8s.io/cluster-name 标签,应将其作为查询的第一级过滤条件。
  3. 避免跨资源 JOIN:由于资源之间通过 ownerReferences 关联,查询时应尽量使用 fieldSelector 而非在应用层做内存 JOIN。
  4. 关注 status 而非 spec:对于监控与告警场景,status 字段变化频率远高于 spec,应优先对 status 字段建立索引或缓存。

以下 SVG 图展示了基于设计哲学的查询优化决策流程:

基于设计哲学的查询优化决策流程 基于设计哲学的查询优化决策流程 查询入口 按 cluster-name 标签过滤 按层级下钻(Deployment/Set) 按 status 字段过滤 优化效果 减少 60-80% 的 API 调用量 降低 etcd 负载与网络延迟 提升控制面响应稳定性

2.6 小结:从资源模型到查询策略

Cluster API 的资源模型并非随意设计,而是围绕声明式、分层与可组合三大哲学构建。理解这一哲学,才能在设计查询优化与样本留存策略时做出正确取舍:

  • Cluster 是查询的“入口点”,应优先过滤。
  • MachineDeployment / MachineSet 是“聚合视图”,适合批量状态查询。
  • Machine 是“原子单元”,适合细粒度故障排查与样本留存。
  • 标签与 ownerReferences 是查询的“索引命脉”,必须合理利用。
下一阶段准备:在掌握资源模型与设计哲学后,第 3 章将深入分析 Cluster API 的 etcd 存储模式与常见查询瓶颈,为后续的索引优化与缓存策略奠定基础。