1. GitOps 概述:核心原则、声明式配置、与 CI/CD 的区别、同步窗口的价值
1.1 GitOps 核心原则
GitOps 是一种以 Git 仓库作为单一事实来源(Single Source of Truth)的运维与交付模式。其核心原则可归纳为以下四点:
| 原则 | 说明 | 关键要求 |
|---|---|---|
| 声明式配置 | 系统期望状态以声明式描述文件(YAML/JSON)定义,而非命令式脚本 | 幂等性、可版本化、可审计 |
| 单一事实来源 | Git 仓库保存所有环境配置,集群状态必须与仓库一致 | 禁止手动修改集群,所有变更通过 PR 驱动 |
| 自动同步 | Operator 或 Agent 持续对比 Git 仓库与集群状态,自动修复偏差 | 双向差异检测、自动回滚、手动干预兜底 |
| 可观测与可审计 | 每次变更都有 Git 提交记录,同步结果可追踪 | 提交签名、变更历史、同步日志 |
实践要点: GitOps 并非简单的“用 Git 存配置”,而是要求整个交付流程以 Git 仓库为驱动核心,任何手动 kubectl apply 或 UI 点击都应视为违规操作。
1.2 声明式配置 vs 命令式配置
声明式配置是 GitOps 的基石。以下对比帮助理解两种模式的本质差异:
| 维度 | 声明式配置 | 命令式配置 |
|---|---|---|
| 描述方式 | “系统应该是什么状态” | “系统应该执行什么操作” |
| 示例 | replicas: 3 |
kubectl scale --replicas=3 |
| 幂等性 | 天然幂等,重复执行结果一致 | 非幂等,重复执行可能产生副作用 |
| 版本管理 | 配置文件可直接纳入 Git 管理 | 操作日志难以结构化存储 |
| 偏差修复 | 自动检测并回滚至期望状态 | 需人工介入排查 |
# 声明式示例:Deployment 期望状态
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
1.3 GitOps 与 CI/CD 的区别
传统 CI/CD 与 GitOps 在交付流程中的职责不同,二者是互补关系而非替代关系。
核心区别: CI/CD 负责“构建与验证”,GitOps 负责“部署与同步”。CI 产出制品(镜像、包),GitOps 消费制品并驱动环境状态变更。
| 对比维度 | 传统 CI/CD | GitOps |
|---|---|---|
| 触发方式 | 代码提交 → 自动构建 → 自动部署 | Git 仓库配置变更 → 自动同步 |
| 部署驱动 | Pipeline 脚本直接调用 API | Operator 持续对比并调和 |
| 状态管理 | Pipeline 执行结果即状态 | Git 仓库定义期望状态 |
| 回滚方式 | 重新执行 Pipeline 或手动回滚 | Git revert 提交,自动同步 |
| 安全模型 | CI/CD 系统需持有集群凭证 | Operator 持有凭证,开发者仅需 Git 权限 |
1.4 同步窗口的价值
同步窗口(Sync Window)是 GitOps 中用于控制自动同步行为的时间策略机制。其核心价值体现在以下方面:
- 变更管控: 限制自动同步仅在特定时间窗口内执行,避免非工作时段意外变更影响业务。
- 合规与审计: 满足金融、医疗等行业的变更窗口要求,所有部署操作集中在可追溯的时间段。
- 资源保护: 在业务高峰期(如大促、秒杀)禁止自动同步,防止配置变更引发性能抖动。
- 多环境协调: 开发、测试、生产环境可配置不同的同步窗口,实现分阶段灰度发布。
| 场景 | 同步窗口配置 | 预期效果 |
|---|---|---|
| 生产环境 | 周一至周五 09:00-18:00 | 仅在工作时间执行自动同步,避免夜间变更 |
| 大促期间 | 禁止同步(窗口关闭) | 锁定环境配置,防止意外变更影响稳定性 |
| 开发环境 | 全天候(24×7) | 快速迭代,随时同步最新配置 |
| 合规审计 | 仅允许审批后的 PR 触发同步 | 所有变更可追溯至具体审批记录 |
常见误区: 同步窗口不是“暂停 GitOps”,而是“暂停自动同步”。手动触发同步(如通过 CLI 或 UI)通常不受窗口限制,用于紧急修复场景。