云原生交付(03):GitOps——ArgoCD/Flux、声明式部署、回滚、漂移检测
更新时间:2026-09-01。本文是
cloud/delivery/云原生交付第 03 篇,接 CI/CD 流水线。GitOps 把 Git 仓库作为唯一事实来源,集群状态和 Git 仓库状态保持一致。部署就是 Git 仓库的变更,回滚就是 Git revert。GitOps 让部署更安全、可审计。
本文要回答的问题
- GitOps 是什么?和 CI/CD 有什么区别?
- ArgoCD 怎么用?Application 和 Project 怎么配置?
- ArgoCD 和 Flux 有什么区别?
- 漂移检测是什么?集群状态和 Git 不一致怎么处理?
一、GitOps 核心概念
text
GitOps 原理:
┌─────────────────────────────────────────────────────────┐
│ Git 仓库(唯一事实来源) │
│ ├── k8s/ │
│ │ ├── deployment.yaml │
│ │ ├── service.yaml │
│ │ └── ingress.yaml │
│ └── helm/ │
│ └── my-app/ │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ GitOps Operator(ArgoCD / Flux) │
│ 1. 监听 Git 仓库变更 │
│ 2. 对比 Git 状态和集群状态 │
│ 3. 不一致 → 同步到集群状态 │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Kubernetes 集群 │
│ ├── deployment(实际状态) │
│ ├── service │
│ └── ingress │
└─────────────────────────────────────────────────────────┘GitOps 和 CI/CD 的区别:
| 对比 | 传统 CI/CD | GitOps |
|---|---|---|
| 部署方式 | CI 推送到集群 | GitOps Operator 拉取 Git 应用到集群 |
| 事实来源 | CI 流水线 | Git 仓库 |
| 状态管理 | 手动检查 | 自动检测漂移 |
| 回滚 | 重新运行流水线 | Git revert |
| 审计 | 流水线日志 | Git 提交历史 |
GitOps 的好处:
- 所有变更都在 Git 中,可审计、可回滚
- 集群状态自动收敛到 Git 状态
- 不需要直接操作集群,减少人为错误
- 部署权限和 Git 权限一致
二、ArgoCD 快速入门
yaml
# ArgoCD Application 定义
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/my-org/my-app.git
targetRevision: main
path: k8s/overlays/production
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true # 删除 Git 中不存在的资源
selfHeal: true # 自动修复漂移
syncOptions:
- CreateNamespace=trueArgoCD 常用命令:
bash
# 安装 ArgoCD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 登录
argocd login localhost:8080
argocd account update-password
# 创建应用
argocd app create my-app --repo https://github.com/... --path k8s --dest-server https://kubernetes.default.svc
# 同步
argocd app sync my-app
# 查看状态
argocd app get my-app
argocd app listArgoCD 同步策略:
- Automated:自动同步,Git 变更自动应用到集群
- Manual:手动触发同步,需要人工确认
- Prune:自动删除 Git 中不存在的资源
- SelfHeal:自动修复集群状态和 Git 不一致
三、ArgoCD vs Flux
| 对比 | ArgoCD | Flux |
|---|---|---|
| UI | 内置 Web UI | 需要额外工具 |
| 多集群 | 原生支持 | 原生支持 |
| Helm | 支持 | 支持 |
| Kustomize | 支持 | 支持 |
| 同步策略 | 自动/手动 | 自动/手动 |
| 资源 | 较重 | 较轻 |
| 社区 | 较大 | 较大 |
经验: 两个都成熟,ArgoCD UI 更好,Flux 更轻量。选哪个都可以。
四、漂移检测
text
漂移(Drift):集群状态和 Git 仓库状态不一致
漂移产生原因:
1. 人工操作集群(kubectl edit / kubectl delete)
2. 自动扩缩容(HPA 修改副本数)
3. 外部服务修改资源
漂移处理:
1. ArgoCD 检测到漂移 → 标记为 OutOfSync
2. 自动同步(selfHeal=true)→ 自动恢复到 Git 状态
3. 手动同步 → 人工确认后同步
建议:开发环境 selfHeal=true,生产环境 selfHeal=false
生产环境需要人工确认漂移后同步五、回滚策略
bash
# GitOps 回滚就是 Git revert
# 1. 找到需要回滚的提交
git log --oneline --all
# 2. 回滚到目标版本
git revert <commit-hash>
git push
# 3. GitOps Operator 自动检测到变更,同步回滚
# 或者 Git 回滚:直接重置到目标版本
git reset --hard <target-commit>
git push --forceGitOps 回滚的好处:
- 回滚是 Git 操作,不是直接操作集群
- 回滚记录在 Git 中,可审计
- 回滚和发布一样,经过同样的流程
六、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| 自动同步导致配置丢失 | HPA 扩缩容被自动同步重置 | 配置 selfHeal 为 false,或忽略 HPA |
| 权限不足 | ArgoCD 不能创建 namespace | 配置 syncOptions: CreateNamespace |
| 路径配置不对 | Application 找不到资源 | 确认 source.path 路径正确 |
| 回滚后冲突 | 多人同时提交,回滚后冲突 | 用 Git revert 而不是 reset |
相关与延伸
交付 3 篇完成。下一篇:Service Mesh——Istio 数据面/控制面、sidecar、流量治理、安全;CI/CD 流水线,见 CI/CD 流水线。
一句话总结
GitOps:Git 仓库是唯一事实来源,集群状态自动收敛到 Git 状态;ArgoCD 通过 Application 定义 Git 仓库和集群目标,支持自动同步(prune + selfHeal)和手动同步;漂移检测:集群状态和 Git 不一致时标记 OutOfSync,selfHeal 自动修复;回滚就是 Git revert,GitOps Operator 自动同步回滚状态;ArgoCD UI 好,Flux 更轻量,选哪个都行。