每次部署都 kubectl apply?改了 YAML 忘了同步到集群?ArgoCD 让 Git 成为唯一事实来源——push 到仓库,集群自动同步,漂移自动修复。
上周我改了一个 Deployment 的镜像版本,本地 kubectl apply 完事儿,却忘了推回 Git 仓库。三天后同事从 Git 拉取重新部署,直接回滚到旧版本。排查了一下午才搞清楚:集群状态和 Git 仓库不一致。
这就是没有 GitOps 的代价。
什么是 GitOps
一句话:Git 仓库是基础设施和应用配置的唯一事实来源。
传统部署流程:
开发者 → CI/CD → kubectl apply → K8s
(谁改了集群没人知道)
GitOps 部署流程:
开发者 → git push → Git 仓库
↓
ArgoCD 监听仓库 ← ─ ─ ─ ┘
↓
自动同步到 K8s
(集群状态 = Git 状态)
核心原则:
- 声明式:所有配置用 YAML/JSON 描述,存在 Git
- 版本控制:每次变更都有提交记录,可回溯
- 自动拉取:工具主动从 Git 同步到集群,不是推送到集群
- 持续协调:集群状态偏离 Git,自动修复
在 K3s 上安装 ArgoCD
# 创建命名空间
kubectl create namespace argocd
# 安装 ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 等待 Pod 就绪
kubectl get pods -n argocd -w
# 获取初始密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
暴露 UI:
# 方式1: port-forward(临时)
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 方式2: NodePort(HomeLab 推荐)
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort", "ports": [{"port": 443, "nodePort": 30443}]}}'
访问 https://<k3s-node-ip>:30443,用户名 admin,密码用上面获取的。
配置 Git 仓库
假设你的 K8s 配置仓库结构如下:
homelab-k8s/
├── apps/
│ ├── vaultwarden/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── ingress.yaml
│ ├── miniflux/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── halo/
│ └── ...
├── infra/
│ ├── nfs-provisioner.yaml
│ └── cert-manager.yaml
└── argocd/
├── vaultwarden-app.yaml
├── miniflux-app.yaml
└── halo-app.yaml
在 ArgoCD 中添加私有仓库凭证:
argocd repo add https://github.com/yourname/homelab-k8s.git \
--username yourname \
--password your-token
创建第一个 Application
ArgoCD 用 Application CRD 定义“同步什么、同步到哪”。创建 argocd/vaultwarden-app.yaml:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: vaultwarden
namespace: argocd
spec:
source:
repoURL: https://github.com/yourname/homelab-k8s.git
targetRevision: main
path: apps/vaultwarden
destination:
server: https://kubernetes.default.svc
namespace: vaultwarden
syncPolicy:
automated:
prune: true # Git 删了资源,集群里也删
selfHeal: true # 手动改了集群,自动恢复成 Git 的状态
syncOptions:
- CreateNamespace=true
应用这个配置:
kubectl apply -f argocd/vaultwarden-app.yaml
ArgoCD 会立即从 Git 拉取 apps/vaultwarden/ 下的所有 YAML,自动部署到 K3s。
同步策略详解
syncPolicy:
automated:
prune: true
selfHeal: true
这两个参数决定了 ArgoCD 的自动化程度:
| 参数 |
关闭 |
开启 |
prune |
Git 里删了资源,集群里保留 |
Git 里删了,集群里也删 |
selfHeal |
有人手动 kubectl 改了集群,不管 |
检测到漂移,自动恢复成 Git 状态 |
HomeLab 推荐:两个都开。这样:
- 你 push 到 Git → ArgoCD 自动部署
- 你在集群里手动 kubectl edit → ArgoCD 自动恢复
- 你在 Git 里删掉一个 Service → ArgoCD 自动删除集群里的
集群状态永远等于 Git 状态。再也不会出现“本地改了忘了 push”的问题。
多应用管理:App of Apps 模式
七八个应用一个一个建 Application 太麻烦。用 “App of Apps” 模式——一个父 Application 管理多个子 Application:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: homelab-root
namespace: argocd
spec:
source:
repoURL: https://github.com/yourname/homelab-k8s.git
path: argocd # 这个目录下放所有子 Application
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: true
argocd/ 目录下放每个应用的 Application YAML,ArgoCD 会自动创建它们。加新应用只需要在 Git 里加一个 YAML 文件,ArgoCD 自动发现并部署——Git Push 即部署。
实战:完整 CI/CD 流水线
结合 ArgoCD + 镜像更新,实现完整流程:
开发者 push 代码
↓
GitLab CI 构建镜像 → push 到 Registry
↓
CI 修改 Git 仓库中的 Deployment 镜像版本
↓
ArgoCD 检测到 Git 变更
↓
自动同步新版本到 K3s
用 ArgoCD Image Updater 自动完成“CI 修改镜像版本”这一步:
# 安装 ArgoCD Image Updater
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
在 Application 上添加注解:
metadata:
annotations:
argocd-image-updater.argoproj.io/image-list: myapp=registry.local:5000/myapp
argocd-image-updater.argoproj.io/myapp.update-strategy: latest
argocd-image-updater.argoproj.io/write-back-method: git
Image Updater 会监控 Registry,有新镜像就自动修改 Git 仓库中的版本号,ArgoCD 再同步到集群。从代码提交到生产部署,全程无人工干预。
小结
| 部署方式 |
命令 |
审计 |
回滚 |
| 手动 kubectl |
kubectl apply -f |
无 |
重新 apply 旧版本 |
| CI/CD 推送 |
Pipeline 执行 kubectl |
CI 日志 |
重新触发旧 Pipeline |
| GitOps |
git push |
Git 提交记录 |
git revert |
ArgoCD 的核心价值:让“谁在什么时候改了什么”有据可查,让回滚变成 git revert。
下一篇再聊 Helm——K8s 的包管理器,让它和 ArgoCD 配合起来,部署第三方应用会更省事。如果你也在折腾 HomeLab 或 GitOps,欢迎来云栈社区交流。