4. GitOps 工作流:从 Git 仓库提交变更到 Flux 自动同步节点池配置的完整流程

本章将完整演示一次 GitOps 驱动的节点池配置变更:从开发者在 Git 仓库中修改 YAML 清单开始,到 Flux 自动检测、拉取、应用配置至目标集群的全过程。理解这一闭环流程,是后续进行配置巡检与版本回滚验证的基础。

4.1 工作流全景:GitOps 闭环的五个阶段

Flux 的节点池配置同步遵循“声明式期望 → 持续对比 → 自动调和”的核心模式。整个变更流程可划分为以下五个阶段:

阶段 参与者 核心动作 关键组件
① 提交变更 开发者 / 运维 修改节点池 YAML 并推送至 Git Git 仓库(main / feature 分支)
② 检测差异 Flux Source Controller 定期轮询 Git 仓库,发现新 Commit GitRepository CR、Source Controller
③ 协调期望 Flux Kustomize Controller 拉取最新清单,生成期望状态 Kustomization CR、Kustomize Controller
④ 应用配置 Flux Kustomize Controller 对比集群当前状态,执行 Server-Side Apply Kubernetes API Server、节点池 CRD
⑤ 确认同步 Flux / 运维 检查同步状态、资源版本、节点池状态 flux get kustomizations、kubectl
关键理解: 整个流程中,Git 仓库是唯一的事实来源(Single Source of Truth)。任何对集群节点池的手动修改都会被 Flux 在下一次调和周期中覆盖,从而保证集群状态始终与 Git 仓库保持一致。

4.2 流程详解:从 Git Push 到集群生效

4.2.1 阶段一:提交变更到 Git 仓库

运维人员修改节点池配置文件,例如调整节点池的实例规格或扩缩容范围:

# 修改节点池 YAML:调整 minSize 和 maxSize
# nodepool-prod.yaml
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachinePool
metadata:
  name: prod-pool-1
  namespace: clusters
spec:
  replicas: 3
  template:
    spec:
      version: v1.28.3
      # 修改实例类型
      instanceType: m5.xlarge
---
# 提交并推送
git add nodepool-prod.yaml
git commit -m "feat: 调整 prod-pool-1 实例类型为 m5.xlarge,副本数保持 3"
git push origin main

4.2.2 阶段二:Flux 检测 Git 变更

Flux Source Controller 根据 GitRepository 自定义资源的配置,定期(默认 1 分钟)轮询 Git 仓库。当检测到新的 Commit 时,它会拉取最新代码并更新本地的 Source 状态。

# GitRepository 示例
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: cluster-config
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/team-ops/cluster-gitops
  ref:
    branch: main

4.2.3 阶段三:Kustomize Controller 协调期望状态

Kustomize Controller 监控 Kustomization 资源,一旦发现关联的 GitRepository Source 有更新,立即触发调和循环:

  1. 从 Source Controller 获取最新的 artifact(压缩后的清单文件)。
  2. 执行 Kustomize 构建,渲染出最终的 Kubernetes 资源清单。
  3. 将渲染后的清单与集群中当前资源进行 三方对比(Three-Way Diff)。
# Kustomization 示例
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: nodepools
  namespace: flux-system
spec:
  interval: 1m
  path: ./clusters/prod/nodepools
  prune: true
  sourceRef:
    kind: GitRepository
    name: cluster-config
  targetNamespace: clusters

4.2.4 阶段四:Server-Side Apply 应用配置

Kustomize Controller 使用 Server-Side Apply 将期望状态写入 Kubernetes API Server。此方式可以精确管理字段所有权,避免并发写冲突。对于节点池 CRD(如 MachinePool 或 ClusterClass),Flux 会直接更新其 spec 字段。

操作细节: Flux 默认使用 server-side apply 策略,并通过 --field-manager=flux 标识所有托管字段。这确保了 Flux 只管理它声明的字段,不会覆盖其他控制器管理的字段。

4.2.5 阶段五:确认同步状态

运维人员可以通过 Flux CLI 或 kubectl 验证同步是否成功:

# 查看 Kustomization 同步状态
flux get kustomizations nodepools

# 查看最近一次调和记录
flux reconcile kustomization nodepools

# 直接查看节点池资源是否已更新
kubectl get machinepool prod-pool-1 -n clusters -o yaml | grep instanceType

4.3 完整流程可视化

下图展示了从 Git 提交到节点池配置生效的完整 GitOps 工作流,包含核心组件与数据流向:

GitOps 节点池配置变更完整流程 GitOps 节点池配置变更完整流程 ① 开发者提交变更 git commit + git push ② Git 仓库 新 Commit 触发 Source ③ Source Controller 轮询 & 拉取最新 artifact ④ Kustomize Controller 构建 + 三方对比 + Apply ⑤ Kubernetes API Server Server-Side Apply ⑥ 节点池配置生效 MachinePool / ClusterClass 确认同步状态(flux get / kubectl) 核心原则: Git 仓库是唯一事实来源,Flux 持续对比并自动调和,确保集群状态与 Git 声明一致。 整个流程无需手动 kubectl apply,实现“提交即部署”的 GitOps 体验。

4.4 关键机制:Flux 的调和循环与状态反馈

Flux 的调和循环并非一次性操作,而是一个持续运行的闭环。理解其内部机制有助于排查同步延迟或失败问题:

  • 轮询间隔(Interval): GitRepository 和 Kustomization 各自定义 spec.interval,默认 1 分钟。Source Controller 按此频率检查 Git 变更。
  • 状态更新: 每次调和后,Kustomize Controller 会更新 Kustomization 资源的 status 字段,包括 conditions(Ready/Stalled/Progressing)、lastAppliedRevision(最近应用的 Git Commit SHA)和 lastHandledReconcileAt。
  • 失败重试: 如果 Apply 失败(如 CRD 版本不兼容、资源冲突),Flux 会以指数退避方式重试(10s → 20s → 40s … 最大 5 分钟),直到成功或达到重试上限。
常见陷阱: 如果 Kustomization 的 spec.prune: true,Flux 会自动删除 Git 仓库中已移除的资源。在节点池场景中,误删 YAML 文件可能导致节点池被删除,造成生产影响。务必在删除节点池配置前确认业务影响。

4.5 实践检查清单

在完成一次节点池配置变更后,建议按以下清单确认流程完整性:

检查项 验证命令 / 方法 预期结果
Git 提交已推送 git log --oneline -3 最新 Commit 包含变更描述
Source 已同步 flux get sources git 状态为 True,Revision 为最新 SHA
Kustomization 已调和 flux get kustomizations 状态为 True,Message 显示 "Applied revision: xxx"
节点池配置已更新 kubectl get machinepool -A -o wide 节点池的 spec 字段与 Git 仓库一致
集群节点状态正常 kubectl get nodes 节点池内节点 Ready,版本/规格符合预期