K8s 1.18.6版本基于 ingress-nginx 实现金丝雀发布(灰度发布)
介绍
金丝雀发布:又叫灰度发布,控制产品从A版本平滑的过度到B版本
ingress-nginx:k8s ingress工具,支持金丝雀发布,可以实现基于权重、请求头、请求头的值、cookie转发流量。
rancher:k8s集群管理工具,使用UI简化k8s相关操作
ingress-nginx canary官方说明:https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#canary
环境
软件 | 版本 |
---|---|
kubernetes | v1.18.6 |
nginx-ingress-controller | 0.32.0 |
Rancher | v2.4.5 |
本次实验基于 Rancher-v2.4.5 部署了1.18.6版本的k8s集群,nginx-ingress 版本为0.32.0,理论上 ingress-nginx >= 0.21.0都是可以的。
以下所有的实验,都可以直接在rancher UI上直接配置。
首先创建两个nginx应用
- 部署两个deployment的http应用
1 | apiVersion: apps/v1 |
kubectl查看pod
1 | # kubectl get pod -o wide |grep app |
这两个应用输出以下内容
1 | # curl 10.60.0.91 |
- 分别为应用创建对应的service
1 | apiVersion: v1 |
kubectl查看service
1 | # kubectl get svc |grep app |
部署一个正常的ingress
现在这个ingress能正常的将访问路由到appv1上
1 | apiVersion: extensions/v1beta1 |
kubectl查看ingress
1 | # kubectl get ingress |
访问nginx.zerchin.xyz
1 | # curl nginx.zerchin.xyz |
基于权重转发流量
nginx.ingress.kubernetes.io/canary-weight
:随机整数请求的整数百分比(0-100),应将其路由到canary Ingress中指定的服务。权重0表示此Canary规则不会在Canary入口中将任何请求发送到服务。权重为100表示所有请求都将发送到Ingress中指定的替代服务。
新建一个ingress,配置如下
1 | apiVersion: extensions/v1beta1 |
kubectl查看ingress
1 | # kubectl get ingress |
这时候再访问nginx.zerchin.xyz,会发现其中30%的流量会路由到v2版本上
1 | # for i in `seq 1 10`;do curl nginx.zerchin.xyz;done |
基于请求头转发流量
nginx.ingress.kubernetes.io/canary-by-header
:用于通知Ingress将请求路由到Canary Ingress中指定的服务的标头。当请求标头设置always
为时,它将被路由到Canary。当标头设置never
为时,它将永远不会路由到金丝雀。对于任何其他值,标头将被忽略,并且按优先级将请求与其他金丝雀规则进行比较。
修改app-canary的ingress配置,修改annotation,如下:
1 | annotations: |
测试结果
1 | # curl nginx.zerchin.xyz |
基于请求头和请求头的值转发流量
nginx.ingress.kubernetes.io/canary-by-header-value
:匹配的报头值,用于通知Ingress将请求路由到Canary Ingress中指定的服务。当请求标头设置为此值时,它将被路由到Canary。对于任何其他标头值,标头将被忽略,并按优先级将请求与其他金丝雀规则进行比较。此注释必须与nginx.ingress.kubernetes.io/canary-by-header
一起使用。
修改app-canary的ingress配置,修改annotation,如下:
1 | annotations: |
测试结果
1 | # curl nginx.zerchin.xyz |
基于cookie转发流量
nginx.ingress.kubernetes.io/canary-by-cookie
:用于通知Ingress将请求路由到Canary Ingress中指定的服务的cookie。当cookie值设置always
为时,它将被路由到canary。当cookie设置never
为时,它将永远不会路由到Canary。对于任何其他值,将忽略cookie,并按优先级将请求与其他canary规则进行比较。
修改app-canary的ingress配置,修改annotation,如下:
1 | annotations: |
测试结果
1 | # curl nginx.zerchin.xyz |
总结
金丝雀发布规则优先级:
canary-by-header
->canary-by-cookie
->canary-weight
目前,每个ingress规则最多可以应用一个canary ingress