← 返回文章列表

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/*, allow

3.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: Never

Hook 类型

类型时机用途
PreSync同步之前数据库迁移、备份
Sync同步时主要资源创建/更新
PostSync同步之后健康检查、通知
Skip跳过忽略此次同步

3.7 ArgoCD 回滚

CLI 回滚

# 查看历史版本
argocd app history my-app
 
# 回滚到指定版本
argocd app rollback my-app 3
 
# 回滚到上一个版本
argocd app rollback my-app

Git 回滚

# 本地回滚 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)                                │
│   • 多集群统一管理                                              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
分享

// RELATED_POSTS

0%