ingress-nginx 的金丝雀(canary)发布功能
之前有过一篇笔记(kubernetes ingress-nginx 的金丝雀(canary)/灰度发布功能的使用方法),这里重新整理下。什么是金丝雀、什么是蓝绿、什么是灰度,见 蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义。
原有的 ingress 不需要改变
使用 canary 功能时,主版本 ingress 保持原状,不需要任何改动。
这里使用下面 ingress 作为主版本 ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-echo-with-canary-master
spec:
rules:
- host: canary.echo.example
http:
paths:
- path: /
backend:
serviceName: echo
servicePort: 80
执行:
kubectl -n demo-echo create -f canary-master-echo-example-ingress.yaml
创建 canary (金丝雀)ingress
金丝雀 ingress 和主 ingress 使用相同的 host 和 path,区别在于多出了一些 annotation:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-echo-with-canary-version
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "version"
nginx.ingress.kubernetes.io/canary-by-header-value: "canary"
nginx.ingress.kubernetes.io/canary-by-cookie: "canary-cookie"
nginx.ingress.kubernetes.io/canary-weight: "50"
spec:
rules:
- host: canary.echo.example
http:
paths:
- path: /
backend:
serviceName: http-record
servicePort: 80
执行:
kubectl -n demo-echo create -f canary-version-echo-example-ingress.yaml
nginx.ingress.kubernetes.io/canary: true
是启用 canary,其余几个 annotation 分别是设置导向 cannary 的条件、权重。
金丝雀效果
使用下面的方式时,50% 的请求转发到金丝雀服务(对应设置 canary-weight):
$ curl -H "Host: canary.echo.example" 192.168.99.100:30933/
带有 "version: canary" 头的请求,转发到金丝雀服务(对应设置 canary-by-header 和 canary-by-header-value):
$ curl -H "Host: canary.echo.example" -H "version: canary" 192.168.99.100:30933/
带有 canary-cookie 且 cookie 值为 always 的请求,转发到金丝雀服务(对应设置 canary-by-cookie):
$ curl -H "Host: canary.echo.example" -b canary-cookie=always 192.168.99.100:30933/
带有 canary-cookie 且 cookie 值为 always 的请求,转发到主服务(对应设置 canary-by-cookie):
$ curl -H "Host: canary.echo.example" -b canary-cookie=never 192.168.99.100:30933/
header、cookie、weight 的优先级:canary-by-header -> canary-by-cookie -> canary-weight。