第 46 篇 k8s之CI/CD 集成:GitOps 理念与 ArgoCD

IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章,助你少走弯路。


在第 44 和 45 篇中,我们亲手把 Flask + Redis 计数器应用从 Docker Compose 迁移到了 Kubernetes,并加上了 Ingress、HPA、监控和日志。现在整个部署流程是这样的:修改代码 → 本地 docker buildminikube image loadkubectl applyhelm upgrade。每一步都需要手动操作。

如果你只是想快速验证,这没问题。但在团队协作中,频繁的手动部署很容易出错:有人忘记更新镜像标签,有人直接在集群上 kubectl edit 导致配置漂移,出了问题也查不到是谁改了什么。

今天这篇,我们就把这套流程自动化,引入 GitOps 理念和 ArgoCD 工具。让 Git 仓库成为应用的唯一真相来源(Single Source of Truth),任何人对集群配置的修改都必须通过 Git 提交,由 ArgoCD 自动同步到集群。从"手动交付"走向"声明式持续交付"。

一、从手动部署到 GitOps

1.1 当前手动部署流程的问题

回顾一下我们现在是怎么更新应用的:

bash 复制代码
# 1. 修改代码
vim app.py

# 2. 构建镜像
docker build -t flask-redis-counter:4.0 .

# 3. 加载到 Minikube
minikube image load flask-redis-counter:4.0

# 4. 更新 Deployment 镜像
kubectl set image deployment/flask-deployment flask=flask-redis-counter:4.0

# 5. 验证
curl -H "Host: counter.local" http://$(minikube ip)

这个流程有几个明显的痛点:

  1. 手动操作多:至少 5 步,每一步都可能出错。

  2. 配置漂移:有人可能直接在集群上改了镜像或副本数,而 Git 里的 YAML 没更新,久而久之集群实际状态和版本控制中的定义不一致。

  3. 不可审计:谁在什么时候改了什么?没有完整的变更历史。

  4. 无法回滚到 Git 历史版本 :虽然 kubectl rollout undo 能回滚 Deployment,但如果你改了多个资源(ConfigMap、Ingress、HPA),就需要分别回滚,容易遗漏。

1.2 GitOps 的核心理念

GitOps 是一套运维方法论,由 Weaveworks 在 2017 年提出。它的核心思想可以浓缩为一句话:

Git 仓库是声明式基础设施和应用程序的唯一真相来源。自动化过程确保集群的实际状态与 Git 中定义的期望状态持续匹配。

GitOps 的四大原则:

  1. 声明式:所有配置(Deployment、Service、ConfigMap 等)都以 YAML 文件的形式存储在 Git 中。

  2. 版本化:任何变更都通过 Git commit 记录,可追溯、可审计、可回滚。

  3. 自动拉取:GitOps 工具(如 ArgoCD)持续监控 Git 仓库,发现变更后自动将最新配置应用到集群。

  4. 持续调和:如果集群中的实际状态与 Git 中的期望状态不一致(比如有人手动改了 Deployment 副本数),GitOps 工具会自动将其修正回 Git 中定义的状态。

用一张图来理解 GitOps 的工作流:

bash 复制代码
开发者 push 代码 → Git 仓库(配置变更)
                         ↓
                  ArgoCD 检测到变更
                         ↓
                  自动同步到 K8s 集群
                         ↓
                  集群状态与 Git 保持一致

GitOps 有两种实现模式:

  • Push 模式 :CI 流水线(GitHub Actions、Jenkins)在构建完成后,直接执行 kubectl apply 把配置推送到集群。

  • Pull 模式:集群内部署一个 GitOps 控制器(如 ArgoCD),由它主动从 Git 仓库拉取配置并应用到集群。

Pull 模式更安全------集群凭据不需要暴露给 CI 流水线,而且控制器可以持续监控并纠正配置漂移。这也是我们今天要实现的方案。

1.3 ArgoCD 简介

ArgoCD 是 CNCF 的毕业项目,也是目前最流行的 GitOps 工具。它的工作方式很直观:你告诉它"我有一个 Git 仓库,里面的 YAML 文件定义了我想要的应用",ArgoCD 就会:

  1. 定期拉取 Git 仓库的最新内容

  2. 将 Git 中的 YAML 与集群中的实际资源进行对比

  3. 如果发现差异,自动将集群状态同步为 Git 中的定义(也可以手动同步)

  4. 在 Web UI 中清晰展示同步状态(绿色=已同步,黄色=有差异,红色=出错)

二、在 Minikube 中部署 ArgoCD

2.1 安装 ArgoCD

bash 复制代码
# 创建 argocd 命名空间并安装
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

等待所有 Pod 就绪:

bash 复制代码
kubectl get pods -n argocd -w
# NAME                                                READY   STATUS    RESTARTS   AGE
# argocd-application-controller-0                     1/1     Running   0          30s
# argocd-applicationset-controller-xxxxxxxxx-xxxxx    1/1     Running   0          30s
# argocd-dex-server-xxxxxxxxx-xxxxx                   1/1     Running   0          30s
# argocd-notifications-controller-xxxxxxxxx-xxxxx     1/1     Running   0          30s
# argocd-redis-xxxxxxxxx-xxxxx                        1/1     Running   0          30s
# argocd-repo-server-xxxxxxxxx-xxxxx                  1/1     Running   0          30s
# argocd-server-xxxxxxxxx-xxxxx                       1/1     Running   0          30s

2.2 暴露 ArgoCD Web UI

ArgoCD 默认不暴露外部访问。我们用 kubectl port-forward 在本地访问:

bash 复制代码
kubectl port-forward -n argocd svc/argocd-server 8080:443

打开浏览器访问 https://localhost:8080(忽略自签名证书警告)。

2.3 获取初始密码并登录

ArgoCD 的初始管理员密码存储在 Secret 中:

bash 复制代码
# 获取初始密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
# a1b2c3d4e5f6g7h8

用户名是 admin,密码为上面输出的字符串。登录后建议立即修改密码。

三、准备 Git 仓库:存放应用部署配置

ArgoCD 需要从 Git 仓库读取 YAML 配置。在第 44 篇中,我们手动编写了 redis-deployment.yamlflask-deployment.yamlconfigmap.yamlingress.yamlhpa.yaml 等文件。现在把它们整理到一个 Git 仓库中。

3.1 仓库目录结构

bash 复制代码
flask-redis-k8s/
├── base/
│   ├── redis-deployment.yaml
│   ├── flask-deployment.yaml
│   ├── configmap.yaml
│   ├── flask-service.yaml
│   ├── ingress.yaml
│   └── hpa.yaml
└── README.md

将所有 YAML 文件放入 base/ 目录(后续可以通过 Kustomize 的 overlays 区分环境)。

3.2 初始化 Git 仓库并推送

bash 复制代码
cd flask-redis-k8s
git init
git add .
git commit -m "Initial commit: Flask + Redis K8s manifests"
git remote add origin https://github.com/<你的用户名>/flask-redis-k8s.git
git push -u origin main

四、在 ArgoCD 中创建应用

4.1 通过 CLI 创建(推荐)

bash 复制代码
# 安装 ArgoCD CLI
# macOS: brew install argocd
# Linux: curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64 && chmod +x /usr/local/bin/argocd

# 登录
argocd login localhost:8080 --username admin --password <你的密码> --insecure

# 创建应用
argocd app create flask-redis-counter \
  --repo https://github.com/<你的用户名>/flask-redis-k8s.git \
  --path base \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace default \
  --sync-policy automated \
  --auto-prune \
  --self-heal

命令参数说明:

  • --repo:Git 仓库地址

  • --path:YAML 文件在仓库中的路径

  • --dest-server:目标 K8s 集群的 API Server 地址(集群内部地址)

  • --dest-namespace:资源部署的命名空间

  • --sync-policy automated:开启自动同步,Git 变更后自动部署

  • --auto-prune:如果 Git 中删除了某个资源,自动在集群中也删除它

  • --self-heal:开启自愈,集群中如果有人手动修改了配置,自动恢复为 Git 中的定义

4.2 通过 Web UI 创建

也可以在 ArgoCD 的 Web UI 中手动创建应用:点击 + New App ,填写 Application Name、Project(默认 default)、Sync Policy 选择 Automatic,并勾选 Prune ResourcesSelf Heal 。Repository URL 填写你的 Git 仓库地址,Path 填写 base

4.3 查看同步状态

bash 复制代码
argocd app get flask-redis-counter
# Name:               argocd/flask-redis-counter
# Project:            default
# Server:             https://kubernetes.default.svc
# Namespace:          default
# ...
# Sync Status:        Synced to (xxxxxxxx)
# Health Status:      Healthy

Sync Status Synced 表示集群状态与 Git 完全一致,Health Status Healthy 表示所有资源都处于健康状态。在 Web UI 中,你会看到一个绿色的同步状态条,所有资源的图块都显示绿色心形图标。

五、体验 GitOps 工作流:代码推送 → 自动部署

现在来体验完整的 GitOps 工作流。

5.1 修改 Git 中的配置并推送

假设我们需要将 Flask 的日志级别从 info 改为 debug(用于排查问题)。

bash 复制代码
# 编辑 configmap.yaml
sed -i 's/LOG_LEVEL: "info"/LOG_LEVEL: "debug"/' base/configmap.yaml

git add base/configmap.yaml
git commit -m "Change log level from info to debug"
git push origin main

5.2 ArgoCD 自动检测并同步

ArgoCD 默认每 3 分钟轮询一次 Git 仓库。在 Web UI 中点击 Refresh 可以立即触发检测,或等待自动同步。刷新后,ArgoCD 检测到 Git 与集群状态不一致(OutOfSync),自动执行同步操作,更新 ConfigMap 并触发 Deployment 的滚动更新。

bash 复制代码
# 查看 ConfigMap 是否已更新
kubectl get configmap flask-config -o jsonpath='{.data.LOG_LEVEL}'
# debug

整个过程从 git push 开始,到集群中的 Pod 重新加载新配置,完全不需要手动执行 kubectl applyhelm upgrade

5.3 自愈:防止配置漂移

现在模拟一次"手动修改集群导致配置漂移"的场景:

bash 复制代码
# 手动在集群中将副本数改为 5
kubectl scale deployment flask-deployment --replicas=5
# deployment.apps/flask-deployment scaled

kubectl get pods -l app=flask-counter
# 显示 5 个 Pod

由于我们开启了 --self-heal,ArgoCD 会在下一次同步周期中检测到集群实际副本数(5)与 Git 中定义的副本数(3)不一致,自动将其恢复为 3

bash 复制代码
kubectl get pods -l app=flask-counter -w
# 5 个 Pod 中多余的两个被逐步终止,最终恢复到 3 个

这就是 GitOps 最核心的价值------Git 是唯一的真相来源,任何手动修改都会被自动纠正。这在多团队协作和多环境管理中尤为重要。

5.4 版本回滚:一键回到任意 Git 版本

如果不小心推送了一个有问题的配置,可以通过 argocd app rollback 回滚到上一次同步的版本,或者直接在 Git 中 git revert 错误的 commit 并推送。ArgoCD 会自动同步最新的 Git 状态。

bash 复制代码
# 方式一:在 Git 中回滚
git revert HEAD --no-edit
git push origin main

# 方式二:在 ArgoCD Web UI 中点击 "History and Rollback"
# 选择上一个版本,点击 Rollback

六、技术演进路线图

现在,我们走完了整个系列的技术演进路线:

  • 单机容器化(Docker)docker rundocker build → Dockerfile

  • 单机编排(Compose)docker compose updocker-compose.yml

  • 集群编排(K8s 核心对象):Pod → Deployment → Service → Ingress → ConfigMap → Secret → PVC

  • 生产级运维(监控、日志、CI/CD、安全)

    • 监控:Prometheus + Grafana

    • 日志:Loki + LogQL

    • 网络策略:NetworkPolicy

    • 安全:RBAC + ServiceAccount

    • 自动部署:ArgoCD + GitOps

到此,应用的部署流程从"开发者本地手动操作"转变为"Git 推送 → ArgoCD 自动同步"。下一步可以进一步优化的是:将 docker build 和镜像推送也纳入 CI 流程(比如通过 GitHub Actions),实现从代码推送到镜像构建再到集群部署的全自动化。

七、命令速查表

八、本篇总结

  • GitOps 理念:Git 是唯一真相来源,集群状态由 Git 仓库中的声明式配置定义。

  • Push vs Pull:Pull 模式(ArgoCD)更安全,集群凭据不暴露给 CI,且具备自愈和配置漂移纠正能力。

  • ArgoCD 实战:在 Minikube 中部署了 ArgoCD,将 Flask + Redis 应用的 K8s 配置存放在 Git 仓库中,创建 ArgoCD Application 并配置自动同步和自愈。

  • 自动化部署 :修改 Git 中的 ConfigMap → git push → ArgoCD 自动检测并同步 → Pod 滚动更新。手动修改副本数被 ArgoCD 自动纠正,实现了配置漂移防护。

下一篇------第 47 篇:生产级考量:高可用、备份与升级,我们将跳出应用层面,从集群维度讨论生产环境中的高可用拓扑、etcd 备份与恢复、Kubernetes 版本升级等运维话题。

想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !

相关推荐
Dalydai1 小时前
AI 辅助大屏开发:怎么让 AI 干活,但别让它干砸
前端
凌涘1 小时前
深入理解 JavaScript 执行机制:从执行上下文到调用栈全解析
前端·javascript
utmhikari1 小时前
【AI原生】用Vibe Coding写产品前端原型的一些经验
前端·ai·产品经理·web·web开发·ai-native·qoder
li星野1 小时前
从零搭建文件上传系统:FastAPI 后端 + Streamlit 前端
前端·状态模式·fastapi
YAwu111 小时前
手写一个符合 Promise/A+ 规范的 Promise(附完整代码)
前端·javascript
暗不需求1 小时前
从路虎汽车小程序看微信小程序开发的最佳实践
前端·javascript·微信小程序
用户059540174461 小时前
我把RAG对话记忆测试从手工用例改成ChromaDB自动化评估,Bug发现率翻了4倍
前端·css
向日的葵0061 小时前
vue路由(二)
前端·javascript·vue.js·vue
姓王者1 小时前
解决QQ浏览器等魔改内核下SVG背景图颜色异常变白的问题 | 姓王者的博客
前端