前言
在日常业务中我们会经常对应用进行发版,常用到的发布方式有滚动更新、蓝绿发布、灰度发布。
- 滚动更新:依次进行旧版替换,直到旧的全部被替换为止。
- 蓝绿发布:2套系统版本,待上线称为蓝系统。当蓝系统测试完成用户流量接入后,蓝系统将称为绿系统,以前的绿系统就可销毁。这个主要用在早先物理机环境,成本代价高。
- 灰度发布:1套集群中2个版本,灰度版本只内部及少部分用户使用。待稳定后将灰度升级为稳定版本,旧版本下线,也称为金丝雀发布。
ingress-nginx
ingress-nginx是k8s官方推荐的ingress controller,它基于nginx实现增加了一组用于实现额外功能的Lua组件。
为了实现灰度发布,ingress-nginx通过定义annotation来实现不同场景的灰度发布。
- nginx.ingress.kubernetes.io/canary-weight: 基于服务权重的流量切分,权重范围0-100按百分比将请求路由到Canary Ingress中指定的服务。
- nginx.ingress.kubernetes.io/canary-by-header: 基于Request Header的流量切分,当Request Header设置为always时,请求将会被一直发送到Canary版本;设置为never则不会发送到Canary;对于其他任何Header值将忽略。
- nginx.ingress.kubernetes.io/canary-by-header-value: 匹配Request Header的值,将请求指定到Canary中指定的服务。该规则允许用户自定义Request Header的值,必须与上面annotation(canary-by-header)一起使用。
- nginx.ingress.kubernetes.io/canary-by-cookie: 基于cookie的流量切分,用于通知ingress将请求路由到cannry指定的服务cookie。当cookie值设置为always时,它将被路由到canary;当设置为never时请求不会路过去;对于任何其他值将忽略cookie并将请求与其他规则进行优先级比较。
1 | 通过annotation来实现灰度发布,整体思路如下: |
准备工作
镜像
1
mirrorgooglecontainers/echoserver:1.10
yaml文件
1 | apiVersion: apps/v1 |
canary版本
1 | apiVersion: apps/v1 |
- 基于权重
1 | apiVersion: networking.k8s.io/v1 |
- 基于用户请求
1 | apiVersion: networking.k8s.io/v1 |