首页主机资讯Debian Jenkins如何实现蓝绿部署

Debian Jenkins如何实现蓝绿部署

时间2025-12-15 15:16:06发布访客分类主机资讯浏览317
导读:Debian 上用 Jenkins 落地蓝绿部署的完整方案 一 架构与前置准备 运行环境 在 Debian 安装 Java 11、Jenkins、Docker,并建议安装 Kubernetes 插件 与 Pipeline 插件;如需容...

Debian 上用 Jenkins 落地蓝绿部署的完整方案


一 架构与前置准备

  • 运行环境
    • Debian 安装 Java 11JenkinsDocker,并建议安装 Kubernetes 插件Pipeline 插件;如需容器化交付,准备 镜像仓库(如 Docker Registry/Harbor)。
    • 安全与权限:使用 RBAC 最小权限;凭据统一在 Jenkins Credentials 管理(K8s kubeconfig、Git SSH、镜像仓库账号等)。
  • 目标架构
    • 方案A(容器化):生产两套 Kubernetes 命名空间(如 prod-blue / prod-green),一次只承载流量的一套为 Active,另一套为 Standby;通过修改 Service 的 selectorIngress 权重完成切换。
    • 方案B(传统主机):两台 Nginx/HAProxy 前端 + 两套后端实例(blue/green),通过修改 upstream 指向切换流量。

二 方案一 Kubernetes 蓝绿部署

  • 思路
    • 预置两套完全一致的 Deployment + Service(命名空间或 Service 名区分),当前承载流量的为 Active;Jenkins 将新版本部署到 Standby,完成就绪检查与冒烟测试后,切换 Service selector 到新版本,实现秒级切换与快速回滚。
  • 关键步骤
    1. 在代码库根目录放置 Jenkinsfile,采用 Declarative Pipeline;通过参数选择部署到 stagingproduction
    2. 构建与推送镜像(示例):
      • docker.build(“${ env.DOCKER_REGISTRY} /${ APP_NAME} :${ env.BUILD_NUMBER} ”)
      • docker push(“${ env.DOCKER_REGISTRY} /${ APP_NAME} :${ env.BUILD_NUMBER} ”)
    3. 部署到预发布(Staging),运行自动化验收测试。
    4. 生产审批(input 步骤),超时例如 30 分钟
    5. 生产蓝绿切换:
      • 将新版本部署到 Standby(如当前是 blue,则部署到 green)。
      • 等待就绪:kubectl rollout status deployment/${ APP_NAME} -n ${ targetNamespace} --timeout=300s
      • 执行冒烟/健康检查。
      • 切换流量:更新 Service selector 指向新版本标签,或更新 Ingresscanary/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 负责发布新版本、健康检查与切换。
  • 关键步骤
    1. 目录结构示例:/var/www/{ blue,green} /current -> 版本化目录(软链)。
    2. Jenkins 拉取新版本、构建、发布到 Standby 目录,执行健康检查。
    3. 切换流量:原子替换 Nginx upstream 配置并 reload。
    4. 验证与回滚:若异常,立即切回 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 的场景。

四 质量门禁 审批 回滚与可观测性

  • 质量门禁
    • 在流水线中加入 单元测试静态代码分析(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 SecretVault
  • 健康检查:为 就绪探针(readiness)存活探针(liveness) 配置合理阈值,避免将未就绪实例接入流量。
  • 发布窗口与监控:选择 低峰时段 发布,设置 自动回滚阈值(如错误率 > 1% 自动回切),并保留 最近几次发布产物 便于应急。
  • 渐进式流量:若需更平滑,可在蓝绿基础上引入 金丝雀发布(按权重逐步放量),进一步降低风险。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Debian Jenkins如何实现蓝绿部署
本文地址: https://pptw.com/jishu/771709.html
Ubuntu Jellyfin如何连接外部硬盘 Ubuntu Jellyfin如何修改设置

游客 回复需填写必要信息