|NO.Z.00358|——————————|CloudNative|——|KuberNetes&運維.V74|-----------------------------------------------------------|IngressNginx.v10|灰度金絲雀釋出|
阿新 • • 發佈:2022-04-01
[CloudNative:KuberNetes&運維.V74] [Applications.KuberNetes] [|DevOps|k8s|k8s運維|**3節點.V1**|IngressNginx灰度金絲雀釋出|]
一、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
===============================END===============================
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
來自為知筆記(Wiz)