GitOps 核心理念与优势
核心问题:什么是 GitOps?它和传统 CI/CD 有什么不同?为什么说"Git 是唯一真相来源"?
什么是 GitOps
GitOps 是一种以 Git 仓库为基础设施和应用配置唯一来源的运维范式,核心原则:
- 声明式:用 YAML / HCL 描述期望状态,而不是写操作步骤
- 版本化:所有配置提交到 Git,有完整历史记录
- 自动同步:GitOps Agent 持续监测 Git 与集群差异,自动协调
- 可观测:任何偏差(配置漂移)都能被检测和告警
GitOps vs 传统 CI/CD
graph TB
subgraph "传统 Push 模型"
DEV1[开发者推送代码]
CI1[CI 构建镜像]
CD1[CD Pipeline
kubectl apply / helm upgrade] K8S1[Kubernetes 集群] DEV1 --> CI1 --> CD1 -->|推送变更| K8S1 end subgraph "GitOps Pull 模型" DEV2[开发者 PR → 合并到 Git] GIT2[Git 仓库
(唯一真相来源)] ARGO[ArgoCD Agent
持续 Reconcile] K8S2[Kubernetes 集群] DEV2 -->|更新 Git| GIT2 ARGO -->|拉取 Git 变更| GIT2 ARGO -->|自动同步| K8S2 K8S2 -->|检测到漂移| ARGO end
kubectl apply / helm upgrade] K8S1[Kubernetes 集群] DEV1 --> CI1 --> CD1 -->|推送变更| K8S1 end subgraph "GitOps Pull 模型" DEV2[开发者 PR → 合并到 Git] GIT2[Git 仓库
(唯一真相来源)] ARGO[ArgoCD Agent
持续 Reconcile] K8S2[Kubernetes 集群] DEV2 -->|更新 Git| GIT2 ARGO -->|拉取 Git 变更| GIT2 ARGO -->|自动同步| K8S2 K8S2 -->|检测到漂移| ARGO end
| 维度 | 传统 Push CI/CD | GitOps Pull 模型 |
|---|---|---|
| 访问集群的主体 | CI/CD 系统 | 集群内 Agent(ArgoCD) |
| 密钥管理 | CI 需要 kubeconfig | 只有 Agent 有集群权限 |
| 配置漂移 | 无法检测 | 自动检测并可自动修复 |
| 回滚方式 | 重新跑 Pipeline | git revert 或修改 Git |
| 审计追踪 | CI 日志 | Git 提交历史 |
| 声明式程度 | 部分(命令式部署) | 完全声明式 |
GitOps 两种仓库策略
单仓库策略(Monorepo)
my-monorepo/
├── apps/
│ ├── api/ # 应用代码
│ └── web/
└── deploy/ # 部署配置(GitOps 部分)
├── base/ # 公共配置(Kustomize base)
│ ├── api/
│ └── web/
└── overlays/ # 环境差异(Kustomize overlays)
├── dev/
├── staging/
└── production/
✅ 简单,代码和配置一起审查 ⚠️ 应用代码变更会触发配置 CI,反之亦然
双仓库策略(Recommended)
app-repo/ # 应用代码仓库(开发者日常工作)
├── src/
├── Dockerfile
└── .github/workflows/
└── ci.yml # 构建镜像,更新 infra-repo 中的 image tag
infra-repo/ # 基础设施配置仓库(GitOps 唯一真相)
├── apps/
│ ├── api/
│ │ ├── base/
│ │ └── overlays/
│ └── web/
└── clusters/
├── staging/
└── production/
✅ 职责分离,更安全 ✅ 代码 CI 和基础设施 GitOps 流程解耦
Kustomize:无模板的 YAML 覆盖
Kustomize 是 GitOps 中常配合使用的 YAML 管理工具(kubectl 内置支持):
apps/api/
├── base/ # 基础配置
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── dev/
│ ├── kustomization.yaml # 引用 base + 覆盖差异
│ └── replica-patch.yaml
└── production/
├── kustomization.yaml
└── production-patch.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
commonLabels:
app: api
# overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
namespace: production
images:
- name: myorg/api
newTag: v1.3.0 # CI 自动更新这里的 tag
patches:
- path: production-patch.yaml
# overlays/production/production-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 3 # 覆盖 base 中的 replicas
GitOps 工具对比
| 工具 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| ArgoCD | GitOps Controller | 功能最全、UI 直观、App of Apps | 主流选择,本书重点 |
| Flux v2 | GitOps Controller | 更轻量,kubectl 风格,Helm Controller | 偏好 CLI 操作 |
| Weave GitOps | ArgoCD + 商业封装 | 更好的 UI 和策略管理 | 企业级 |
| Jenkins X | 完整平台 | 集成 CI + CD + GitOps | 大型工程团队 |
配置漂移检测与自动修复
graph LR
GIT["Git 仓库
期望状态:replicas=3"] ARGO["ArgoCD
持续 Reconcile"] K8S["集群
实际状态:replicas=1
(有人手动改了!)"] GIT -->|拉取| ARGO ARGO -->|检测| K8S K8S -->|发现漂移| ARGO ARGO -->|自动恢复
或告警| K8S
期望状态:replicas=3"] ARGO["ArgoCD
持续 Reconcile"] K8S["集群
实际状态:replicas=1
(有人手动改了!)"] GIT -->|拉取| ARGO ARGO -->|检测| K8S K8S -->|发现漂移| ARGO ARGO -->|自动恢复
或告警| K8S
ArgoCD 有三种同步策略:
| 策略 | 行为 | 适用场景 |
|---|---|---|
| Manual | 只检测差异,不自动修复,需人工审批 | 生产环境(推荐) |
| Automated | 检测到差异自动同步,可加自愈 | 开发/测试环境 |
| Automated + SelfHeal | 任何漂移都立即恢复 | 强一致性要求的生产环境 |