<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DevOps on 王崇旭的博客</title><link>http://blog.chongxu.wang/tags/devops/</link><description>Recent content in DevOps on 王崇旭的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>chongxu.wang</copyright><lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://blog.chongxu.wang/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>基于GitLab CI + ArgoCD的CI/CD流水线方案</title><link>http://blog.chongxu.wang/p/gitops-ci-cd/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>http://blog.chongxu.wang/p/gitops-ci-cd/</guid><description>&lt;p>搭建CI/CD流水线可以显著提升开发团队的交付效率，本人结合近期的实际工作经历，介绍非常经典且高效的 &lt;strong>GitOps&lt;/strong> 架构方案 &amp;mdash; 基于GitLab CI + ArgoCD搭建流水线。在这种设计中，ArgoCD 作为“单一真理来源”的中枢，负责协调代码仓库与多个 Kubernetes 集群之间的状态一致性。这里先回答2个问题：&lt;/p>
&lt;h4 id="为什么选择gitlab-ci">为什么选择GitLab CI？
&lt;/h4>&lt;p>在我刚加入团队的时候，开发团队仍然将代码托管在Gitee互联网上，出于企业数据资产安全性考虑，我们在内部服务器上搭建了GitLab社区版，将代码迁移至了内网。GitLab社区版的流水线功能已经非常完整，足以满足我们团队的所有需求。
相比于Jenkins，GitLab CI在代码仓库的集成上会省去一些配置的工作。
促使我选择GitLab CI的另外一个很重要的原因，是因为流水线中的某些阶段，如部署测试环境和生产环境，往往需要人工介入触发进行部署。Jenkins默认的input机制会占用节点资源，使得流水线一直处于构建中的状态（直到超时），而&lt;strong>GitLab默认的manual机制则无此问题&lt;/strong>。当然Jenkins也有解决方案，就是选择Build/Delivery Pipeline Plugin来组合多条流水线来达成目的（有兴趣的读者可以了解）。&lt;/p>
&lt;h4 id="为什么选择argocd">为什么选择ArgoCD?
&lt;/h4>&lt;p>不论使用何种CI工具，传统的自动化部署方式都是花费很多时间去编写复杂的脚本，让CI连接目标环境（如K8S集群）做自动化操作完成应用的部署，我们不希望花费太多时间在开发和维护自动化脚本上；另外目标环境也可能被人为修改而重新部署，我们期望任何修改都在一个地方操作，并有相应的审计记录。ArgoCD&lt;strong>通过PULL模式自动监控配置代码文件修改、保持配置定义和目标环境始终一致&lt;/strong>的方式，非常符合我们的需求。&lt;/p>
&lt;h3 id="核心架构图-gitops-workflow">核心架构图 (GitOps Workflow)
&lt;/h3>&lt;p>&lt;img src="http://blog.chongxu.wang/p/gitops-ci-cd/img.png"
width="2256"
height="1380"
srcset="http://blog.chongxu.wang/p/gitops-ci-cd/img_hu_b150d9e74c6dbc76.png 480w, http://blog.chongxu.wang/p/gitops-ci-cd/img_hu_fb94d43d6e6681de.png 1024w"
loading="lazy"
alt="img.png"
class="gallery-image"
data-flex-grow="163"
data-flex-basis="392px"
>&lt;/p>
&lt;h3 id="架构组件及流程详解">架构组件及流程详解
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>GitLab CI (持续集成):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>职责&lt;/strong>：负责代码编译、单元测试、镜像构建。&lt;/li>
&lt;li>&lt;strong>关键动作&lt;/strong>：CI 流程结束时，不直接操作 &lt;code>kubectl&lt;/code>，而是修改 &lt;strong>GitOps配置仓库&lt;/strong>（通常是 Helm Chart 或 Kustomize 文件）中的镜像 Tag。这实现了 CI 与 CD 的&lt;strong>解耦&lt;/strong>。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>GitOps配置仓库:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>这是一个独立的 Git 仓库，存放 Kubernetes 的声明式 YAML 文件。ArgoCD 持续监听该仓库的变化。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>ArgoCD (持续部署/中枢):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>部署位置&lt;/strong>：安装在研发测试集群中。&lt;/li>
&lt;li>&lt;strong>多集群管理&lt;/strong>：ArgoCD 通过 &lt;code>Cluster Secret&lt;/code>（保存生产集群的 API Server 地址和凭证）连接并管理生产集群。&lt;/li>
&lt;li>&lt;strong>状态同步&lt;/strong>：当 GitOps配置仓库 更新后，ArgoCD 自动对比集群当前状态。如果发现不一致（Out of Sync），则调用目标集群（测试或生产）的 API 执行更新。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>K8s 集群隔离:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>研发测试集群&lt;/strong>：既运行 ArgoCD 控制面，也运行开发环境的业务 Pod。&lt;/li>
&lt;li>&lt;strong>生产集群&lt;/strong>：仅运行生产业务，保持纯净，通过网络策略仅允许来自 ArgoCD 集群的受控访问。&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol></description></item></channel></rss>