前端灰度环境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文件(略)->重启当前部署

 

 

posted @ 2022-11-08 14:01  PeterWolf  阅读(551)  评论(2编辑  收藏  举报