K8s CI/CD 架构实战
云原生时代业务从月级版本变为分钟级交付,传统"人工打包 + 手动 kubectl apply"已无法满足高频发布、多环境隔离、可回滚可追溯、自动化安全的需求。
架构概览
| 组件 | 作用 | 推荐部署 |
|---|---|---|
| GitLab/GitHub | 代码托管与版本控制 | 云端或自建 |
| Jenkins / GitLab CI | CI 构建与镜像打包 | 独立 Pod 部署 |
| Harbor / DockerHub | 镜像仓库 | 内网优先 |
| Argo CD / FluxCD | GitOps 持续部署 | 集群内 |
| Helm / Kustomize | 配置模板与环境管理 | 与 CD 结合 |
| Kubernetes | 最终运行环境 | Master + Node |
CI 阶段:构建与镜像管理
Jenkins Pipeline
pipeline {
agent any
environment {
REGISTRY = "harbor.mycorp.local"
IMAGE_NAME = "myapp"
VERSION = "${env.BUILD_NUMBER}"
}
stages {
stage('Checkout') {
steps { git branch: 'main', url: 'https://gitlab.mycorp.local/myapp.git' }
}
stage('Build & Test') {
steps { sh 'mvn clean package -DskipTests' }
}
stage('Docker Build & Push') {
steps {
sh """
docker build -t ${REGISTRY}/${IMAGE_NAME}:${VERSION} .
docker push ${REGISTRY}/${IMAGE_NAME}:${VERSION}
"""
}
}
stage('Update Helm Values') {
steps {
sh """
git clone https://gitlab.mycorp.local/helm-charts.git
cd helm-charts && sed -i "s/tag:.*/tag: ${VERSION}/" values.yaml
git commit -am "Release ${VERSION}" && git push
"""
}
}
}
}
代码质量门禁(SonarQube)
CI 流水线中集成静态代码分析,质量不达标阻断构建:
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh 'mvn sonar:sonar'
}
}
}
stage('Quality Gate') {
steps {
timeout(time: 5, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
安全扫描
stage('Security Scan') {
steps {
sh 'trivy image --exit-code 1 --severity HIGH,CRITICAL ${REGISTRY}/${IMAGE_NAME}:${VERSION}'
}
}
CD 阶段:GitOps 持续部署
Argo CD 部署模式
Argo CD 监听 Git 仓库中的 Helm Chart 变更,自动同步到 K8s 集群:
# 安装 Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 创建 Application
argocd app create myapp \
--repo https://gitlab.mycorp.local/helm-charts.git \
--path charts/myapp \
--dest-server https://kubernetes.default.svc \
--dest-namespace production \
--sync-policy automated \
--auto-prune
Argo CD 同步策略
| 策略 | 说明 |
|---|---|
| Manual Sync | 手动触发同步,适合生产环境 |
| Automated Sync | 检测到 Git 变更自动同步 |
| Auto Prune | 自动删除 Git 中移除的资源 |
| Self Heal | 检测到集群漂移自动修复 |
Helm 多环境管理
charts/
└── myapp/
├── Chart.yaml
├── values.yaml # 默认值
├── values-dev.yaml # 开发环境
├── values-staging.yaml # 预发布环境
└── values-prod.yaml # 生产环境
部署命令:
# 安装到开发环境
helm upgrade --install myapp ./charts/myapp -f values-dev.yaml -n dev
# 生产环境(带灰度策略)
helm upgrade --install myapp ./charts/myapp -f values-prod.yaml -n production
多环境隔离策略
# values-prod.yaml
replicaCount: 3
image:
tag: "v2.5.1"
resources:
limits:
cpu: "2"
memory: 4Gi
ingress:
enabled: true
host: myapp.mycorp.com
# values-staging.yaml
replicaCount: 1
resources:
limits:
cpu: "500m"
memory: 1Gi
ingress:
enabled: true
host: myapp-staging.mycorp.local
发布策略
| 策略 | 实现 | 适用场景 |
|---|---|---|
| Rolling Update | K8s 原生滚动更新 | 常规发布 |
| Blue-Green | 两套完整环境切换 | 核心服务(0 downtime) |
| Canary | Argo Rollouts / Istio 流量分割 | 需要渐进验证 |
| A/B Testing | 基于 Header/Cookie 路由 | 功能实验 |
完整 CI/CD 流程
Git Push → CI Pipeline(构建/测试/扫描/打包)→ Push Image → Update Helm Values
↓
Argo CD 检测变更 → Sync to K8s
关联页面
| 页面 | 关联点 |
|---|---|
| jenkins-multi-master-k8s-deployment | Jenkins 多 Master + K8S 部署方案 |
| docker-image-optimization | Docker 镜像优化(含 CI/CD 构建脚本) |
| k8s-multicluster-istio-canary | K8s 多集群 + Istio 灰度发布与流量治理生产指南 — 全球多活架构、五层治理设计、Cana |
| k8s-rolling-update-pitfalls | K8s 滚动更新无损发布误区 |