如何在 Kubernetes 中借助Ingress 实现灰度发布和蓝绿发布

前言

部署在 Kubernetes 集群中的应用,在升级发布时可能会存在的问题:

1,由于 Kuberneter 底层 Pod 容器生命周期与网络组件生命周期是异步管理的,在升级时如果没有处理好应用优雅退出的问题,就很容易导致 http 访问请求 5xx

2,原生 Deployment 应用的滚动发布功能是一把梭的全量发布模式,没有灰度和分批控制发布的概念,一旦出现问题,故障影响范围就会迅速扩大

这也是为什么需要灰度发布,蓝绿发布,彩虹发布,金丝雀发布、A/B Test等多样化形式发布的重要原因,核心目标只有一个,就是为了确保服务的稳定性,减少或避免因变更带来的不稳定因素

今天我们主要来聊下,如何在不引入第三方插件的情况下,来实现简单的灰度发布和蓝绿发布功能

通过 Ingress 实现灰度发布和蓝绿发布

在 Kubernetes 里面 Pod 的网络通信都是借助 Service 实现的,Service 的底层是依赖 Iptables 或者 eBPF 加上 dns 技术实现的,具体细节感兴趣可自行探索,Ingress 负责 k8s 集群内外的流量通信,本身属于七层负载的工作范围,所以可以将流量反向代理到四层负载的 Service 中,在七层负载中支持 Http 协议,所以可以实现的功能更加强大

工作原理

Kubernetes 自带的 Ingress Controller 组件的底层是 Nginx ,所以基于七层负载的能力,我们就可以做更多与流量分配相关的功能,目前基于 Nginx 的 Ingress 支持通过 Header,Cookie 和 Weight 三种流量切分的策略,这三种策略,又可以实现以下两种发布场景:

按请求级别的灰度用户流量

通过 header 和 cookie 路由流量进行灰度

按比例级别的灰度用户流量

通过 weight 权重设置

支持的Nginx Annotation介绍
  1. nginx.ingress.kubernetes.io/canary-by-header

基于Header的流量切分。如果请求头中包含指定的 header,并且值为“always”,就将该请求转发给Canary Ingress定义的对应后端服务。如果值为“never”则不转发,可用于回滚到旧版本。如果为其他值则忽略该annotation,并通过优先级将请求流量分配到其他规则。

  1. nginx.ingress.kubernetes.io/canary-by-header-value

必须与canary-by-header一起使用,可自定义请求头的取值,包含但不限于“always”或“never”。当请求头的值命中指定的自定义值时,请求将会转发给Canary Ingress定义的对应后端服务,如果是其他值则忽略该annotation,并通过优先级将请求流量分配到其他规则。

  1. nginx.ingress.kubernetes.io/canary-by-header-pattern

与canary-by-header-value类似,唯一区别是该annotation用正则表达式匹配请求头的值,而不是某一个固定值。如果该annotation与canary-by-header-value同时存在,该annotation将被忽略。

  1. nginx.ingress.kubernetes.io/canary-by-cookie

基于Cookie的流量切分。与canary-by-header类似,该annotation用于cookie,仅支持“always”和“never”,无法自定义取值。

  1. nginx.ingress.kubernetes.io/canary-weight

基于服务权重的流量切分,适用于蓝绿部署。表示Canary Ingress所分配流量的百分比,取值范围[0-100]。例如,设置为100,表示所有流量都将转发给Canary Ingress对应的后端服务。

注解规则会按优先级进行评估,优先级为:canary-by-header -> canary-by-cookie -> canary-weight。

灰度发布

依赖资源:2 个 Ingress 对象,2 个 Service 对象,两个 Deployment 对象

操作流程:为服务创建两个 Ingress,一个为常规 Ingress,另一个为带有 nginx.ingress.kubernetes.io/canary: "true"注解的 Ingress,称为 Canary Ingress,在 Canary Ingress 上配置切分策略。

两个 Deployment 对象,分别对应升级过程中的两个版本 v1,v2

apiVersion: apps/v1
kind: Deployment
metadata:name: py-hello-blue
spec:selector:matchLabels:app: hellocolor: bluereplicas: 1template:metadata:labels:app: hellocolor: bluespec:terminationGracePeriodSeconds: 30containers:- name: helloimagePullPolicy: Alwaysimage: localhost:5001/py-http:1ports:- containerPort: 8888resources:requests:memory: "50Mi"limits:memory: "200Mi"lifecycle:preStop:exec:                                                                      command: ["sleep", "5"]# command: ["/usr/bin/tini", "--", "bash", "-c"]command: ["sh", "-c"]args:- |python app.py
apiVersion: apps/v1
kind: Deployment
metadata:name: py-hello-green
spec:selector:matchLabels:app: hellocolor: greenreplicas: 1template:metadata:labels:app: hellocolor: greenspec:terminationGracePeriodSeconds: 30containers:- name: helloimagePullPolicy: Alwaysimage: localhost:5001/py-http:2ports:- containerPort: 8888resources:requests:memory: "50Mi"limits:memory: "200Mi"lifecycle:preStop:exec:                                                                      command: ["sleep", "5"]# command: ["/usr/bin/tini", "--", "bash", "-c"]command: ["sh", "-c"]args:- |python app.py

两个 Service 对象,分别对应 v1,v2 的Deployment

apiVersion: v1
metadata:name: py-hello-blue-service
kind: Service
spec:selector:app: hello#color: greencolor: blueports:- name: webport: 8888protocol: TCPtargetPort: 8888type: ClusterIP
apiVersion: v1
metadata:name: py-hello-green-service
kind: Service
spec:selector:# app: hellocolor: green# color: blueports:- name: webport: 8888protocol: TCPtargetPort: 8888type: ClusterIP

两个 Ingress 对象,进行灰度流量的分配

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:name: py-hello-ingress-normal
spec:rules:- host: py-hello.test.comhttp:paths:- path: /pathType: Prefixbackend:service: port: number: 8888name: py-hello-blue-service
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:name: py-hello-ingress-canaryannotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/canary: "true"                # 启用Canary#基于 Header 的灰度#nginx.ingress.kubernetes.io/canary-by-header: "Region"#nginx.ingress.kubernetes.io/canary-by-header-pattern: "hz|lg"    #基于 Cookie 的灰度#nginx.ingress.kubernetes.io/canary-by-cookie: "qdl"    # Cookie中包含user_from_bj的请求转发到Canary Ingress#基于 weight 的灰度    nginx.ingress.kubernetes.io/canary-weight: "20"    # 将20%的流量转发到Canary Ingressspec:rules:- host: py-hello.test.comhttp:paths:- path: /pathType: Prefixbackend:service: port: number: 8888name: py-hello-green-service

实现灰度发布,就是把 canary 里面的流量分配策略进行修改即可

蓝绿发布

实现蓝绿发布,就是在灰度发布的基础上把 canary 里面的weight流量分配权重改为 100 即可。

注意:

  • 相同服务的Canary Ingress仅能够定义一个,从而使后端服务最多支持两个版本。
  • 即使流量完全切到了Canary Ingress上,旧版服务仍需存在,否则会出现报错。

总结

通过 ingress 进行灰度发布和蓝绿发布可以实现更加复杂的流量分配策略,但对应的操作也变得复杂了,对于大部分复杂的发布业务也足够用了,这种方案也可以结合发布平台稍做封装,比如一键创建新克隆版本,切换流量配比,设置流量策略等,有了这些基础功能后,再配合发布平台就可以流畅的操作了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装

FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装 0. 界面预览1. Docker安装1.1 下载docker镜像1.2 启动docker镜像1.3 登录 2. 脚本安装2.1 下载2.2 安装2.3 登录2.4 卸载程序 3. 镜像安装3.1 下载镜像3.2 安装镜像3.3 登录 0. 界面预览 http://myfs.f3322.net…

building and deploying a single-Master RocketMQ cluster

building and deploying a single-Master RocketMQ cluster 1 、下载RocketMQ安装包(这里是通过源码安装)2、安装3、启动nameserver4、启动borkerStart the broker serviceVerify that the broker service is started successfully, for example, the brokers ip is 192.168.1.…

Python爬虫逆向实战案例(五)——YRX竞赛题第五题

题目:抓取全部5页直播间热度,计算前5名直播间热度的加和 地址:https://match.yuanrenxue.cn/match/5 cookie中m值分析 首先打开开发者工具进行抓包分析,从抓到的包来看,参数传递了查询参数m与f,同时页面中…

手机自动无人直播,实景无人直播真的有用吗?

继数字人直播之后,手机自动直播开始火热了起来,因为其门槛低,成本低,一部手机一个账号就可以实现直播,一时深受广大商家的好评。那么,手机自动无人直播究竟是如何实现自动直播的呢? 在传统的直…

什么是数据中心IP,优缺点是什么?

如果根据拥有者或者说发送地址来分类的话,可以将代理分为三类:数据中心ip,住宅ip,移动ip 本文我们来了解数据中心ip的原理以及他们的优势劣势,才能选择适合自己的代理。 一、什么是数据中心ip代理? 数据中心ip是由数据中心拥有…

浏览器输入一个URL之后发生了什么?

URL解析DNS解析TCP连接TSL连接HTTP请求TCP挥手接收并解析响应 URL 解析 主要分为: 协议,eg http,https域名或者ip地址,eg www.baidu.com 域名相对于ip地址来说,更方便人们记忆,但是实际的网络传输中使用的是ip地址 端…

widnows 制作winpe启动盘

下载 官网 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 点击装机版,进行下载,等待下载完成 安装 解压 双击exe运行 插入u盘 识别到的u盘 点击【一键制作成usb启动盘】 点击确定,等待制作完成 重启电脑,选择从…

机器学习深度学习——NLP实战(自然语言推断——微调BERT实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——针对序列级和词元级应用微调BERT 📚订阅专栏:机器学习&&深度学习 希望文…

Module not found: Error: Can‘t resolve ‘vue-pdf‘ in ‘xxx‘

使用命令npm run serve时vue项目报错: Module not found: Error: Cant resolve vue-pdf in xxx 解决方案: 运行命令: npm install vue-pdf --save --legacy-peer-deps 即可解决。 再次顺利执行npm run serve

Linux系统USB摄像头测试程序(四)_视频旋转及缩放

下面的程序实现了视频的旋转及缩放,窗口中点击鼠标左键视频向左旋转,点击鼠标右键视频向右旋转并且视频缩小了二分之一。程序中首先把yvyv422转换成了RGB24,然后利用opencv进行了旋转和缩放,其后用sdl2进行了渲染。使用了ffmpeg、…

问道管理:市盈率市净率两个指标含义怎么算?

市盈率和市净率是出资领域常用的两个目标,用于评价公司的估值和出资的报答状况。本文将从多个视点剖析这两个目标的含义和计算方法,帮助读者更好地了解和运用它们。首先,市盈率(P/E ratio)是用来衡量公司股票价格与每股…

程序运行的马甲:进程(1/7)

一个可执行文件被加载到内存中运行时,它在内存空间的分布如图所示: 在内存中有专门的堆栈空间,函数的局部变量是保存在栈中的,使用 malloc 申请的动态内存是在堆空间中分配的,它们是程序运行时比较特殊的两块内存区域&…

13.4 目标检测锚框标注 非极大值抑制

锚框的形状计算公式 假设原图的高为H,宽为W 锚框形状详细公式推导 以每个像素为中心生成不同形状的锚框 # s是缩放比,ratio是宽高比 def multibox_prior(data, sizes, ratios):"""生成以每个像素为中心具有不同形状的锚框"""in_he…

后端Windows软件环境安装配置大全[JDK、Redis、RedisDesktopManager、Mysql、navicat、VMWare、finalshell、MongoDB...持续更新中]

文章目录 前言1. 安装 JDK2. 安装 Redis3. 安装 RedisDesktopManager(Redis可视化工具)4. 安装 Mysql5. 安装 navicat (Mysql可视化工具)6. 安装 VMWare7. 安装 finalshell (VMWare可视化工具)8. 安装 MongodDB9. 安装 maven 总结 前言 为了巩固所学的知…

Web安全测试(三):SQL注入漏洞

一、前言 结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部…

WSL2 window上高效运行Linux

1 WSL及优势 1.1 WSL简介 WSL(Windows Subsystem for Linux)是Windows操作系统中的一个功能,它允许用户在Windows环境下运行Linux应用程序。WSL提供了一个与Linux内核兼容的系统调用转发层,使得Linux二进制文件可以在Windows上直…

基于风险的漏洞管理

基于风险的漏洞管理涉及对即将被利用的漏洞的分类响应,如果被利用,可能会导致严重后果。本文详细介绍了确定漏洞优先级时要考虑的关键风险因素,以及确保基于风险的漏洞管理成功的其他注意事项。 什么是基于风险的漏洞管理对基于风险的漏洞管…

vue中html引入使用<%= BASE_URL %>变量

首先使用src相对路径引入 注意: js 文件放在public文件下 不要放在assets静态资源文件下 否则 可能会报错 GET http://192.168.0.113:8080/src/assets/js/websockets.js net::ERR_ABORTED 500 (Internal Server Error) 正确使用如下:eg // html中引…

(线特征)opencv+opencv contribute 配置

写一篇博客,记录开始线特征slam的历程。 在配置环境的时候,可以发现大多数都是用到了opencv3.4.16和其contribute版本,这里进行一个相关操作的教学。配置环境是在Ubuntu下面进行的,建议使用Ubuntu18来进行线特征的配置以及代码的…

国产AI芯片突破,芯片或成白菜价,恐惧的美芯阻止台积电为它代工

日前消息指台积电大幅减少一家中国AI芯片企业的产能,原因在于国产AI芯片的性能已接近美芯,美国芯片企业NVIDIA与相关的资本机构贝莱德联手施压台积电所致,凸显出美国芯片忧虑中国AI芯片的竞争力。 这家国产AI芯片企业为壁仞科技,据…