|NO.Z.00358|——————————|CloudNative|——|KuberNetes&运维.V74|——|IngressNginx.v10|灰度金丝雀发布|

一、IngressNginx灰度金丝雀发布
### --- IngressNginx灰度金丝雀发布架构

~~~     在发布一个新项目的时候,对之前的旧项目做了很大的升级,而自己可能没有多大进阶
~~~     同时不了V1版本和V2版本
~~~     V1表示旧版本;目前的流量打在该版本上。
~~~     V2表示新版本;对稳定性和性能还不是很自信,所以采用灰度发布或者金丝雀发布,将流量慢慢的引入上来
~~~     对于部分用户或者指定的用户慢慢引入过来
~~~     他们分别都有自己的Ingress,而且他们两的域名是一样的
~~~     在v2只是打了10%的流量过来,若是在v2的IngressNginx配置了请求头,请求头是Ingress canary
~~~     在金丝雀配置了User=canary;这样user=canary用户引入到v2版本
~~~     若是金丝雀不设成true的话,它是不允许使用同一个域名的,path也是一样的
~~~     anary 规则按优先顺序进行评估。优先级如下: canary-by-header -> canary-by-cookie -> canary-weight
二、金丝雀部署
### --- 在某些情况下,您可能希望通过向与生产服务不同的服务发送少量请求来“金丝雀”
~~~     一组新的更改。金丝雀注解使 Ingress 规范能够根据应用的规则充当路由请求的替代服务。
~~~     nginx.ingress.kubernetes.io/canary: "true"设置后可以启用以下用于配置金丝雀的注释:

nginx.ingress.kubernetes.io/canary-by-header:               // 用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的标头。当请求标头设置为 时always,它将被路由到金丝雀。当标头设置为 时never,它永远不会被路由到金丝雀。对于任何其他值,标头将被忽略,并按优先级将请求与其他金丝雀规则进行比较。
nginx.ingress.kubernetes.io/canary-by-header-value:         // 要匹配的标头值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当请求头设置为这个值时,它将被路由到金丝雀。对于任何其他标头值,标头将被忽略,并按优先级将请求与其他金丝雀规则进行比较。此注释必须与 一起使用。注释是 的扩展,nginx.ingress.kubernetes.io/canary-by-header允许自定义标头值而不是使用硬编码值。如果nginx.ingress.kubernetes.io/canary-by-header未定义注释,则没有任何影响。
nginx.ingress.kubernetes.io/canary-by-header-pattern:       // 这与canary-by-header-valuePCRE 正则表达式匹配的工作方式相同。请注意,canary-by-header-value设置此注释时将被忽略。当给定的 Regex 在请求处理过程中导致错误时,该请求将被视为不匹配。
nginx.ingress.kubernetes.io/canary-by-cookie:               // 用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的 cookie。当 cookie 值设置为 时always,它将被路由到金丝雀。当 cookie 设置为 时never,它永远不会被路由到金丝雀。对于任何其他值,cookie 将被忽略,并按优先级将请求与其他金丝雀规则进行比较。
nginx.ingress.kubernetes.io/canary-weight:                  // 应路由到 Canary Ingress 中指定的服务的基于整数 (0 - 100) 的随机请求百分比。权重为 0 意味着此金丝雀规则不会向 Canary 入口中的服务发送任何请求。权重为 100 意味着所有请求都将发送到 Ingress 中指定的替代服务。

一、IngressNginx灰度金丝雀发布
### --- 部署IngressNginx.v1容器
~~~     将ingress-test1下nginx的内容更改为V1

[root@k8s-master01 ~]# kubectl get po -n ratel-test1 -owide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
ingress-test-6dd476fb56-twrdf   1/1     Running   0          20h   172.25.244.203   k8s-master01   <none>           <none>
[root@k8s-master01 ~]# curl  172.25.244.203
<title>Welcome to nginx!</title>
root@ingress-test-6dd476fb56-twrdf:/# echo v1 >/usr/share/nginx/html/index.html 
### --- 请求查看输出是否为V1

[root@k8s-master01 ~]# curl  172.25.244.203
v1
二、部署IngressNginx.v2容器
### --- 将ingress-test1下nginx的内容更改为V2

[root@k8s-master01 ~]# kubectl get po -n ratel-test2 -owide
NAME                            READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
ingress-test-6dd476fb56-f4fqc   1/1     Running   0          35s   172.25.244.204   k8s-master01   <none>           <none>
You have new mail in /var/spool/mail/root
[root@k8s-master01 ~]# curl 172.25.244.204
<h1>Welcome to nginx!</h1>
[root@k8s-master01 ~]# kubectl exec -ti ingress-test-6dd476fb56-f4fqc -n ratel-test2 -- bash
root@ingress-test-6dd476fb56-f4fqc:/# echo v2 >/usr/share/nginx/html/index.html
### --- 请求查看输出是否为V2

[root@k8s-master01 ~]# curl 172.25.244.204
v2
三、为V1和V2配置域名并访问测试
### --- 为IngressNginx.v1配置域名
~~~     为V1配置Ingressnginx:域名:canary.test.com
~~~     ——>访问测试:地址:http://canary.test.com/       输出:V1

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: canary-test
  namespace: ratel-test1
spec:
  rules:
  - host: canary.test.com
    http:
      paths:
      - backend:
          serviceName: ingress-test
          servicePort: 80
        path: /
        pathType: ImplementationSpecific
四、为IngressNginx.v2金丝雀配置域名
### --- 为V1配置Ingressnginx:域名:canary.test.com

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"      // 开启canary
    nginx.ingress.kubernetes.io/canary-weight: "50" // 先引入50%的流量
  name: canary-test
  namespace: ratel-test2
spec:
  rules:
  - host: canary.test.com
    http:
      paths:
      - backend:
          serviceName: ingress-test
          servicePort: 80
        path: /
        pathType: ImplementationSpecific
~~~     # ——>访问测试:地址:http://canary.test.com/       输出:V1和V2交互输出

~~~     ——>更改为100%后,所有的流量全部到V2

五、设置请求头
### --- 配置Ingress配置参数,添加请求头
~~~     若是请求头是canary,就会退回到金丝雀版本V2

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: user
    nginx.ingress.kubernetes.io/canary-by-header-value: canary
    nginx.ingress.kubernetes.io/canary-weight: "50"
  name: canary-test
  namespace: ratel-test2
spec:
  rules:
  - host: canary.test.com
    http:
      paths:
      - backend:
          serviceName: ingress-test
          servicePort: 80
        path: /
        pathType: ImplementationSpecific
### --- ——>访问测试:地址:http://canary.test.com/       输出:V1和V2交互输出
~~~     # 通过curl输出测试

[root@k8s-master01 ~]# curl http://canary.test.com/
v1
[root@k8s-master01 ~]# curl http://canary.test.com/
v2
~~~     # 加入请求头测试:输出全部是金丝雀版本

[root@k8s-master01 ~]# curl -H "user:canary" http://canary.test.com/
v2
[root@k8s-master01 ~]# curl -H "user:canary" http://canary.test.com/
v2
[root@k8s-master01 ~]# curl -H "user:canary" http://canary.test.com/
v2
六、将header的值设置为always
### --- 将header的值设置为always

nginx.ingress.kubernetes.io/canary-by-header    always
### --- 访问测试
~~~     全部路由到V2金丝雀版本上

[root@k8s-master01 ~]# curl -H "always:canary" http://canary.test.com/
v2
[root@k8s-master01 ~]# curl -H "always:canary" http://canary.test.com/
v2
七、将header的值设置为never
### --- 将header的值设置为never

nginx.ingress.kubernetes.io/canary-by-header    never
### --- 访问测试
~~~     全部路由到V2金丝雀版本上

[root@k8s-master01 ~]# curl -H "never:canary" http://canary.test.com/
v2
[root@k8s-master01 ~]# curl -H "never:canary" http://canary.test.com/
v2
八、cookie设置
### --- 配置Ingress配置参数,配置cookie

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-cookie: canary-cookie
    nginx.ingress.kubernetes.io/canary-weight: "50"
  name: canary-test
  namespace: ratel-test2
spec:
  rules:
  - host: canary.test.com
    http:
      paths:
      - backend:
          serviceName: ingress-test
          servicePort: 80
        path: /
        pathType: ImplementationSpecific
九、cookie设定验证
### --- 请求cookie值都为请求到V2

[root@k8s-master01 ~]# curl -b "canary-cookie=always" http://canary.test.com/
v2
[root@k8s-master01 ~]# curl -b "canary-cookie=always" http://canary.test.com/
v2

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

posted on 2022-04-01 13:25  yanqi_vip  阅读(47)  评论(0)    收藏  举报

导航