3. GitOps 工作流:声明式配置、Git 作为单一事实来源、自动同步与手动审批模式对比
GitOps 的核心是将运维与交付的“期望状态”全部声明在 Git 仓库中,并通过自动化机制使运行环境持续趋近该状态。本章从三个维度拆解 GitOps 工作流:声明式配置的语义、Git 作为单一事实来源的约束力,以及自动同步与手动审批两种模式的适用场景与风险。
3.1 声明式配置:描述“要什么”,而非“怎么做”
声明式配置只定义目标状态,由控制器负责调和。Kubernetes 原生资源(Deployment、Service、ConfigMap)本身就是声明式的最佳载体。
关键区别: 命令式(kubectl run / apply --edit-last-applied)依赖操作者的执行顺序和上下文;声明式(kubectl apply -f dir/)只提交最终期望,控制器自动计算差异并执行调和。
# 声明式示例:期望运行 3 个 nginx 副本,镜像版本 1.25
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-stable
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
| 特性 | 命令式 | 声明式 |
|---|---|---|
| 操作对象 | 运行时资源 | Git 仓库中的 YAML/JSON |
| 幂等性 | 依赖操作顺序,易产生漂移 | 天然幂等,重复 apply 结果一致 |
| 审计追溯 | 依赖操作日志,不完整 | Git commit 即完整变更记录 |
| 回滚 | 手动执行反向操作 | git revert + 自动同步 |
3.2 Git 作为单一事实来源(Single Source of Truth)
在 GitOps 模型中,Git 仓库是唯一被信任的期望状态定义。任何对集群的手动修改(kubectl edit、helm upgrade --install 绕过 Git)都会被视为“配置漂移”,并被 GitOps 控制器自动覆盖或告警。
实践原则: 所有环境(dev/staging/prod)的配置必须从 Git 仓库派生。禁止直接修改集群资源;如需紧急修复,先提交 Git PR,再通过自动或手动同步生效。
3.3 自动同步模式:持续调和,零人工干预
自动同步模式下,GitOps 控制器持续监控 Git 仓库,一旦检测到新的 commit(或 PR merge),立即将变更应用到目标集群。适用于开发环境、非关键业务、需要快速迭代的场景。
- 优点: 部署速度快(秒级到分钟级);减少人为操作失误;环境一致性高。
- 风险: 错误配置会直接扩散到生产;缺少变更审批环节;回滚依赖 Git revert 速度。
- 典型工具: Flux v2 默认启用自动同步;ArgoCD 可配置
syncPolicy.automated。
# ArgoCD Application 自动同步配置示例
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-prod
spec:
source:
repoURL: https://github.com/team/gitops-config.git
path: overlays/prod
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated:
prune: true # 自动清理 Git 中已删除的资源
selfHeal: true # 自动修复集群中的手动漂移
syncOptions:
- CreateNamespace=true
3.4 手动审批模式:变更闸门,安全优先
手动审批模式下,GitOps 控制器只负责检测 Git 仓库与集群的差异,但不会自动应用变更。运维或审批人通过 UI 或 CLI 确认后,才执行同步。适用于生产环境、合规敏感业务、多租户场景。
- 优点: 变更可审查、可暂停、可回滚;支持灰度发布前的最终确认;满足审计与合规要求。
- 代价: 部署速度变慢;需要人工值守;审批流程可能成为瓶颈。
- 典型实践: ArgoCD 关闭
automated,使用argocd app sync或 UI 手动同步;Flux 使用--suspend暂停调和。
常见误区: 手动审批 ≠ 手动修改集群。审批只控制“何时同步”,配置变更仍然必须通过 Git PR 提交。任何绕过 Git 的集群修改都会破坏单一事实来源。
3.5 两种模式对比与选择策略
| 维度 | 自动同步 | 手动审批 |
|---|---|---|
| 变更生效速度 | 秒级~分钟级 | 分钟级~小时级(依赖审批) |
| 人工介入点 | 仅 PR 审查 | PR 审查 + 同步审批 |
| 配置漂移处理 | 自动覆盖(selfHeal) | 告警 + 人工决定是否覆盖 |
| 适用环境 | dev、staging、非关键业务 | prod、合规环境、客户敏感数据 |
| 回滚速度 | 快(git revert 后自动同步) | 中(git revert + 手动同步) |
| 工具推荐 | Flux v2(默认自动) | ArgoCD(关闭 automated) |
3.6 混合模式与准入检查的衔接
实际生产环境中,推荐采用混合模式:非关键环境使用自动同步加速迭代,生产环境使用手动审批并配合准入检查(Admission Webhook)做最后一道防线。准入检查可以在同步前验证配置的合规性(如镜像来源、资源配额、Pod 安全策略),即使审批人误操作,也能被策略拦截。