技术标签: kubernetes 运维 openstack 大数据 docker
Ingress-Nginx是一个K8S ingress工具,支持配置Ingress Annotations来实现不同场景下的灰度发布和测试。 Nginx Annotations 支持以下几种Canary规则:
假设我们现在部署了两个版本的服务,老版本和canary版本
nginx.ingress.kubernetes.io/canary-by-header
:基于Request Header的流量切分,适用于灰度发布以及 A/B 测试。当Request Header 设置为 always
时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never
时,请求不会被发送到 Canary 入口。
nginx.ingress.kubernetes.io/canary-by-header-value
:要匹配的 Request Header 的值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 Request Header 设置为此值时,它将被路由到 Canary 入口。该
nginx.ingress.kubernetes.io/canary-weight
:基于服务权重的流量切分,适用于蓝绿部署,权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求。权重为60意味着60%流量转到canary。权重为 100 意味着所有请求都将被发送到 Canary 入口。
nginx.ingress.kubernetes.io/canary-by-cookie
:基于 Cookie 的流量切分,适用于灰度发布与 A/B 测试。用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的cookie。当 cookie 值设置为 always
时,它将被路由到 Canary 入口;当 cookie 值设置为 never
时,请求不会被发送到 Canary 入口。
这里我们服务的 deployment 就不展示了,service 配置如下
# 测试版本
apiVersion: v1
kind: Service
metadata:
name: hello-service
labels:
app: hello-service
spec:
ports:
- port: 80
protocol: TCP
selector:
app: hello-service
# canary 版本
apiVersion: v1
kind: Service
metadata:
name: canary-hello-service
labels:
app: canary-hello-service
spec:
ports:
- port: 80
protocol: TCP
selector:
app: canary-hello-service
ingress 配置如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: canary
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
rules:
- host: canary-service.abc.com
http:
paths:
- backend:
serviceName: canary-hello-service
servicePort: 80
测试结果如下:
$ for i in $(seq 1 10); do curl http://canary-service.abc.com; echo '\n'; done
hello world-version1
hello world-version1
hello world-version2
hello world-version2
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
annotation
配置如下(ingress 其余部分省略)
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
测试结果如下:
$ for i in $(seq 1 5); do curl http://canary-service.abc.com; echo '\n'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '\n'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
annotation 配置如下:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
测试结果如下:
$ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '\n'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -H 'test:abc' http://canary-service.abc.com; echo '\n'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
使用cookie来进行流量管理的场景比较适合用于A/B test,比如用户的请求 cookie 中含有特殊的标签,那么我们可以把这部分用户的请求转发到特定的服务进行处理。
annotation 配置如下:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-cookie: "like_music"
测试结果如下:
$ for i in $(seq 1 5); do curl -b 'like_music=1' http://canary-service.abc.com; echo '\n'; done
hello world-version1
hello world-version1
hello world-version1
hello world-version1
hello world-version1
$ for i in $(seq 1 5); do curl -b 'like_music=always' http://canary-service.abc.com; echo '\n'; done
hello world-version2
hello world-version2
hello world-version2
hello world-version2
hello world-version2
三种annotation
按如下顺序匹配canary-by-header > canary-by-cookie > canary-weight
我们从以上的测试结果来看,可以把流量的转发分成以下两类:
1.根据权重
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
70%
|------> 生产版本
users --- 100% ---> Nginx Ingress ----| 30%
|------> canary 版本
2.根据用户
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "test"
nginx.ingress.kubernetes.io/canary-by-header-value: "abc"
others
|-----------> 生产版本
users ------> Nginx Ingress ------| "test:abc"
|-----------> canary 版本
往期精彩文章
kubernetes全栈技术+企业案例演示【带你快速掌握和使用k8s】
Prometheus+Grafana+Alertmanager搭建全方位的监控告警系统-超详细文档
k8s1.18多master节点高可用集群安装-超详细中文官方文档
jenkins+kubernetes+harbor+gitlab构建企业级devops平台
通过kubeconfig登陆k8s的dashboard ui界面
prometheus operator监控k8s集群之外的haproxy组件
学无止境,了解更多关于kubernetes/docker/devops/openstack/openshift/linux/IaaS/PaaS相关内容,想要获取更多资料和免费视频,可按如下方式进入技术交流群
扫码加群????
微信:luckylucky421302
长按指纹关注公众号????
点击在看少个 bug????
文章浏览阅读5.1k次。奶糖猫来啦!即使大家没用过PanDownload也应该听说过吧,这款软件的开发者前一段时间被抓闹得沸沸扬扬,很多人都吐槽百度无下限。PanDownload作为一款免费的下载工具的确造福了..._卢本伟pandownload
文章浏览阅读284次。本文介绍了如何部署华为云云耀服务器L实例,包括购买、初始化配置和远程登录。接着介绍了安装配置环境,包括基本工具、MariaDB、Nginx和PHP。之后讲解了下载并解压到www目录、生成SSL证书、在Nginx配置、初始化、添加信任域名和开启内存缓存等步骤。最后介绍了NextCloud后台配置,包括个人设置和管理,可以对NextCloud服务进行各种设置,包括安全性、文件同步、应用程序等。同时可以进行用户和群组管理,对NextCloud的界面、备份、日志等进行个性化定制。_云耀云服务器nextcloud搭建云盘系统
文章浏览阅读159次。我不能保证写的每个地方都是对的,但是至少能保证不复制、不黏贴,保证每一句话、每一行代码都经过了认真的推敲、仔细的斟酌。每一篇文章的背后,希望都能看到自己对于技术、对于生活的态度。我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。真实地去生活..._特别喜欢的几句话共勉
文章浏览阅读482次。2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。* 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;打开项目修改变成蓝色的配置文件中的datasource(配自己的数据库)运行admin即可。//写自己的定时任务。_xxl-job spring 事务
文章浏览阅读596次。51单片机矩阵密码锁,直接复制就可以了;实现了获取行和列这里是获取行和列。_51单片机密码锁代码
文章浏览阅读165次。有个同学,小青,跟她小学初中都一个班。在校时,咱比较内向害羞,少跟女同学聊天,初中毕业后,我去了市里上高中,后面再到北方上大学,毕业了也是在外地工作,貌似她初中毕业后就没再上学。那会儿也没有什么手机QQ微信,自然更少联系,有20年了吧,偶尔过年有个同学聚会什么的,见过几次。大家陆续成家,过着各自的小日子,在同学的微信群,她跟我都还是像学生时代那样,不是很喜欢露面,多是潜水。后面听另外一个同学说她在市区卖房,新房二手房都卖,正好那阵子小姨子打算回老家买房安家,不想再在深圳漂了,毕竟没户口,房价太高,._贫穷扭曲人性
文章浏览阅读4.7k次。大概新手人都曾纠结过LinuxMint下的输入法配置问题。其实这个问题也挺容易的。下面我就以安装ppa源中的sogou输入法为例来为大家讲解:安装搜狗输入法大概用如下命令就能解决了:sudo add-apt-repository ppa:fcitx-team/nightlysudo aptitude updatesudo aptitude install fcitx f_linuxmint21 fcitx4
文章浏览阅读1.5k次。http://www.yesky.com/50/1894050_3.shtml串行通讯慨述 串行通讯协议有很多种,像RS232,RS485,RS422,甚至现今流行的USB等都是串行通讯协议。而串行通讯技术的应用无处不在。可能大家见的最多就是电脑的串口与Modem的通讯。记得在PC机刚开始在中国流行起来时(大约是在90年代前五年),那时甚至有人用一条串行线进行两台电脑之间的数_java 标准串口协议格式
文章浏览阅读1.3k次。有的时候定位元素,反复检查写的代码没问题啊,但是就是定位不到,后来发现是页面没加载到,设置隐式等待时间就解决了。driver.implicitly_wait(5)_n.exceptions.nosuchelementexception: message: no such element: unable to loc
文章浏览阅读1.2k次。PHP导出excel想必很多童鞋都碰到了,使用phpexcel类也确实方便,但导出大量数据的时候就没那么简单了,常常会伴随一些超时或内存溢出的问题,下面就给大家介绍一些方法,文章由原作者整理,出处PHPExcel导出大量数据超时及内存错误解决方法PHPExcel是一个很强大的处理Excel的PHP开源类,但是很大的一个问题就是它占用内存太大,从1.7.3开始,它支持设置cell的缓存方式,但是推荐..._phpexcel 导出数据超过5000 无响应
文章浏览阅读3.3k次。无_ffmpeg h264
文章浏览阅读282次。#include /************************************************************************//* 功能:实现两个整形参数值交换/* 参数:/* lhs--int类型的指针,指向待交换数1的地址/* rhs--int类型的指针,指向待交换数2的地址/***************************..._全排列存储