1. 程式人生 > 其它 >|NO.Z.00358|——————————|CloudNative|——|KuberNetes&運維.V74|-----------------------------------------------------------|IngressNginx.v10|灰度金絲雀釋出|

|NO.Z.00358|——————————|CloudNative|——|KuberNetes&運維.V74|-----------------------------------------------------------|IngressNginx.v10|灰度金絲雀釋出|



[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)