|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
浙公网安备 33010602011771号