前端灰度环境wayne+k8s部署
前端灰度环境wayne+k8s部署
一、灰度发布canay背景
灰度发布是一种发布方式,也叫金丝雀发布,起源是矿工在下井之前会先放一只金丝雀到井里,如果金丝雀不叫了,就代表瓦斯浓度高。原因是金丝雀对瓦斯气体很敏感。灰度发布的做法是:会在现存旧应用的基础上,启动一个新版应用,但是新版应用并不会直接让用户访问。而是先让测试同学去进行测试。如果没有问题,则可以将真正的用户流量慢慢导入到新版,在这中间,持续对新版本运行状态做观察,直到慢慢切换过去,这就是所谓的A/B测试。当然,你也可以招募一些灰度用户,给他们设置独有的灰度标示(Cookie,Header),来让他们可以访问到新版应用,当然,如果中间切换出现问题,也应该将流量迅速地切换到老应用上。
三种方式:header标示访问、cookie标示访问、权重分流访问;k8s 会优先去匹配 header ,如果未匹配则去匹配 cookie ,最后是 weight。
二、基于header切分流量
基于 Header 切分流量,这种实现原理主要根据用户请求中的 header 是否存在灰度标示 header去判断是否为灰度用户,再决定是否返回灰度版本服务。
修改下上面的ingress-gray.yml文件即可:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: user-canary annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/canary: "true" + nginx.ingress.kubernetes.io/canary-by-header: "name" + nginx.ingress.kubernetes.io/canary-by-header-value: "vip" spec: rules: - http: paths: - backend: serviceName: service-user-v2 servicePort: 80 backend: serviceName: service-user-v2 servicePort: 80
三、根据cookie切分流量
基于 Cookie 切分流量。这种实现原理主要根据用户请求中的 Cookie 是否存在灰度标示 Cookie去判断是否为灰度用户,再决定是否返回灰度版本服务
nginx.ingress.kubernetes.io/canary
可选值为 true / false 。代表是否开启灰度功能
nginx.ingress.kubernetes.io/canary-by-cookie
:灰度发布 cookie 的 key。当 key 值等于 always 时,灰度触发生效。等于其他值时,则不会走灰度环境 ingress-gray.yaml
我们创建一个ingress-gray.yaml文件:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: user-canary annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-cookie: "vip_user" spec: rules: - http: paths: - backend: serviceName: service-user-v2 servicePort: 80 backend: serviceName: service-user-v2 servicePort: 80
四、基于权重切分流量
这种实现原理主要是根据用户请求,通过根据灰度百分比决定是否转发到灰度服务环境中
nginx.ingress.kubernetes.io/canary-weight
:值是字符串,为 0-100 的数字,代表灰度环境命中概率。如果值为 0,则表示不会走灰度。值越大命中概率越大。当值 = 100 时,代表全走灰度。
一样一样的,修改下配置参数罢了:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: user-canary annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/canary: "true" + nginx.ingress.kubernetes.io/canary-weight: "50" spec: rules: - http: paths: - backend: serviceName: service-user-v2 servicePort: 80 backend: serviceName: service-user-v2 servicePort: 80
五、根据cookie标示ingress-canary: always显示不同的页面;
正常用户:
灰度用户::在cookie写入ingress-canary: always
六、canary灰度配置
6.1、新建git(灰度)分支
分支名称master-canary(v1.0.0)
6.2、wayne创建灰度部署
6.3、wayne创建灰度部署内容
注:容器名称和镜像地址有canary标示区分;
6.4、wayne创建负载均衡
常见负载均衡(带canary标示区分)
填写负载均衡内容,并发布;
6.5、wayne配置灰度ingress
创建ingress
填写ingress配置
配置灰度cookie设置
"annotations": { "kubernetes.io/ingress.class": "nginx", "nginx.ingress.kubernetes.io/canary": "true", "nginx.ingress.kubernetes.io/canary-by-cookie": "ingress-canary" }
七、灰度结束平滑发布
重要!重要!重要!
7.1、负载均衡名称对调,新的换老的老的换新的;(注:新的老的都要更换)
7.2、下一次更新灰度;
新建新的灰度分支:master-canary(v1.0.1)
7.3、更改本地代码的发布配置yml文件(略)->重启当前部署