Debian Jenkins如何实现蓝绿部署
导读:Debian 上用 Jenkins 落地蓝绿部署的完整方案 一 架构与前置准备 运行环境 在 Debian 安装 Java 11、Jenkins、Docker,并建议安装 Kubernetes 插件 与 Pipeline 插件;如需容...
Debian 上用 Jenkins 落地蓝绿部署的完整方案
一 架构与前置准备
- 运行环境
- 在 Debian 安装 Java 11、Jenkins、Docker,并建议安装 Kubernetes 插件 与 Pipeline 插件;如需容器化交付,准备 镜像仓库(如 Docker Registry/Harbor)。
- 安全与权限:使用 RBAC 最小权限;凭据统一在 Jenkins Credentials 管理(K8s kubeconfig、Git SSH、镜像仓库账号等)。
- 目标架构
- 方案A(容器化):生产两套 Kubernetes 命名空间(如 prod-blue / prod-green),一次只承载流量的一套为 Active,另一套为 Standby;通过修改 Service 的 selector 或 Ingress 权重完成切换。
- 方案B(传统主机):两台 Nginx/HAProxy 前端 + 两套后端实例(blue/green),通过修改 upstream 指向切换流量。
二 方案一 Kubernetes 蓝绿部署
- 思路
- 预置两套完全一致的 Deployment + Service(命名空间或 Service 名区分),当前承载流量的为 Active;Jenkins 将新版本部署到 Standby,完成就绪检查与冒烟测试后,切换 Service selector 到新版本,实现秒级切换与快速回滚。
- 关键步骤
- 在代码库根目录放置 Jenkinsfile,采用 Declarative Pipeline;通过参数选择部署到 staging 或 production。
- 构建与推送镜像(示例):
- docker.build(“${ env.DOCKER_REGISTRY} /${ APP_NAME} :${ env.BUILD_NUMBER} ”)
- docker push(“${ env.DOCKER_REGISTRY} /${ APP_NAME} :${ env.BUILD_NUMBER} ”)
- 部署到预发布(Staging),运行自动化验收测试。
- 生产审批(input 步骤),超时例如 30 分钟。
- 生产蓝绿切换:
- 将新版本部署到 Standby(如当前是 blue,则部署到 green)。
- 等待就绪:kubectl rollout status deployment/${ APP_NAME} -n ${ targetNamespace} --timeout=300s
- 执行冒烟/健康检查。
- 切换流量:更新 Service selector 指向新版本标签,或更新 Ingress 的 canary/weight(若使用 Ingress-Nginx)。
- 观察指标与日志,确认稳定;如需回滚,将 Service 切回 Active 或执行 kubectl rollout undo。
- 参考 Jenkinsfile 片段(核心阶段)
- environment { DOCKER_REGISTRY = ‘registry.example.com’ APP_NAME = ‘my-app’ PROD_NAMESPACE_BLUE = ‘prod-blue’ PROD_NAMESPACE_GREEN = ‘prod-green’ KUBECONFIG = credentials(‘k8s-prod-config’) }
- parameters { choice(name: ‘DEPLOY_TO’, choices: [‘staging’,‘production’], description: ‘选择部署环境’) }
- stage(‘Blue-Green Switch’) {
when {
equals expected: ‘production’, actual: params.DEPLOY_TO }
steps {
script {
def current = sh(script: “kubectl get svc ${
APP_NAME}
-n ${
PROD_NAMESPACE_BLUE}
-o jsonpath=‘{
.spec.selector.version}
’ || echo ‘blue’”, returnStdout: true).trim()
def target = (current == ‘blue’) ? ‘green’ : ‘blue’
def targetNs = (target == ‘blue’) ? env.PROD_NAMESPACE_BLUE : env.PROD_NAMESPACE_GREEN
def inactiveNs = (target == ‘blue’) ? env.PROD_NAMESPACE_GREEN : env.PROD_NAMESPACE_BLUE
// 1) 部署新版本到 Standby
sh “kubectl apply -f k8s/production-deployment.yaml -n ${
targetNs}
”
sh “kubectl rollout status deployment/${
APP_NAME}
-n ${
targetNs}
--timeout=300s”
// 2) 冒烟测试
sh “./healthcheck.sh --host ${
APP_NAME}
.${
targetNs}
.svc.cluster.local”
// 3) 切换流量(示例:更新 Service selector)
sh “”"
kubectl patch svc ${
APP_NAME}
-n ${
PROD_NAMESPACE_BLUE}
-p ‘{
“spec”:{
“selector”:{
“app”:“${
APP_NAME}
”,“version”:“${
target}
”}
}
}
’
“”"
// 4) 可选:短暂观察后清理旧环境
// sh “kubectl delete ns ${
inactiveNs}
|| true”
}
}
}
注:生产上建议将切换与回滚封装为脚本/工具,并接入监控告警与日志聚合。
三 方案二 传统主机 Nginx 蓝绿部署
- 思路
- 两套后端 blue/green 目录或主机组;Nginx 通过 upstream 切换流量;Jenkins 负责发布新版本、健康检查与切换。
- 关键步骤
- 目录结构示例:/var/www/{ blue,green} /current -> 版本化目录(软链)。
- Jenkins 拉取新版本、构建、发布到 Standby 目录,执行健康检查。
- 切换流量:原子替换 Nginx upstream 配置并 reload。
- 验证与回滚:若异常,立即切回 Active upstream 并 reload。
- Nginx 配置示例
- upstream backend {
server 10.0.1.10:8080;
# blue
server 10.0.1.11:8080;
# green
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
切换脚本思路(示意): - 将 upstream 中 server 列表替换为目标环境地址 → nginx -t → systemctl reload nginx。
该方式简单可靠,适合无 K8s 的场景。
- upstream backend {
server 10.0.1.10:8080;
# blue
server 10.0.1.11:8080;
# green
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
四 质量门禁 审批 回滚与可观测性
- 质量门禁
- 在流水线中加入 单元测试、静态代码分析(SonarQube)、制品扫描、E2E/冒烟测试;测试不通过则阻断发布。
- 人工审批
- 生产阶段加入 input 审批,设置 超时(如 30 分钟),保留发布审计。
- 快速回滚
- Kubernetes:kubectl rollout undo deployment/${ APP_NAME} -n ${ namespace} ;或把 Service selector 切回旧版本。
- Nginx:将 upstream 切回 Active 并 reload。
- 可观测性
- 接入 日志聚合(ELK)、指标与告警(Prometheus/Grafana)、分布式追踪;发布后在 灰度窗口 观察错误率、延迟、吞吐等关键指标,再扩大流量或完成切换。
五 常见坑与优化建议
- 数据库与有状态:蓝绿共用 生产数据库 时,确保 向后兼容(避免破坏性变更);必要时采用 双写/迁移脚本/特性开关 降低风险。
- 配置与密钥:环境配置与 Secret 随环境隔离,避免把 生产配置 带入 Standby;使用 K8s Secret 或 Vault。
- 健康检查:为 就绪探针(readiness) 与 存活探针(liveness) 配置合理阈值,避免将未就绪实例接入流量。
- 发布窗口与监控:选择 低峰时段 发布,设置 自动回滚阈值(如错误率 > 1% 自动回切),并保留 最近几次发布产物 便于应急。
- 渐进式流量:若需更平滑,可在蓝绿基础上引入 金丝雀发布(按权重逐步放量),进一步降低风险。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Debian Jenkins如何实现蓝绿部署
本文地址: https://pptw.com/jishu/771709.html
