Repository Reading Site
ArgoCD 与 GitOps — 声明式持续部署
传统 CI/CD:CI 构建完直接 `kubectl apply` 部署到集群。问题: GitOps 的核心原则: 1. **Git 是唯一真相源** — 集群的期望状态全部存在 Git 仓库中 2. **声明式** — Git 中存的是"我要什么状态",不是"执行什么操作" 3. **自动同步** — 工具持续比对 Git 和集群,发现差异自动修复 4.
ArgoCD 与 GitOps — 声明式持续部署
GitOps 是什么?
传统 CI/CD:CI 构建完直接 kubectl apply 部署到集群。问题:
- 谁部署的?什么时候?不好追踪
- 集群状态和代码仓库不一致(手动改了集群但没改 Git)
- 回滚困难
GitOps 的核心原则:
- Git 是唯一真相源 — 集群的期望状态全部存在 Git 仓库中
- 声明式 — Git 中存的是"我要什么状态",不是"执行什么操作"
- 自动同步 — 工具持续比对 Git 和集群,发现差异自动修复
- 可审计 — 每次变更都是 Git commit,谁改了什么一目了然
ArgoCD 架构
Git 仓库 (Gitea)
│
│ ArgoCD 每 3 分钟 poll
│
┌───▼────────────┐
│ ArgoCD Server │ ← Web UI + API
│ │
│ Repo Server │ ← 克隆 Git 仓库,渲染 manifests
│ │
│ Application │ ← 比对 Git vs 集群,执行同步
│ Controller │
└────────────────┘
│
▼
K8s API Server → 实际部署
核心概念
| 概念 | 说明 |
|---|---|
| Application | 一个 Git 仓库路径 → 一个 K8s namespace 的映射 |
| Sync | 让集群状态匹配 Git 中的定义 |
| Drift | 集群状态与 Git 不一致(有人手动改了集群) |
| Self-Heal | 自动修复 drift(有人手动删了 Pod,ArgoCD 自动重建) |
访问信息
| 项目 | 值 |
|---|---|
| URL | http://107.148.176.193:30880 |
| 用户名 | admin |
| 密码 | oJAKbz26bMzRCfTN |
Gitea — 自托管 Git
| 项目 | 值 |
|---|---|
| Web URL | http://107.148.176.193:30500 |
| SSH | ssh://git@107.148.176.193:30022 |
| 用户名 | admin |
| 密码 | Gitea12345 |
GitOps 工作流实践
完整流程
1. 在 Gitea 创建仓库,放入 K8s manifests
2. 在 ArgoCD 创建 Application,指向 Gitea 仓库
3. ArgoCD 自动同步 manifests 到集群
4. 修改 Git 中的 manifests(如改 image tag)
5. ArgoCD 检测到变更,自动同步
6. 需要回滚?git revert → ArgoCD 自动同步旧版本
手动创建 Application (CLI)
# 安装 argocd CLI
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
argocd login 107.148.176.193:30880 --username admin --password <password> --insecure
argocd app create my-app \
--repo http://gitea-http.gitea:3000/admin/my-app.git \
--path manifests \
--dest-server https://kubernetes.default.svc \
--dest-namespace dev \
--sync-policy automated \
--self-heal
Sync Policy 选项
| 策略 | 含义 |
|---|---|
| Manual | 需要手动点 Sync |
| Automated | Git 变更自动同步 |
| Self-Heal | 有人手动改集群自动修复 |
| Auto-Prune | Git 中删了的资源自动从集群删除 |
面试题
Q: ArgoCD vs Flux 怎么选?
| ArgoCD | Flux | |
|---|---|---|
| UI | 强大的 Web UI | 无 UI(CLI + Grafana dashboard) |
| 多集群 | 内置支持 | 需要额外配置 |
| Helm 支持 | 内置 | 通过 HelmRelease CRD |
| 学习曲线 | 较低 | 较高 |
| CNCF 级别 | Graduated | Graduated |
Q: GitOps 中如何管理 Secret?
Secret 不能明文存 Git。解决方案:
- Sealed Secrets — 用公钥加密后存 Git,集群内用私钥解密
- External Secrets Operator — 从 Vault/AWS Secrets Manager 同步
- SOPS — Mozilla 的加密工具,支持 age/PGP/KMS 加密 YAML 中的 values
- Vault Agent Injector — HashiCorp Vault 通过 sidecar 注入 Secret