Ingress蓝绿发布
Ingress蓝绿发布
- Ingress常用注解说明
- yaml资源清单
- 绿色版本yml资源清单
- 蓝色版本yaml资源清单
- 主Ingress
- 金丝雀Ingress
- 基于客户端请求头的流量切分
- 结果验证
- 基于客户端来源IP的流量切分
- 结果验证
- 基于服务权重的流量切分
- 结果验证
- 基于IP来源区域来切分IP---方案未验证
- 基于User-Agent的浏览切分
Ingress常用注解说明
参考: https://mp.weixin.qq.com/s?src=11×tamp=1744441177&ver=5925&signature=UhWSx6O1yYqJfZTgogAKh35NhaDZeNgldN–plZ3RcRz-ifGfiOfPNcTOafFw9-dehVqXQkNMOrPPct7S1bX8-llmm1e54TAITu8Sj-XgJYk8Ov*bFGQ9hhN77G8i8Zd&new=1
Nginx Ingress支持通过配置注解(Annotations)来实现不同场景下的发布和测试,可以满足灰度发布、蓝绿发布、A/B测试等业务场景。具体实现过程如下:
为服务创建两个Ingress:
- 一个为
常规Ingress, - 另一个为带
nginx.ingress.kubernetes.io/canary: "true"注解的Ingress,称为Canary Ingress(金丝雀发布); - 为
Canary Ingress(金丝雀发布)配置流量切分策略Annotation,两个Ingress相互配合,即可实现多种场景的发布和测试。
Nginx Ingress的Annotation支持以下几种规则:
Annotation | 作用 |
|---|---|
| nginx.ingress.kubernetes.io/canary-by-header | 适用于灰度发布,基于Header的流量切分,如果请求头中包含指定的header名称,并且值为“always”,就将该请求转发给Canary Ingress定义的对应后端服务。如果值为“never”则不转发,可用于回滚到旧版本。如果为其他值则忽略该annotation,并通过优先级将请求流量分配到其他规则。 |
| nginx.ingress.kubernetes.io/canary-by-header-value | 必须与canary-by-header一起使用,可自定义请求头的取值,包含但不限于“always”或“never”。当请求头的值命中指定的自定义值时,请求将会转发给Canary Ingress定义的对应后端服务,如果是其他值则忽略该annotation,并通过优先级将请求流量分配到其他规则。 |
| nginx.ingress.kubernetes.io/canary-by-header-pattern | 与canary-by-header-value类似,唯一区别是该annotation用正则表达式匹配请求头的值,而不是某一个固定值。如果该annotation与canary-by-header-value同时存在,该annotation将被忽略。 |
| nginx.ingress.kubernetes.io/canary-by-cookie | 基于Cookie的流量切分,适用于灰度发布。与canary-by-header类似,该annotation用于cookie,仅支持“always”和“never”,无法自定义取值。 |
| nginx.ingress.kubernetes.io/canary-weight | 基于服务权重的流量切分,适用于蓝绿部署。表示Canary Ingress所分配流量的百分比,取值范围[0-100]。例如,设置为100,表示所有流量都将转发给Canary Ingress对应的后端服务。 |
以上注解规则会按优先级进行评估,优先级为:
canary-by-header(请求头) -> canary-by-cookie -> canary-weight(服务权重)。
yaml资源清单
蓝色版本和绿色版本的区别
- deployment的name不同
- Labels不同
- 镜像版本tag不同
- svc的name不同

绿色版本yml资源清单
apiVersion: apps/v1 # 指定 Deployment 的 API 版本
kind: Deployment # 声明资源类型为 Deployment
metadata: # 元数据部分name: demo # Deployment 的名称labels: # 标签部分app: demo # 标签键值对,用于标识和选择资源
spec: # Deployment 的规格定义replicas: 1 # 副本数量,指定运行的 Pod 数量selector: # 用于选择匹配的 PodmatchLabels: # 匹配的标签app: demo # 匹配 app=demo 的 Podtemplate: # Pod 模板定义metadata: # Pod 的元数据labels: # Pod 的标签app: demo # 标签键值对,用于选择和标识 Podspec: # Pod 的规格定义containers: # 容器列表- name: demo # 容器名称imagePullPolicy: Always # 镜像拉取策略,始终拉取最新镜像image: registry.cn-shanghai.aliyuncs.com/kubesre01/demo:v1 # 容器镜像地址ports: # 容器端口配置- containerPort: 8080 # 容器监听的端口号
---
apiVersion: v1 # 指定 Service 的 API 版本
kind: Service # 声明资源类型为 Service
metadata: # 元数据部分name: demo-svc # Service 的名称
spec: # Service 的规格定义type: ClusterIP # Service 类型,默认为 ClusterIPselector: # 用于选择关联的 Podapp: demo # 选择标签 app=demo 的 Podports: # Service 的端口配置- port: 8080 # Service 暴露的端口号targetPort: 8080 # 映射到 Pod 的目标端口号
蓝色版本yaml资源清单
apiVersion: apps/v1 # 指定 API 版本为 apps/v1,用于定义 Deployment
kind: Deployment # 声明资源类型为 Deployment
metadata: # 元数据部分name: demo-new # Deployment 的名称labels: # 标签部分app: demo-new # 标签键值对,用于标识该 Deployment
spec: # 规范部分replicas: 1 # 副本数量,指定运行的 Pod 数量selector: # 选择器部分matchLabels: # 匹配的标签app: demo-new # 选择具有 app=demo-new 标签的 Podtemplate: # Pod 模板metadata: # Pod 的元数据labels: # 标签部分app: demo-new # Pod 的标签,用于与选择器匹配spec: # Pod 的规范部分containers: # 容器列表- name: demo-new # 容器名称imagePullPolicy: Always # 镜像拉取策略,始终拉取最新镜像image: registry.cn-shanghai.aliyuncs.com/kubesre01/demo:v2 # 容器使用的镜像ports: # 容器端口配置- containerPort: 8080 # 容器监听的端口号
---
apiVersion: v1 # 指定 API 版本为 v1,用于定义 Service
kind: Service # 声明资源类型为 Service
metadata: # 元数据部分name: demo-new-svc # Service 的名称
spec: # 规范部分type: ClusterIP # Service 类型为 ClusterIP,默认类型selector: # 选择器部分app: demo-new # 选择具有 app=demo-new 标签的 Podports: # 端口配置- port: 8080 # Service 暴露的端口号targetPort: 8080 # 映射到 Pod 的目标端口号
主Ingress
默认将流量路由到主服务。
apiVersion: networking.k8s.io/v1 # 定义 Ingress 的 API 版本
kind: Ingress # 声明资源类型为 Ingress
metadata: # 元数据部分name: demo # Ingress 的名称为 demo
spec: # 规范部分rules: # 定义 Ingress 的规则- host: demo.intel.dev # 指定主机名为 demo.intel.devhttp: # 定义 HTTP 路由规则paths: # 定义路径规则- path: /info # 指定路径为 /infopathType: Prefix # 路径匹配类型为 Prefix(前缀匹配)backend: # 定义后端服务service: # 指定服务信息name: demo-svc # 服务名称为 demo-svcport: # 服务端口信息number: 8080 # 服务端口号为 8080ingressClassName: nginx # 指定 Ingress 的类名为 nginx
金丝雀Ingress
基于客户端请求头的流量切分
- 在注解中开启金丝雀发布功能
- 为ingress添加
请求头 - 设置
请求头为指定值时负载到绿色版本的svc
apiVersion: networking.k8s.io/v1 # 使用 Kubernetes 的 Ingress API 版本 v1
kind: Ingress # 定义资源类型为 Ingress
metadata:name: demo-new-canary # 定义 Ingress 的名称为 demo-new-canaryannotations: # 定义 Ingress 的注解,用于配置额外的功能# 启用金丝雀发布功能nginx.ingress.kubernetes.io/canary: "true"# 指定请求头名称为 "X-Beta-User"nginx.ingress.kubernetes.io/canary-by-header: "X-Beta-User"# 当请求头 "X-Beta-User" 的值为 "green" 时,将流量路由到金丝雀版本# 这里的 "X-Beta-User" 是一个示例值,可以根据实际需求进行修改# 例如,可以使用 "X-Beta-User" 来标识特定的用户或请求来源nginx.ingress.kubernetes.io/canary-by-header-value: "green"
spec:rules: # 定义 Ingress 的路由规则- host: demo.intel.dev # 指定主机名为 demo.intel.dev,匹配该域名的请求http: # 定义 HTTP 路由规则paths: # 定义路径规则- path: /info # 匹配路径为 /info 的请求pathType: Prefix # 路径匹配类型为 Prefix,表示以 /info 为前缀的路径都会匹配backend: # 定义后端服务service: # 指定后端服务的配置name: demo-new-svc # 后端服务的名称为 demo-new-svcport: # 定义后端服务的端口number: 8080 # 后端服务的端口号为 8080ingressClassName: nginx # 指定使用 nginx 作为 Ingress 控制器
结果验证
# 使用 curl 命令向目标 URL 发送 HTTP 请求
## -H 参数用于设置请求头
### "X-Beta-User: green" 是一个自定义请求头,用于标识内测用户
curl -H "X-Beta-User: green" http://demo.intel.dev/info# 没有请求头则访问到老的版本
curl http://demo.intel.dev/info
基于客户端来源IP的流量切分
apiVersion: networking.k8s.io/v1 # 定义 Ingress 资源的 API 版本
kind: Ingress # 声明资源类型为 Ingress
metadata:name: demo-new-canary # 定义 Ingress 的名称annotations: # 为 Ingress 添加注解# # 启用金丝雀发布功能nginx.ingress.kubernetes.io/canary: "true"# 根据请求头 X-Forwarded-For 进行金丝雀流量分配nginx.ingress.kubernetes.io/canary-by-header: "X-Forwarded-For" # 当请求头的值为指定 IP 时,将流量分发到 金丝雀版本 # 假定这个IP是测试部门的IPnginx.ingress.kubernetes.io/canary-by-header-value: "123.253.189.223"
spec:rules: # 定义 Ingress 的路由规则- host: demo.intel.dev # 指定主机名http:paths: # 定义路径规则- path: /info # 指定路径为 /infopathType: Prefix # 路径匹配类型为前缀匹配backend: # 定义后端服务service:name: demo-new-svc # 后端服务的名称port:number: 8080 # 后端服务的端口号ingressClassName: nginx # 指定使用的 IngressClass 为 nginx
结果验证
#### "X-Forwarded-For:123.253.189.223" 模拟客户端 IP 地址
curl -H "X-Forwarded-For:123.253.189.223" http://demo.intel.dev/info
基于服务权重的流量切分
apiVersion: networking.k8s.io/v1 # 指定 Ingress 的 API 版本
kind: Ingress # 定义资源类型为 Ingress
metadata:name: demo-new-canary # 定义 Ingress 的名称annotations: # 定义 Ingress 的注解# 启用金丝雀发布功能nginx.ingress.kubernetes.io/canary: "true"# 根据请求头 X-Forwarded-For 进行金丝雀流量分配nginx.ingress.kubernetes.io/canary-by-header: "X-Forwarded-For"# 将 20% 的流量分配给金丝雀版本nginx.ingress.kubernetes.io/canary-weight: "20"spec:rules: # 定义 Ingress 的规则- host: demo.intel.dev # 定义主机名http:paths: # 定义 HTTP 路径规则- path: /info # 定义路径为 /infopathType: Prefix # 路径匹配类型为前缀匹配backend: # 定义后端服务service:name: demo-new-svc # 后端服务的名称port:number: 8080 # 后端服务的端口号ingressClassName: nginx # 指定使用的 IngressClass 为 nginx
结果验证
# 使用 for 循环发送 100 次 HTTP 请求到指定的 URL
for i in {1..100}; do# curl 命令用于发送 HTTP 请求# http://demo.intel.dev/info 是目标 URL,表示访问 demo.intel.dev 的 /info 路径curl http://demo.intel.dev/info;
done;
# 查看结果是否符合20%服务权重的设置。
# 提前设置好新版本的回显标记
基于IP来源区域来切分IP—方案未验证
- 修改
Nginx Ingress Controller的ConfigMap,添加geo模块以匹配特定 IP 地址段。
示例ConfigMap配置:
apiVersion: v1 # API版本,v1表示核心组的资源
kind: ConfigMap # 资源类型,这里是ConfigMap
metadata: # 元数据部分name: nginx-ingress-controller # ConfigMap的名称namespace: ingress-nginx # ConfigMap所在的命名空间
data: # 数据部分geoip: | # geoip配置数据,使用多行字符串格式geo $region { # 定义一个geo变量,用于根据IP地址分配区域default unknown; # 默认值为unknown123.253.189.0/24 region-a; # 指定IP地址范围对应的区域为region-a}
- 使用
nginx.ingress.kubernetes.io/configuration-snippet注解,根据$region变量进行流量分发。
apiVersion: networking.k8s.io/v1 # 定义 Kubernetes Ingress 的 API 版本
kind: Ingress # 资源类型为 Ingress
metadata: # 元数据部分name: demo-new-canary # Ingress 的名称为 demo-new-canaryannotations: # 注解部分# 启用金丝雀发布功能nginx.ingress.kubernetes.io/canary: "true"# 如果请求的 region 是 "region-a",设置服务名称为 "demo-new-svc"# $region 是一个 NGINX 变量,通常由外部输入(如请求头、客户端 IP 地址等)或上游配置(如 Nginx 的 geo 模块)定义。# $service_name 是一个自定义变量,可以被后续的 NGINX 配置引用,用于动态选择后端服务。nginx.ingress.kubernetes.io/configuration-snippet: | # 自定义 NGINX 配置片段if ($region = "region-a") { set $service_name "demo-new-svc"; # }
spec: # 规范部分rules: # 定义 Ingress 的规则- host: demo.intel.dev # 规则适用于主机名 demo.intel.devhttp: # HTTP 路由规则paths: # 定义路径规则- path: /info # 匹配路径为 /infopathType: Prefix # 路径类型为前缀匹配backend: # 后端服务配置service: # 指定服务name: demo-new-svc # 服务名称为 demo-new-svcport: # 服务端口配置number: 8080 # 服务端口号为 8080ingressClassName: nginx # 使用的 Ingress 类为 nginx
基于User-Agent的浏览切分
- 未完待续
相关文章:
Ingress蓝绿发布
Ingress蓝绿发布 Ingress常用注解说明yaml资源清单绿色版本yml资源清单蓝色版本yaml资源清单 主Ingress金丝雀Ingress基于客户端请求头的流量切分结果验证 基于客户端来源IP的流量切分结果验证 基于服务权重的流量切分结果验证 基于IP来源区域来切分IP---方案未验证基于User-Ag…...
基于AOP+Log4Net+AutoFac日志框架
1.项目概述 这是一个基于 C# 的 WPF 项目 WpfApp12log4net,它综合运用了依赖注入、日志记录和接口实现等多种技术,同时使用了 Autofac、Castle.Core 和 log4net 等第三方库。 2.配置log4net 新建一个Log4Net.config,配置需要记录的日志信息…...
python推箱子游戏
,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…...
华为hcie证书的有效期怎么判断?
在ICT行业,华为HCIE证书堪称含金量极高的“敲门砖”,拥有它往往意味着在职场上更上一层楼。然而,很多人在辛苦考取HCIE证书后,却对其有效期相关事宜一知半解。今天,咱们就来好好唠唠华为HCIE证书的有效期怎么判断这个关…...
关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结
以下是关于 Spring Boot 部署到 Docker 容器的详细说明,涵盖核心概念、配置步骤及关键命令,并附上表格总结: 1. Docker 核心概念 概念描述关系镜像(Image)预定义的只读模板,包含运行环境和配置(…...
PowerBI 条形图显示数值和百分比
数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品,会被筛选,所以用ALLSELECTED来获取当前筛选条件下,Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…...
基于YOLOv8的火车轨道检测识别系统:技术实现与应用前景
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 引言:火车轨道检测领域概述 铁路运输作为国民经济的大动脉,其安全运行至关重要…...
css使用mix-blend-mode的值difference实现内容和父节点反色
1. 使用场景 往往开发过程中,经常遇到产品说你这个背景图和文字颜色太接近了,能不能适配下背景图,让用户能够看清具体内容是啥。 这么说吧,这种需求场景非常合理,因为你做开发就是要给用户一个交代,给他们…...
【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘
对象的创建 1.类加载检查 虚拟机遇到一条new的指令,首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行类的加载过程。 2.分配内存 在类…...
Pytest多环境切换实战:测试框架配置的最佳实践!
你是否也遇到过这种情况:本地测试通过,一到测试环境就翻车?环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹,随时引爆你的测试流程! 测试人员每天都跟不同的环境打交道࿰…...
单细胞多组学及空间组学数据分析与应用
一、引言 生命科学研究正处于快速发展的阶段,随着技术的不断革新,对生物系统的理解也在逐步深入到单细胞和空间层面。单细胞多组学及空间组学技术应运而生,它们突破了传统研究手段在细胞异质性和空间结构解析上的局限,为我们打开…...
[ctfshow web入门] web39
信息收集 题目发生了微妙的变化,只过滤flag,include后固定跟上了.php。且没有了echo $flag;,虽说本来就没什么用 if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){include($c.".php");} }else{…...
HarmonyOS-ArkUI 装饰器V2 @ObservedV2与@Trace装饰器
参考文档: 文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-new-observedv2-and-trace-V14#trace%E8%A3%85%E9%A5%B0%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84由于V2的装饰器比V1的装饰器更加易用,尽管学习的过程中用到的都是V1的装饰器,但…...
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系 在Spring框架的演进长河中,配置方式始终是开发者需要掌握的核心技能。从早期XML一统天下的严谨规范,到注解驱动的敏捷开发,再到如今Java Config的优雅实践&am…...
基于ImGui+FFmpeg实现播放器
基于ImGuiFFmpeg实现播放器 演示: ImGui播放器 继续研究FFmpeg,之前做了一个SDL的播放器,发现SDL的可视化UI界面的功能稍微差了点,所以今天我们换了一个新的工具,也就是ImGui。 ImGui官方文档:https://g…...
python的web框架flask(hello,world版)
问题 最近需要基于一个开源项目进行二次开发,但是,现在的我主修java,从来没有接触过python的web开发。所以,我现在需要学习一下flask的hello,world。 python版本选择 通过这个Python版本状态页面Status of Python v…...
Java面试39-Zookeeper中的Watch机制的原理
Zookeeper是一个分布式协调组件,为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构,以节点的方式来管理存储在Zookeeper上的数据。 Zookeeper提供了一个Watch机制,可以让客户端感知到Zooke…...
同时打开多个Microchip MPLAB X IDE
0.引用 Microchip 32位MCU CAN驱动图文教程-附源码 - 哔哩哔哩 https://bbs.21ic.com/icview-3391426-1-1.html https://bbs.21ic.com/icview-3393632-1-1.html 1.前言 工作中接触到使用Microchip 的 MPLAB X IDE 开发工具,使用的MCU是Microchip SAMD21J18A MCU…...
达梦数据库使用druid提示:dbType not support : dm
简单处理: 移除wall即可 (但是用druid那都希望能用上它的功能的,不然为什么不用其他没带检查的jdbc呢。) 中等复杂处理: druid 是阿里开源的项目,所以去github上找对应版本的源码下载:https:/…...
[定位器]晶艺LA1823,4.5V~100V, 3.5A,替换MP9487,MP9486A,启烨科技
Features 4.5V to 100V Wide Input Range 3.5A Typical Peak Current Limit Integrated 500mΩ low resistance high side power MOS. Constant On Time Control with Constant Switching Frequency. 180μA Low Quiescent Current 150kHz/240kHz/420kHz Swi…...
难度偏低,25西电人工智能学院821、833、834考研录取情况
1、人工智能学院各个方向 2、人工智能学院近三年复试分数线对比 学长、学姐分析 由表可看出: 1、智能院25年院线相对于24年院线 全部专业下降比较多,其中控制科学与工程下降20分,计算机科学与技术下降20分,计算机技术[专硕]下降…...
使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第七讲)
这一期来讲解与文本框配套使用的键盘,以及键盘如何在项目中开启。 打开GUI_guider软件平台,在左上角点开工程选项,在该栏目的最下方点击系统设置。 随后在系统设置界面中点击项目选项,选择显示键盘。 在该界面中可以设置键盘文字…...
【C#知识点详解】List<T>储存结构详解
今天来介绍一下List内部的存储结构,话不多说直接开始。 内部数据 List内部采用了连续数组的方式存储数据,其中包含了三个重要的成员变量,示例如下: // 用于存储数据的数组 internal T[] _items; // 列表中实际包含数据的数量 int…...
设计模式:代理模式 - 控制访问与增强功能的艺术
一、为什么使用代理模式? 在开发中,你是否遇到过以下问题: • 某些功能调用需要权限校验,但不希望修改核心逻辑? • 某些对象的创建开销过高,希望延迟加载以优化性能? • 在不改变原始类的情…...
C++二分查找
一、模板①:向下取整(mid (l r) >> 1) while (l < r) {int mid l r >> 1; // 等价于 (l r) / 2(向下取整)if (check(mid)) r mid; // 保留左半区else l mid 1; // 舍弃左半区 } 适用场…...
一个Linux/Java乱码问题的解决
公司有个项目采用的是spring-boot启动方式,以前上线正常,前几天重新上线后,突然发现上传的文件名中文乱码了。我了解了一下具体情况,以前是正常的,而且测试环境也都是正常的,就是生产环境本次上线后突发从页…...
【Java设计模式】第11章 装饰者模式讲解
11.1 装饰者模式讲解 定义:动态扩展对象功能,替代继承。类型:结构型模式适用场景: 运行时动态添加功能避免类爆炸(如多层装饰)优点: 比继承更灵活符合开闭原则缺点: 增加类/对象数量调试复杂度高11.2 装饰者模式 Coding // 抽象组件 public abstract class BatterCake…...
通过AWS EKS 生成并部署容器化应用
今天给大家分享一个实战例子,如何在EKS上创建容器化应用并通过ALB来发布。先介绍一下几个基本概念: IAM, OpenID Connect (OIDC) 2014 年,AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的联合身份支持。此功能允许…...
nginx入门,部署静态资源,反向代理,负载均衡使用
Nginx在linux上部署静态资源 概念介绍 Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在,并且能够直接展示的一些文件,比如常见的html页面、css文件、js文件、图片、视频等资源。 相对于Tomcat,Nginx处理…...
智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案
智膳优选 | AI赋能的智慧食堂管理专家 基于飞书多维表格和扣子(Coze)的智能解决方案 数据驱动餐饮管理,让每一餐都是营养与经济的完美平衡! “智膳优选”通过整合飞书与Coze,将数据智能引入校园餐饮管理࿰…...
