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

每日一Go-66、K8s 蓝绿发布 金丝雀发布实战:Service 切流量 + Ingress 灰度一次讲透

一、什么是蓝绿发布?

蓝绿发布 = 两套完整环境(Blue/Green)同时存在,通过 Service 一次性切换流量。

Blue 代表当前线上版本;Green代表新版本;切换点是 Service selector

二、蓝绿发布示例

  1. 有两套环境同时在线,Service 一刀切流量

  2. K8s资源结构

Deployment(blue)---> Pod (v1)Deployment(green)---> Pod (v2)Service---> selector 决定流量去向
  1. 当前线上v1(Blue版)
# 部署(Deployment) - 用于管理应用程序的Pod副本apiVersion: apps/v1# Kubernetes应用部署的API版本kind: Deployment# 资源类型:Deployment用于管理无状态应用的部署metadata:# 元数据部分name: golang-per-day-65# 部署名称namespace: codee-jun# Kubernetes命名空间spec:# 部署规格# 副本数量:期望运行的Pod数量replicas:3# 运行3个Pod副本,提供高可用性strategy:# 策略:滚动更新策略type: RollingUpdate# 策略类型:滚动更新rollingUpdate:# 滚动更新配置maxSurge:1# 最大激增数:允许同时运行的最大Pod数量超过期望副本数maxUnavailable:1# 最大不可用数:允许同时运行的最大Pod数量低于期望副本数# 选择器:用于选择管理哪些Podselector: matchLabels:# 匹配标签:选择具有特定标签的Podapp: golang-per-day-65# 标签名称,用于标识应用version: v1# 版本标签,用于标识应用的不同版本
  1. 新版本V2(Green版)
selector: matchLabels:# 匹配标签:选择具有特定标签的Podapp: golang-per-day-65# 标签名称,用于标识应用version: v2# 版本标签,用于标识应用的不同版本
  1. Service 切换成v2
# 服务(Service) - 用于暴露应用程序并提供负载均衡 apiVersion: v1 # Kubernetes API版本 kind: Service # 资源类型:Service用于暴露应用程序 metadata: name: golang-per-day-65 # 服务名称 namespace: codee-jun # Kubernetes命名空间 spec: # 服务规格 ports: # 端口配置列表 - protocol: TCP # 协议类型:TCP port: 8080 # 服务端口(集群内部访问端口) targetPort: 8080 # 目标端口(Pod内部端口) sessionAffinity: ClientIP # 会话亲和性:ClientIP表示同一客户端的请求会转发到同一Pod,为了保持session一致性 selector: # Pod选择器 app: golang-per-day-65 # 匹配具有app=golang-per-day-65标签的Pod # version: v1 # 匹配具有version=v1标签的Pod version: v2 # 匹配具有version=v2标签的Pod
  1. 发布/回滚

6.1 发布新版本

kubectl patch svc golang-per-day-65 \ -p '{"spec":{"selector":{"version":"v2","app":"golang-per-day-65"}}}'

6.2 秒级回滚

kubectl patch svc golang-per-day-65 \ -p '{"spec":{"selector":{"version":"v1","app":"golang-per-day-65"}}}'

三、什么是金丝雀发布?

简单来说,金丝雀发布(Canary Deployment)就是一种“先找一小拨人试用,没问题再全量推广”的策略。

它之所以叫这个名字,是因为以前矿工下井前会先放一只金丝雀进去,如果金丝雀出了意外,说明井下有毒气,矿工就不会进去。在软件世界里,新版本就是那只金丝雀

四、金丝雀发布示例

  1. 少量流量先给新版本,逐步放量

  2. K8s资源结构

service.yaml---> v1service.v2.yaml---> v2ingress.yaml---> stableingress.canary.yaml---> canary
  1. service.yaml
# 服务(Service) - 用于暴露应用程序并提供负载均衡 apiVersion: v1 # Kubernetes API版本 kind: Service # 资源类型:Service用于暴露应用程序 metadata: name: golang-per-day-65 # 服务名称 namespace: codee-jun # Kubernetes命名空间 spec: # 服务规格 ports: # 端口配置列表 - protocol: TCP # 协议类型:TCP port: 8080 # 服务端口(集群内部访问端口) targetPort: 8080 # 目标端口(Pod内部端口) sessionAffinity: ClientIP # 会话亲和性:ClientIP表示同一客户端的请求会转发到同一Pod,为了保持session一致性 selector: # Pod选择器 app: golang-per-day-65 # 匹配具有app=golang-per-day-65标签的Pod version: v1 # 匹配具有version=v1标签的Pod
  1. service.v2.yaml
spec:# 服务规格ports:# 端口配置列表- protocol: TCP# 协议类型:TCPport:8080# 服务端口(集群内部访问端口)targetPort:8080# 目标端口(Pod内部端口)sessionAffinity: ClientIP# 会话亲和性:ClientIP表示同一客户端的请求会转发到同一Pod,为了保持session一致性selector:# Pod选择器app: golang-per-day-65# 匹配具有app=golang-per-day-65标签的Podversion: v2# 匹配具有version=v2标签的Pod
  1. ingress.yaml
# golang_per_day_65 项目的 Ingress 配置# 用于管理外部访问集群内服务的路由规则apiVersion: networking.k8s.io/v1 kind: Ingress# Ingress 元数据配置metadata: name: golang_per_day_65-ingress# Ingress 资源名称namespace: codee_jun# 所属命名空间annotations:# Nginx Ingress 控制器特定配置# CORS 配置nginx.ingress.kubernetes.io/enable-cors:"true"# 启用跨域资源共享nginx.ingress.kubernetes.io/cors-allow-origin:"https://golang_per_day_65.com"# 允许的源nginx.ingress.kubernetes.io/cors-allow-methods:"GET, POST, PUT, DELETE, OPTIONS"# 允许的HTTP方法nginx.ingress.kubernetes.io/cors-allow-headers:"DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"# 允许的请求头nginx.ingress.kubernetes.io/cors-allow-credentials:"true"# 如果需要凭证# 代理配置nginx.ingress.kubernetes.io/proxy-body-size:"1024m"# 允许的请求体大小# 会话亲和性配置nginx.ingress.kubernetes.io/affinity:"cookie"# 启用基于cookie的会话亲和性nginx.ingress.kubernetes.io/session-cookie-name:"golang_per_day_65-session"# 会话cookie名称nginx.ingress.kubernetes.io/session-cookie-expires:"172800"# cookie过期时间(秒)nginx.ingress.kubernetes.io/session-cookie-max-age:"172800"# cookie最大生存时间(秒)# Ingress 规格配置spec: ingressClassName: nginx# 使用的Ingress控制器类名# TLS 配置(HTTPS)tls: - hosts: - golang_per_day_65.com# 域名secretName: codee-jun-tls-secret# tls证书# 路由规则rules: - host: golang_per_day_65.com# 域名http:# 协议paths:# 路径- path: /# 路径pathType: Prefix# 路径类型backend:# 后端service:# 服务name: golang-per-day-65# 服务名称port:# 服务端口number:8080# 服务端口号
  1. ingress.canary.yaml
annotations:# Nginx Ingress 控制器特定配置nginx.ingress.kubernetes.io/canary:"true"# 启用金丝雀发布nginx.ingress.kubernetes.io/canary-weight:"10"# 金丝雀发布权重... rules: - host: golang_per_day_65.com# 域名http:# 协议paths:# 路径- path: /# 路径pathType: Prefix# 路径类型backend:# 后端service:# 服务name: golang-per-day-65-v2# 服务名称port:# 服务端口number:8080# 服务端口号
  1. 按百分比发布
annotations: nginx.ingress.kubernetes.io/canary:"true"# 启用金丝雀发布nginx.ingress.kubernetes.io/canary-weight:"10"#10%到新版本 # 金丝雀发布权重
  1. 按 Header
annotations: nginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-header:"X-Canary"nginx.ingress.kubernetes.io/canary-by-header-value:"true"
// 请求示例curl-H"X-Canary: true"http://golang-per-day.com/version/v2
  1. 按 Cookie
annotations: nginx.ingress.kubernetes.io/canary:"true"nginx.ingress.kubernetes.io/canary-by-cookie:"canary"
// 请求示例curl--cookie"canary=true"http://golang-per-day.com/version/v2
  1. 回滚
kubectldelete-f ingress.canary.yaml

五、蓝绿和金丝雀有什么区别?

蓝绿发布:是“瞬间大切换”:就像换衣服,脱掉旧的直接穿上新的。速度快,但万一新衣服不合身,那一刻所有人都看到了。

金丝雀发布:是“渐进式切换”:就像试菜,先给一两个人尝尝,大家觉得好,再给全餐厅的人上菜。

总结起来,金丝雀发布是用最小的代价,在真实的战场上验证武器。



友情链接:加班费计算器(vx小程序搜索“加班计”)


*源码地址*

留言给


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!

http://www.zskr.cn/news/1376213.html

相关文章:

  • 书匠策AI|论文降重降AIGC,原来可以这么丝滑?官网www.shujiangce.com一键解锁!
  • 融合gws-PINNs与马尔可夫切换模型:反演跳跃系数PDE的混合框架
  • 5分钟实现Rhino到Blender转换:3dm文件导入完整教程
  • 手把手教你处理TT100K数据集:从COCO格式转换到YOLO格式的完整流程(附Python脚本)
  • 直流电机驱动控制电路
  • 3步突破微信网页版访问限制的智能解决方案
  • ncmdump音乐格式转换完整攻略:解锁网易云加密音频的终极方案
  • 机器学习可持续性实践指南:从模型优化到绿色AI的工程落地
  • 实测避坑:在Windows 11 + RTX 4090上,用Python 3.10和CUDA 12.3搞定3D Gaussian Splatting训练
  • 如何在浏览器中免费使用微信网页版:wechat-need-web完整解决方案
  • Rocky Linux 9.2 安装避坑指南:解决UEFI引导、分区加密、安装黑屏等常见问题
  • Color与Linear Color
  • 【Rust 开发者们,工具链管理终于可以这么丝滑了!—— rust-verse(Rust Manager)最新版深度体验分享】
  • 【理论】Harness Engineering:从 Anthropic 的 4 小时 DAW 实验到 AI 原生开发的新范式
  • 最新企业级AI编程工具权威推荐,团队研发效率提升必看
  • MPC5604B/C CAN Sampler 和 FlexCAN 全解
  • 别再只盯着DAVIS数据集了!手把手教你用Python复现Space-Time Memory Networks(附代码)
  • 浔川代码编辑器 v4.1.0 正式版重磅上线!AI 加持,轻量高效,开箱即用
  • 企业微信官方API不够用时,还有别的实现方式吗?
  • 工业异常检测实战:从多模态数据集构建到AI模型评估全解析
  • HMAC-SHA256签名机制实战:构建前后端可信API通信链
  • 共线性下变量重要性评估:LOCO与t统计量的理论桥梁与实践指南
  • 数据驱动负载减载:应对电力系统网络攻击的智能稳定控制
  • 【Verilog代码规范引起的国产安路编译器不能识别寄存器】
  • common lisp 张量,矩阵计算库介绍
  • git--github
  • 从NCM格式束缚到MP3音乐自由:3步解锁你的网易云音乐收藏
  • PHP无参RCE
  • 苏州相城区宠物基地口碑推荐榜单一览 - 品牌排行榜
  • 智慧树自动刷课插件:3步安装指南,彻底解放学习时间