找回密码
立即注册
搜索
发回帖 发新帖

6295

积分

0

好友

768

主题
发表于 昨天 23:31 | 查看: 6| 回复: 0

每次部署都 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 状态)

核心原则:

  1. 声明式:所有配置用 YAML/JSON 描述,存在 Git
  2. 版本控制:每次变更都有提交记录,可回溯
  3. 自动拉取:工具主动从 Git 同步到集群,不是推送到集群
  4. 持续协调:集群状态偏离 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,欢迎来云栈社区交流。




上一篇:Helm 入门:K8s 包管理器像装 App 一样部署 Redis,还能自建 Chart
下一篇:Terraform 入门实战:用代码定义你的 HomeLab 基础设施
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-8 01:48 , Processed in 0.077513 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表