← 返回文章列表
CI/CD 与 GitOps 实战:Jenkins + ArgoCD 完整指南
深入讲解 CI/CD 概念、GitOps 理念,以及基于 Jenkins + ArgoCD 的企业级 K8s 持续交付实战。
24 分钟阅读
字号
一、CI/CD 基础概念
1.1 什么是 CI/CD
┌─────────────────────────────────────────────────────────────────┐
│ │
│ CI = Continuous Integration(持续集成) │
│ CD = Continuous Delivery(持续交付)或 Continuous Deployment │
│ │
└─────────────────────────────────────────────────────────────────┘传统开发模式的问题:
开发者A ──▶ 代码 ──▶ ──▶ ──▶ ──▶ ──▶ ──▶ 测试环境
▲
开发者B ──▶ 代码 ──▶ ──▶ ──▶ ──▶ ──▶ ──▶ 攒够再测
▲
开发者C ──▶ 代码 ──▶ ──▶ ──▶ ──▶ ──▶ ──▶问题:多人代码合并困难、问题发现晚、测试靠人工、上线靠人肉。
CI/CD 模式:
开发者A ──▶ 代码 ──▶ Git ──▶ 自动构建 ──▶ 自动测试 ──▶
开发者B ──▶ 代码 ──▶ Git ──▶ 自动构建 ──▶ 自动测试 ──▶
开发者C ──▶ 代码 ──▶ Git ──▶ 自动构建 ──▶ 自动测试 ──▶优点:每次提交都自动构建测试、问题早发现、自动化发布、可回滚。
1.2 CI 持续集成做什么
┌─────────────────────────────────────────────────────────────────┐
│ CI 流水线步骤 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Stage 1: 拉取代码 │
│ ├── git clone │
│ │ │
│ ▼ │
│ Stage 2: 安装依赖 │
│ ├── Go: go mod download │
│ ├── Java: mvn dependency:resolve │
│ ├── Node.js: npm install │
│ │ │
│ ▼ │
│ Stage 3: 代码编译 │
│ ├── Go: go build │
│ ├── Java: mvn package │
│ ├── 前端: npm run build │
│ │ │
│ ▼ │
│ Stage 4: 单元测试 │
│ ├── Go: go test ./... │
│ ├── Java: mvn test │
│ ├── pytest: pytest tests/ │
│ │ │
│ ▼ │
│ Stage 5: 代码质量扫描 │
│ ├── SonarQube 扫描 │
│ │ ├── 代码异味(Code Smell) │
│ │ ├── 潜在 Bug │
│ │ ├── 代码覆盖率 │
│ │ └── 安全漏洞 │
│ │ │
│ ▼ │
│ Stage 6: 构建镜像 │
│ ├── docker build -t app:v1.0.1 . │
│ │ │
│ ▼ │
│ Stage 7: 推送镜像 │
│ └── docker push harbor.k8s.local/xxx:v1.0.1 │
│ │
└─────────────────────────────────────────────────────────────────┘1.3 持续交付 vs 持续部署
┌─────────────────────────────────────────────────────────────────┐
│ 持续交付 vs 持续部署 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 持续交付: │
│ 代码 ──▶ 自动构建测试 ──▶ 自动打包 ──▶ 人工确认 ──▶ 发布 │
│ ▲ │
│ │ │
│ 人手动点击确认 │
│ │
│ 持续部署: │
│ 代码 ──▶ 自动构建测试 ──▶ 自动打包 ──▶ 自动发布 ──▶ 生产 │
│ │
│ 总结: │
│ • CI:保证代码质量 │
│ • CD(交付):自动到待发布状态,人工决定何时发布 │
│ • CD(部署):代码自动发布到生产环境 │
│ │
└─────────────────────────────────────────────────────────────────┘二、GitOps 理念
2.1 什么是 GitOps
┌─────────────────────────────────────────────────────────────────┐
│ GitOps 定义 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ GitOps = Git + Operations │
│ │
│ 核心理念: │
│ • Git 仓库是"单一真相来源"(Single Source of Truth) │
│ • 环境的期望状态存在 Git 中 │
│ • 工具自动监控 Git,将变化同步到集群 │
│ │
└─────────────────────────────────────────────────────────────────┘2.2 GitOps vs 传统 CD
┌─────────────────────────────────────────────────────────────────┐
│ 传统 CD vs GitOps │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 传统 CD(命令式): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ "你去做这件事" │ │
│ │ │ │
│ │ kubectl set image deployment/app v1.2.3 │ │
│ │ kubectl rollout restart deployment/app │ │
│ │ │ │
│ │ 特点: │ │
│ │ • 我告诉你每一步怎么做 │ │
│ │ • 如果有人手动改了环境,Git 不知道 │ │
│ │ • 难以追踪谁改了什么 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ GitOps(声明式): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ "你想要这个样子,你自己看着办" │ │
│ │ │ │
│ │ # Git 中声明 │ │
│ │ image: myapp:v1.2.3 │ │
│ │ │ │
│ │ 特点: │ │
│ │ • 我只告诉你想要什么状态 │ │
│ │ • 工具自动同步 │ │
│ │ • Git 是唯一真相,手动修改会被工具覆盖 │ │
│ │ • 所有变更都有记录,可审计 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘2.3 GitOps 工作流程
┌─────────────────────────────────────────────────────────────────┐
│ GitOps 工作流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Git │◀───▶│ GitOps │◀───▶│ K8s │ │
│ │ 仓库 │ │ 工具 │ │ 集群 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ │ │ │ │
│ │ 比较:Git 状态 │ │
│ │ vs 集群状态 │ │
│ │ │ │ │
│ │ 不一致?自动同步 │ │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ 应用部署 │
│ │ │ │
│ │ 所有变更都记录在 Git │
│ │ │
│ 开发者只需关心 Git,工具自动同步 │
│ │
└─────────────────────────────────────────────────────────────────┘三、ArgoCD 详解
3.1 ArgoCD 是什么
┌─────────────────────────────────────────────────────────────────┐
│ ArgoCD 定义 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ArgoCD = declarative, GitOps continuous delivery tool for K8s │
│ │
│ 官方定位: │
│ "A declarative, GitOps continuous delivery tool for │
│ Kubernetes" │
│ │
│ 核心能力: │
│ • 监听 Git 仓库的变化 │
│ • 自动将变化同步到 K8s 集群 │
│ • 提供 Web UI 查看同步状态 │
│ • 支持回滚到任意版本 │
│ │
│ ArgoCD 生态组件: │
│ • Argo CD - 核心持续交付工具 │
│ • Argo Rollouts - 渐进式发布(金丝雀、蓝绿) │
│ • Argo Workflows - 工作流引擎 │
│ • Argo Events - 事件驱动 │
│ │
└─────────────────────────────────────────────────────────────────┘3.2 ArgoCD 架构
┌─────────────────────────────────────────────────────────────────┐
│ ArgoCD 架构图 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 用户层 │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Web UI │ │ CLI / API │ │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ └────────────────────────┼────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ArgoCD API Server │ │
│ │ • 处理 Web UI / CLI 请求 │ │
│ │ • 认证/授权 │ │
│ │ • 项目/应用管理 │ │
│ └────────────────────────┬────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┼────────────────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ │ │
│ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ Repository │ │ Application │ │ │
│ │ Server │ │ Controller │ │ │
│ │ │ │ │ │ │
│ │ • 连接 Git 仓库 │ │ • 监控 Git 状态 │ │ │
│ │ • 生成清单 │ │ • 监控集群状态 │ │ │
│ │ • 凭证管理 │ │ • 执行同步 │ │ │
│ └──────────────────┘ └────────┬─────────┘ │ │
│ │ │ │
│ │ 比较 & 协调 │ │
│ ▼ │ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Redis(缓存) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ etcd / Kubernetes │ │
│ │ 存储 ArgoCD 的 CRD 和状态 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘组件详解:
| 组件 | 作用 |
|---|---|
| API Server | 处理 Web UI/CLI 请求,提供 gRPC API |
| Repository Server | 连接 Git 仓库,生成本地 manifest |
| Application Controller | 核心协调器,比较 Git 状态和集群状态,执行同步 |
| Redis | 缓存 Git 仓库和集群状态 |
| etcd/K8s | 存储 ArgoCD CRD 和状态 |
3.3 ArgoCD 安装
# 创建命名空间
kubectl create namespace argocd
# 安装 ArgoCD
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 高可用版本
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/install.yaml
# 查看 pods
kubectl get pods -n argocd
# 获取初始 admin 密码
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# 暴露 API Server(NodePort)
kubectl patch svc argocd-server -n argocd \
-p '{"spec":{"type":"NodePort"}}'
# CLI 登录
argocd login <argocd-server> --username admin --password <password>3.4 ArgoCD Application 详解
Application 是 ArgoCD 的核心资源,定义一个要部署的应用:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
# 项目(用于分组和权限控制)
project: default
# 源 - Git 仓库信息
source:
repoURL: https://github.com/example/manifests.git
targetRevision: HEAD
path: production/my-app
# 目标 - K8s 集群信息
destination:
server: https://kubernetes.default.svc
namespace: production
# 同步策略
syncPolicy:
automated:
prune: true # 自动删除集群中有但 Git 中没有的资源
selfHeal: true # 自动修复集群中被手动修改的资源3.5 ArgoCD Project 详解
Project 是应用的逻辑分组 + 权限边界:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: production
namespace: argocd
spec:
# 允许的源仓库
sourceRepos:
- https://github.com/example/k8s-manifests.git
# 目标集群和命名空间
destinations:
- server: https://kubernetes.default.svc
namespace: production
- server: https://kubernetes.default.svc
namespace: staging
# 允许创建的资源类型(白名单)
resourceWhitelist:
- group: apps
kinds:
- Deployment
- StatefulSet
- group: ""
kinds:
- Service
- ConfigMap
# 角色定义(RBAC)
roles:
- name: developer
policies:
- p, proj:production:developer, applications, get, production/*, allow
- p, proj:production:developer, applications, sync, production/*, allow3.6 ArgoCD Sync 策略
1. 手动同步
spec:
syncPolicy:
automated: null # 不设置自动同步2. 自动同步
spec:
syncPolicy:
automated:
prune: true # 自动删除 Git 中没有的资源
selfHeal: true # 自动修复手动修改的资源3. PreSync / PostSync Hooks
# 数据库迁移(PreSync)
apiVersion: batch/v1
kind: Job
metadata:
name: db-migration
annotations:
argocd.argoproj.io/hook: PreSync # 同步之前执行
argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
template:
spec:
containers:
- name: migrate
image: migrate:latest
command: ["migrate", "up"]
restartPolicy: NeverHook 类型:
| 类型 | 时机 | 用途 |
|---|---|---|
| PreSync | 同步之前 | 数据库迁移、备份 |
| Sync | 同步时 | 主要资源创建/更新 |
| PostSync | 同步之后 | 健康检查、通知 |
| Skip | 跳过 | 忽略此次同步 |
3.7 ArgoCD 回滚
CLI 回滚:
# 查看历史版本
argocd app history my-app
# 回滚到指定版本
argocd app rollback my-app 3
# 回滚到上一个版本
argocd app rollback my-appGit 回滚:
# 本地回滚 Git 提交
git revert <commit-hash>
# ArgoCD 会自动检测到变化并同步3.8 ArgoCD ApplicationSet
ApplicationSet = 批量创建 Application 的模板:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-app-set
namespace: argocd
spec:
generators:
# List Generator - 固定列表
- list:
elements:
- cluster: dev
url: https://kubernetes.default.svc
namespace: dev
- cluster: staging
url: https://kubernetes.default.svc
namespace: staging
- cluster: prod
url: https://kubernetes.default.svc
namespace: prod
template:
metadata:
name: my-app-{{cluster}}
spec:
project: default
source:
repoURL: https://github.com/example/manifests.git
targetRevision: HEAD
path: apps/my-app/{{cluster}}
destination:
server: '{{url}}'
namespace: '{{namespace}}'
syncPolicy:
automated: {}四、Jenkins + ArgoCD 实战
4.1 架构对比
┌─────────────────────────────────────────────────────────────────┐
│ Jenkins 模式 vs ArgoCD 模式 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Jenkins 模式: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 开发机 ──▶ GitLab ──▶ Jenkins ──▶ kubectl apply │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ K8s │ │
│ │ │ │
│ │ Jenkins 做所有事情 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ArgoCD 模式(GitOps): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 开发机 ──▶ GitLab ──▶ Jenkins ──▶ Harbor │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 更新 GitOps 仓库 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ GitOps 仓库 ◀──────────────── ArgoCD │ │
│ │ │ │ │
│ │ │ sync │ │
│ │ ▼ │ │
│ │ K8s │ │
│ │ │ │
│ │ CI: Jenkins CD: ArgoCD │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘4.2 完整 GitOps 流程
┌─────────────────────────────────────────────────────────────────┐
│ Jenkins + ArgoCD GitOps 流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 开发机 │────▶│ GitLab │────▶│ Jenkins │────▶│ Harbor │ │
│ │ │ │ (代码) │ │ CI │ │ (镜像) │ │
│ └─────────┘ └─────────┘ └────┬────┘ └────┬────┘ │
│ │ │ │
│ │ │ │
│ │ ▼ │
│ │ ┌─────────┐ │
│ │ │ 推送镜像 │ │
│ │ └────┬────┘ │
│ │ │ │
│ ▼ │ │
│ ┌─────────┐ │ │
│ │ 更新 │ │ │
│ │ GitOps │ │ │
│ │ 仓库 │ │ │
│ └────┬────┘ │ │
│ │ │ │
│ │ git push │ │
│ │ │ │
│ ▼ │ │
│ ┌─────────┐ │ │
│ │ GitOps │ │ │
│ │ 仓库 │ │ │
│ └────┬────┘ │ │
│ │ │ │
│ │ ArgoCD 监听 │ │
│ ▼ │ │
│ ┌─────────┐ │ │
│ │ ArgoCD │ │ │
│ │ Server │ │ │
│ └────┬────┘ │ │
│ │ │ │
│ │ sync │ │
│ ▼ │ │
│ ┌─────────┐ │ │
│ │ K8s │◀─────────────┘ │
│ │ 集群 │ │
│ └─────────┘ │
│ │
│ 总结: │
│ • Jenkins = CI(构建、测试、打包镜像) │
│ • ArgoCD = CD(监听 Git,自动部署到 K8s) │
│ │
└─────────────────────────────────────────────────────────────────┘4.3 Jenkinsfile 示例
pipeline {
agent any
environment {
REGISTRY = 'harbor.k8s.local'
PROJECT = 'greenhat'
APP_NAME = 'my-app'
IMAGE = "${REGISTRY}/${PROJECT}/${APP_NAME}"
GITOPS_REPO = 'ssh://git@git.k8s.local:30022/root/gitops.git'
}
stages {
stage('拉取代码') {
steps {
git 'ssh://git@git.k8s.local:30022/root/app.git'
}
}
stage('构建') {
steps {
sh 'go build -o app .'
}
}
stage('单元测试') {
steps {
sh 'go test ./... -v'
}
}
stage('制作镜像') {
steps {
sh """
docker build -t ${IMAGE}:${BUILD_NUMBER} .
docker tag ${IMAGE}:${BUILD_NUMBER} ${IMAGE}:latest
"""
}
}
stage('推送镜像') {
steps {
sh """
docker login ${REGISTRY} -u admin -p Harbor12345
docker push ${IMAGE}:${BUILD_NUMBER}
docker push ${IMAGE}:latest
"""
}
}
stage('更新 GitOps 仓库') {
steps {
dir('gitops') {
sh """
git clone ${GITOPS_REPO} .
# 更新镜像 tag
sed -i 's|image:.*|image: ${IMAGE}:${BUILD_NUMBER}|' \
apps/${APP_NAME}/deployment.yaml
git add .
git commit -m "更新 ${APP_NAME} 镜像为 ${BUILD_NUMBER}"
git push origin main
"""
}
}
}
}
}4.4 GitOps 仓库结构
┌─────────────────────────────────────────────────────────────────┐
│ GitOps 仓库推荐结构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ gitops-repo/ │
│ │ │
│ ├── argocd/ # ArgoCD 配置 │
│ │ ├── projects/ │
│ │ │ ├── production.yaml │
│ │ │ └── staging.yaml │
│ │ └── applications/ │
│ │ ├── frontend-app.yaml │
│ │ └── backend-app.yaml │
│ │ │
│ ├── apps/ # 应用清单 │
│ │ ├── frontend/ │
│ │ │ ├── base/ # 基础配置 │
│ │ │ │ ├── deployment.yaml │
│ │ │ │ ├── service.yaml │
│ │ │ │ └── kustomization.yaml │
│ │ │ └── overlays/ # 环境差异化 │
│ │ │ ├── dev/ │
│ │ │ ├── staging/ │
│ │ │ └── production/ │
│ │ │ │
│ │ └── backend/ │
│ │ ├── base/ │
│ │ └── overlays/ │
│ │ │
│ └── helm/ # Helm Chart │
│ └── mychart/ │
│ │
└─────────────────────────────────────────────────────────────────┘五、ArgoCD Rollouts(渐进式发布)
5.1 Rollout 是什么
┌─────────────────────────────────────────────────────────────────┐
│ ArgoCD Rollouts │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Rollout = 支持金丝雀、蓝绿、灰度发布的 CRD │
│ │
│ ArgoCD 只能做"同步",Rollout 能做"渐进式发布" │
│ │
└─────────────────────────────────────────────────────────────────┘5.2 金丝雀发布配置
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app
namespace: production
spec:
replicas: 10
strategy:
canary:
canaryService: my-app-canary
stableService: my-app-stable
trafficRouting:
nginx:
stableIngress: my-app-ingress
additionalIngressAnnotations:
canary-weight: "10"
steps:
- setWeight: 10 # 先分配 10% 流量到新版本
- pause: {} # 暂停,等待人工确认
- setWeight: 30 # 30%
- pause: {duration: 10} # 暂停 10 分钟
- setWeight: 50 # 50%
- pause: {duration: 10}
- setWeight: 100 # 全量
analysis:
templates:
- templateName: success-rate
startingStep: 1
autoPromotionEnabled: false # 关闭自动推进5.3 蓝绿发布配置
spec:
strategy:
blueGreen:
activeService: my-app-active
previewService: my-app-preview
autoPromotionEnabled: false
previewReplicaCount: 5
prePromotionChecks:
- pause: {}
postPromotionChecks:
- pause: {}六、环境说明
┌─────────────────────────────────────────────────────────────────┐
│ CI/CD 环境层级 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 开发环境(Dev) │ │
│ │ • 开发人员本地,代码编写、调试 │ │
│ │ • ArgoCD 自动同步(任何分支 push) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 测试环境(SIT/QA) │ │
│ │ • 系统集成测试、功能测试 │ │
│ │ • ArgoCD 自动同步(主分支 push) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 预发环境(Staging/UAT) │ │
│ │ • 用户验收测试 │ │
│ │ • 最接近生产环境 │ │
│ │ • ArgoCD 自动同步 + 金丝雀策略 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 生产环境(Production) │ │
│ │ • 真实用户访问 │ │
│ │ • ArgoCD 手动同步 + 人工审批 │ │
│ │ • 金丝雀/蓝绿发布 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘七、企业级架构图
┌─────────────────────────────────────────────────────────────────┐
│ 企业级 CI/CD + GitOps 架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 开发机 (test06) │ │
│ │ 192.168.8.116 │ │
│ │ │ │
│ │ 开发者写代码 ──▶ git push ──▶ GitLab │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 工具集群 (test07) │ │
│ │ 192.168.8.117 │ │
│ │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Jenkins │ │ GitLab │ │ Harbor │ │ ArgoCD │ │ │
│ │ │ CI │ │ 代码仓库 │ │ 镜像仓库 │ │ CD │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 测试集群 │ │ 预发集群 │ │ 生产集群 │ │
│ │ (test04) │ │ (test05) │ │ (test05) │ │
│ │ │ │ │ │ │ │
│ │ • ArgoCD 自动 │ │ • ArgoCD 自动 │ │ • ArgoCD 手动 │ │
│ │ • 自动同步 │ │ • 金丝雀发布 │ │ • 人工审批 │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘八、金丝雀发布原理
┌─────────────────────────────────────────────────────────────────┐
│ 金丝雀发布原理 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 背景:以前矿工下矿井前,会先放一只金丝雀测试氧气是否充足 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ v1 版本(老版本) │ │
│ │ │ │ │
│ │ │ 100% 流量 ────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ 升级中... │ │ │
│ │ │ 10% 流量 ─────────────┐ │ │ │
│ │ │ ▼ │ │ │
│ │ │ ┌──────────┐ │ │ │
│ │ │ │ v2 版本 │ │ │ │
│ │ │ │ (新版本) │ │ │ │
│ │ │ │ 10% 流量 │ │ │ │
│ │ │ └──────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ 观察错误率、响应时间 │ │ │
│ │ │ │ │ │ │
│ │ │ ✅ 没问题 │ │ │
│ │ │ │ │ │ │
│ │ │ 全量切换到 v2 │ │ │
│ │ │ │ │ │ │
│ │ │ ┌──────────┐ │ │ │
│ │ │ │ v2 版本 │ │ │ │
│ │ │ │ 100% 流量 │ │ │ │
│ │ │ └──────────┘ │ │ │
│ │ │ │ │ │
│ │ │ ❌ 有问题?回滚到 v1 │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘九、回滚机制
需要回滚的情况
• 错误率突然上升
• 响应时间暴增
• 新版本有 Bug
• 业务指标异常回滚命令
# 快速回滚到上一个版本
kubectl rollout undo deployment/app -n production
# 回滚到指定版本
kubectl rollout undo deployment/app --to-revision=3 -n production
# 查看部署历史
kubectl rollout history deployment/app -n production
# ArgoCD CLI 回滚
argocd app rollback my-app 3十、ArgoCD CLI 常用命令
# 登录
argocd login argocd.example.com --username admin --password <pass>
# 应用管理
argocd app list # 列出所有应用
argocd app get my-app # 获取应用详情
argocd app create my-app -f app.yaml # 创建应用
argocd app delete my-app # 删除应用
argocd app sync my-app # 同步应用
# 查看状态
argocd app status my-app # 查看状态
argocd app history my-app # 查看历史
argocd app resources my-app # 查看资源
# 回滚
argocd app rollback my-app 3 # 回滚到版本 3
# 集群管理
argocd cluster list # 列出集群
argocd cluster add <context> # 添加集群十一、总结
┌─────────────────────────────────────────────────────────────────┐
│ CI/CD + GitOps 总结 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 核心理念: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ GitOps = Git 是单一真相来源(Single Source of Truth) │ │
│ │ │ │
│ │ Git 变 → ArgoCD 自动同步到 K8s │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 工具分工: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Jenkins = CI(构建、测试、打包镜像) │ │
│ │ ArgoCD = CD(监听 Git,自动部署到 K8s) │ │
│ │ Argo Rollouts = 渐进式发布(金丝雀/蓝绿) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 完整流程: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 开发者 push 代码 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ Jenkins CI │ │
│ │ • 拉取代码 → 编译 → 测试 → 扫描 → 打包镜像 → 推送 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 更新 GitOps 仓库(镜像 tag) │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ArgoCD 检测到变化 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 自动同步到 K8s 集群 / 金丝雀发布 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ GitOps 优势: │
│ • Git 记录所有变更,可审计、可回滚 │
│ • 声明式配置,环境一致性 │
│ • 权限分离(开发者只需改 Git) │
│ • 多集群统一管理 │
│ │
└─────────────────────────────────────────────────────────────────┘分享