×
ABao阿宝
想是问题,做是答案;输在犹豫,赢在行动。
Nginx Ingress 实现灰度发布/金丝雀发布
分类:
Linux运维
发表:2021-11-20
围观(1313)
抢沙发
我们通过给 Ingress 资源指定 Nginx Ingress 所支持的一些 annotation 可以实现金丝雀发布,需要给服务创建两个 Ingress,一个正常的 Ingress,另一个是带 `nginx.ingress.kubernetes.io/canary: "true"` 这个固定的 annotation 的 Ingress,我们姑且称它为 Canary Ingress,一般代表新版本的服务,结合另外针对流量切分策略的 annotation 一起配置即可实现多种场景的金丝雀发布,以下对这些 annotation 详细介绍下: `nginx.ingress.kubernetes.io/canary-by-header`: 表示如果请求头中包含这里指定的 header 名称,并且值为 always 的话,就将该请求转发给该 Ingress 定义的对应后端服务;如果值为 never 就不转发,可以用于回滚到旧版;如果是其它值则忽略该 annotation。 `nginx.ingress.kubernetes.io/canary-by-header-value`: 这个可以作为 `canary-by-heade`r的补充,允许指定请求头的值可以自定义成其它值,不再只能是 always 或 never;当请求头的值命中这里的自定义值时,请求将会转发给该 Ingress 定义的对应后端服务,如果是其它值则将会忽略该 annotation。 `nginx.ingress.kubernetes.io/canary-by-header-pattern`: 这个与上面的 canary-by-header-value 类似,唯一的区别是它是用正则表达式对来匹配请求头的值,而不是只固定某一个值;需要注意的是,如果它与 `canary-by-header-value` 同时存在,这个 annotation 将会被忽略。 `nginx.ingress.kubernetes.io/canary-by-cookie`: 这个与 `canary-by-header` 类似,只是这个用于 cookie,同样也是只支持 always 和 never 的值。 `nginx.ingress.kubernetes.io/canary-weight`: 表示 Canary Ingress 所分配流量的比例的百分比,取值范围 [0-100],比如设置为 10,意思是分配 10% 的流量给 Canary Ingress 对应的后端服务。 上面的规则会按优先顺序进行评估,优先顺序如下:` canary-by-header -> canary-by-cookie -> canary-weight` 注意: 当 Ingress 被标记为 Canary Ingress 时,除了`nginx.ingress.kubernetes.io/load-balance`和 `nginx.ingress.kubernetes.io/upstream-hash-by` 之外,所有其他非 Canary 注释都将被忽略。 实践总结: 虽然我们使用 Nginx Ingress 实现了几种不同姿势的金丝雀发布,但还存在一些缺陷: 1. 相同服务的 Canary Ingress 只能定义一个,所以后端服务最多支持两个版本。 2. Ingress 里必须配置域名,否则不会有效果。 3. 即便流量完全切到了 Canary Ingress 上,旧版服务也还是必须存在,不然会报错。 参考网址: 1、[canary](https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md#canary "canary") 2、[Kubernetes 使用Nginx-Ingress实现蓝绿发布/金丝雀发布/AB测试](https://juejin.cn/post/6844903927318577159 "Kubernetes 使用Nginx-Ingress实现蓝绿发布/金丝雀发布/AB测试")
标签:
nginx
ingress
灰度
发布
金丝雀
本文
暂无
评论
回复给
点击这里取消回复。
验证码(*)
Top
Python
产品设计
学习笔记
网络基础
PHP
经营管理
运维开发
系统测试
Shell
Java
系统开发
Linux运维
运维架构
Go
×
本文 暂无 评论