2. Kubernetes 集群管理基础:单集群 vs 多集群、集群生命周期管理挑战、声明式集群管理理念
2.1 单集群架构的局限性与多集群的必然性
在 Kubernetes 的早期实践阶段,大多数团队从单集群起步。单集群架构在开发测试、小规模生产环境中表现良好,但随着业务规模扩大、合规要求增加以及容灾需求的提升,单集群的局限性逐渐暴露。
核心认知: 单集群不是错误的选择,而是成长的起点。当集群规模超过 5000 节点、或需要跨区域部署、或必须满足数据主权隔离时,多集群架构便成为必然。
| 对比维度 | 单集群 | 多集群 |
|---|---|---|
| 故障域 | 控制平面单点,etcd 故障影响全局 | 故障隔离,单个集群宕机不影响其他集群 |
| 升级风险 | 原地升级影响所有工作负载 | 滚动升级,逐个集群迁移流量 |
| 资源配额 | 共享资源池,租户间互相干扰 | 物理隔离,按集群分配资源上限 |
| 网络延迟 | 所有 Pod 在同一网络域 | 可部署到不同区域,降低用户延迟 |
| 合规性 | 数据存储位置单一 | 按地域/法规要求部署独立集群 |
| 管理复杂度 | 低,单一 API Server | 高,需要统一管理平面 |
多集群架构并非简单地将多个集群拼凑在一起,而是需要一套标准化的生命周期管理机制来应对以下核心挑战。
2.2 集群生命周期管理的四大挑战
手动管理一个集群已经需要大量运维精力,当集群数量增长到数十甚至上百个时,传统的手动或脚本化方式将彻底失效。以下是多集群生命周期管理中最突出的四个挑战:
- 创建一致性 —— 每个集群的 Kubernetes 版本、CNI 插件、存储配置、节点规格必须保持一致,否则将导致环境差异和"在我机器上能跑"的问题。
- 升级编排 —— 跨集群的版本升级需要规划顺序、灰度策略、回滚方案,且不能影响全局业务连续性。
- 扩缩容自动化 —— 工作节点组的弹性伸缩、控制平面的高可用调整,必须与集群状态联动。
- 回收与清理 —— 临时集群或过期环境的释放需要彻底清理云资源、DNS 记录、证书和负载均衡器,避免资源泄漏。
常见误区: 很多团队使用 Shell 脚本 + kubectl 来管理集群生命周期。这种方式在 3-5 个集群时尚可应付,一旦超过 10 个集群,脚本的维护成本、错误处理能力和状态追踪能力将急剧下降,最终成为运维瓶颈。
下图展示了多集群生命周期中从创建到回收的完整流程,以及每个阶段需要关注的关键操作:
2.3 声明式集群管理理念
面对上述挑战,业界逐渐形成共识:集群管理应该像应用部署一样,采用声明式(Declarative)而非命令式(Imperative)的方式。声明式管理的核心思想是:用户描述"集群应该是什么样子",系统负责"如何达到这个状态"。
类比理解: 命令式管理就像给厨师一步步指令——"先切洋葱,再热油,然后翻炒";声明式管理就像告诉厨师"我要一份宫保鸡丁"——厨师知道最终目标,自行决定烹饪步骤。Kubernetes 本身正是声明式管理的典范:你提交 Deployment YAML,控制器负责将集群调整到期望状态。
声明式集群管理在 CAPI(Cluster API)中的具体体现:
- 集群对象(Cluster) —— 描述集群的完整规格,包括控制平面配置、网络拓扑、基础设施提供商信息。
- 机器模板(MachineTemplate) —— 定义工作节点的镜像、规格、启动脚本等不可变配置。
- 集群资源集(ClusterResourceSet) —— 声明集群创建后需要自动应用的附加组件(如 CNI、CSI、监控 Agent)。
- 自动修复(Self-Healing) —— 当集群状态偏离期望状态时,CAPI 控制器自动执行修正操作。
下图展示了声明式集群管理的核心工作流:用户提交期望状态,CAPI 控制器通过 reconcile 循环驱动实际状态向期望状态收敛:
2.4 从命令式到声明式的思维转变
对于习惯了 SSH 到节点执行命令的运维工程师来说,声明式管理需要一次思维上的跃迁。以下表格总结了两种模式的关键差异:
| 维度 | 命令式管理 | 声明式管理 |
|---|---|---|
| 操作方式 | 执行命令:kubeadm init、kubectl scale |
提交 YAML:kubectl apply -f cluster.yaml |
| 状态追踪 | 依赖脚本日志和人工记录 | etcd 中持久化存储期望状态 |
| 错误恢复 | 需要人工介入排查和修复 | 控制器自动重试和回滚 |
| 变更回滚 | 手动逆向操作,容易遗漏 | kubectl apply -f 旧版本.yaml 即可回滚 |
| 团队协作 | 依赖个人经验和文档 | GitOps 工作流,代码审查驱动 |
实践建议: 在引入 CAPI 之前,建议团队先在单个集群上实践声明式管理理念——将所有集群配置(包括节点池、RBAC、网络策略)以 YAML 形式管理,并纳入 Git 版本控制。当团队熟悉了"期望状态驱动"的工作方式后,再过渡到 CAPI 的多集群管理将更加平滑。