当前位置: 首页 > news >正文

K8S蓝绿发布

在 Kubernetes(K8S)中,蓝绿发布是一种零停机的发布策略,核心思路是同时维护两套完全相同的环境(蓝环境 = 旧版本,绿环境 = 新版本),先部署绿环境并验证,验证通过后将流量从蓝环境切换到绿环境,最后销毁蓝环境。以下是详细的实现步骤、核心资源和实操示例:

一、蓝绿发布核心原理

  1. 环境隔离:蓝、绿环境使用独立的 Deployment(或 StatefulSet),但共享同一个 Service(通过标签选择器控制流量指向)。
  2. 流量切换:通过修改 Service 的selector标签,将流量从旧版本(蓝)切换到新版本(绿)。
  3. 回滚机制:若绿环境异常,只需将 Service 的 selector 切回蓝环境标签,即可快速回滚。

二、前置条件

  1. 已部署 K8S 集群(单节点 / 多节点均可)。
  2. 已准备好新旧版本的应用镜像(例如:app:v1= 蓝,app:v2= 绿)。
  3. 熟悉 K8S 的 Deployment、Service、Label 核心概念。

三、分步实现蓝绿发布

步骤 1:部署蓝环境(旧版本)

首先部署旧版本应用(蓝环境),并通过 Service 暴露流量。

1.1 蓝环境 Deployment(app-v1.yaml)

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: app-blue # 蓝环境 Deployment 名称 spec: replicas: 3 # 副本数,根据业务调整 selector: matchLabels: app: myapp version: v1 # 蓝环境核心标签 template: metadata: labels: app: myapp version: v1 # 与 selector 一致 spec: containers: - name: myapp image: app:v1 # 旧版本镜像 ports: - containerPort: 8080 readinessProbe: # 就绪探针,确保容器就绪后再接收流量 httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 5

1.2 服务暴露 Service(app-service.yaml)

yaml

apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: ClusterIP # 或 NodePort/LoadBalancer,根据场景选择 selector: app: myapp version: v1 # 初始指向蓝环境 ports: - port: 80 targetPort: 8080

1.3 部署蓝环境

bash

运行

kubectl apply -f app-v1.yaml kubectl apply -f app-service.yaml # 验证蓝环境运行正常 kubectl get pods -l version=v1 kubectl port-forward service/myapp-service 8080:80 # 本地访问验证
步骤 2:部署绿环境(新版本)

部署新版本应用(绿环境),此时绿环境不接收任何流量(因为 Service 的 selector 仍指向 v1)。

2.1 绿环境 Deployment(app-v2.yaml)

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: app-green # 绿环境 Deployment 名称 spec: replicas: 3 selector: matchLabels: app: myapp version: v2 # 绿环境核心标签 template: metadata: labels: app: myapp version: v2 spec: containers: - name: myapp image: app:v2 # 新版本镜像 ports: - containerPort: 8080 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 5

2.2 部署绿环境并验证

bash

运行

kubectl apply -f app-v2.yaml # 验证绿环境 Pod 正常运行(此时无流量) kubectl get pods -l version=v2 # 可选:直接访问绿环境 Pod IP 验证新版本功能 kubectl exec -it <蓝环境Pod> -- curl <绿环境PodIP>:8080
步骤 3:切换流量到绿环境

修改 Service 的selector,将流量从version: v1切换到version: v2

方式 1:编辑 Service(交互式)

bash

运行

kubectl edit service myapp-service # 将 spec.selector.version 从 v1 改为 v2,保存退出

方式 2:命令行替换(推荐,可自动化)

bash

运行

kubectl patch service myapp-service -p '{"spec":{"selector":{"version":"v2"}}}'

验证流量切换

bash

运行

# 本地访问 Service,确认返回新版本内容 kubectl port-forward service/myapp-service 8080:80 # 查看 Service 端点(已指向绿环境 Pod) kubectl describe service myapp-service | grep Endpoints
步骤 4:确认无误后清理蓝环境

若绿环境运行稳定,删除蓝环境 Deployment:

bash

运行

kubectl delete deployment app-blue
回滚操作(若绿环境异常)

只需将 Service 的 selector 切回version: v1即可:

bash

运行

kubectl patch service myapp-service -p '{"spec":{"selector":{"version":"v1"}}}' # 之后可删除绿环境 Deployment kubectl delete deployment app-green

四、进阶优化

  1. 使用 Label 而非 Deployment 名称:确保蓝绿环境的核心区别是version标签,而非 Deployment 名称,降低维护成本。
  2. 自动化验证:在切换流量前,通过脚本 / CI 验证绿环境的健康检查、接口可用性。
  3. 结合 Ingress:若对外暴露服务,可通过 Ingress 的backend.service.selector切换流量,支持域名 / 路径级别的蓝绿发布。
  4. 扩缩容策略:切换前可先扩绿环境副本数至与蓝环境一致,切换后缩容蓝环境,避免资源浪费。
  5. 使用 Argo Rollouts/Flagger:若需更完善的发布策略(如金丝雀、自动回滚),可集成 K8S 原生的发布控制器(Argo Rollouts 支持蓝绿 / 金丝雀发布)。

五、注意事项

  1. 资源占用:蓝绿发布需同时运行两套环境,集群资源需预留足够容量。
  2. 状态应用处理:若应用有状态(如数据库),需确保蓝绿环境数据一致性(如使用共享存储、数据库迁移脚本)。
  3. 长连接处理:若应用有长连接(如 TCP),切换流量后旧连接可能持续到超时,需在应用层处理连接优雅关闭。

总结

K8S 蓝绿发布的核心是标签隔离 + Service 流量切换,流程简单、回滚成本低,适合对可用性要求高、版本差异较大的场景。核心步骤:部署蓝环境 → 部署绿环境 → 验证绿环境 → 切换流量 → 清理蓝环境,全程零停机,是生产环境中最常用的发布策略之一。

http://www.cnnetsun.cn/news/4516.html

相关文章:

  • 邀请函 | G-Star Gathering Day 成都站:AI全栈技术探索之旅
  • 前端新人必学:手把手封装 fetch,告别重复请求代码(附实战技巧)
  • CAIE 认证 2025 含金量:AI 职场突围的权威技能凭证
  • 从蓝图到行动:解码全球车企ESG战略与绿色供应链竞速
  • Docker常见问题(多种类似命令之间的区别)
  • 零碎的知识点(二十一):序列二次规划(Sequential Quadratic Programming, SQP)
  • Python-Wechaty构建高可用微信机器人的分布式架构实践
  • DataGear完整指南:5分钟快速上手开源数据可视化平台
  • Blender Python API终极指南:从零开始掌握3D自动化编程
  • ZEMAX激光成像设计:5个实战案例快速上手指南
  • EverythingToolbar与Everything搜索引擎深度集成:Windows文件搜索的技术革命
  • 为什么你的MinerU本地部署总是失败?5个关键检查点帮你彻底解决
  • 积木报表JimuReport终极部署指南:从零到精通的完整教程
  • GPT-5.2:会改变创意产业的格局,还是仅仅是昙花一现?
  • 基于扩散架构的高效T2V模型:Wan2.2-T2V-5B原理剖析
  • 终极Altium设计文件查看解决方案:零门槛访问PCB与原理图
  • 终极指南:5分钟打造你的个人信息指挥中心
  • 教你3步防止浏览器指纹泄露,隐私安全不再是难题
  • 如何快速掌握Play Integrity Fix:新手完整教程
  • 昇腾 CANN 与 Ascend C 协同创新:算子开发的效率提升与技术演进
  • 鸿蒙 + Electron:跨端开发新范式,从环境搭建到实战开发
  • Wan2.2-T2V-5B能否生成法律情景剧视频?合规性审查
  • Gittyup终极指南:快速掌握图形化Git客户端
  • PowerShell 7.5启动失败的终极诊断与修复指南
  • Altium Designer Viewer - 免费电路设计查看终极方案
  • VCR终极贡献指南:快速掌握HTTP测试录制工具的开源参与技巧
  • LLM之Agent(四十)|AI Agents(九):Agentic Memory介绍
  • 终极免费图片查看器PicView完整使用指南:快速掌握高效浏览技巧
  • (LU)小动物自身给药系统 自身给药系统 静脉自身给药系统
  • MFC Custom Control控件完全指南:从入门到精通