精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何在Service Mesh微服務架構中實現金絲雀發布?

開發 架構
在介紹Kubernetes中的金絲雀(灰度)發布之前,先來了解下Kubernetes中最重要的應用部署方式——“滾動升級”。

[[427635]]

本文轉載自微信公眾號「無敵碼農」,作者無敵碼農。轉載本文請聯系無敵碼農公眾號。

今天的文章繼續聊聊有關Service Mesh微服務架構的話題,如果對之前的聊過的話題還不了解,可以參考文末的推薦閱讀。今天要聊的話題是:如何在Service Mesh微服務架構中實現“金絲雀發布”?

什么是金絲雀發布

既然要聊具體的實現,那么在開始之前,先科普下什么是“金絲雀發布”。金絲雀發布也叫“灰度發布”,具體來說就是在發布線上版本時,先將少量的生產流量打到服務的新版本,以驗證新版本的準確性和可靠性,待發布的新版本得到線上流量的全面驗證后,在逐步將所有流量放入新版本,以實現生產服務版本的穩定更新。

為什么叫金絲雀發布呢,是因為金絲雀對礦場中的毒氣比較敏感,所以在礦場開工前工人們會放一只金絲雀進去,以驗證礦場是否存在毒氣,這便是金絲雀發布名稱的由來。

在不同技術棧場景中,金絲雀發布的實現方式也不盡相同:有通過nginx實現的、也有借助A/B測試實現的。而隨著以Kubernetes為代表的云原生基礎設施的普及,金絲雀發布作為一項基本的服務發布功能,其實現方式也有了一些新的趨勢——那就是逐步與云原生基礎設施融為一體,成為基礎設施服務的一部分。

Kubernetes中的金絲雀(灰度)發布

接下來,先看看在Kubernetes中是如何實現版本更新的。以下內容假設你已經有了一套可用的Kubernetes環境,如果沒有可以查看文末推薦閱讀的文章鏈接,參考相關分享自行部署。

1.滾動更新

在介紹Kubernetes中的金絲雀(灰度)發布之前,先來了解下Kubernetes中最重要的應用部署方式——“滾動升級”。

所謂“滾動升級”:是指當更新了Kubernetes中Deployment編排資源的Pod模版(例如更新鏡像版本號)之后,Deployment就需要遵循一種叫做“滾動更新(rolling update)”的方式,來升級現有的容器,從而實現應用對外服務的“不中斷更新部署”。Kubernetes實現“滾動升級”的示意圖如下:

如上圖所示,滾動升級的過程為:

1)當容器開始升級時,集群中會先啟動一個新版本的Pod,并終止一個舊版本的Pod。

2)如果此時,新版本的Pod有問題啟動不了,那么“滾動升級”就會停止,并允許開發和運維人員介入。而在這個過程中,由于應用本身還有兩個舊版本的Pod在線,所以服務并不會受到太大的影響。

3)而如果新版本的Pod啟動成功,且服務訪問正常,則繼續滾動升級,直至按照Deployment編排器設置的副本數量,完成后續舊版本Pod的升級。

在Kubernetes中Deployment還可以通過相應地“滾動升級”策略,來控制Pod的滾動升級行為,以進一步保證服務的連續性。例如:“在任何時間窗口內,只有指定比例的Pod處于離線狀態;在任何時間窗口內,只有指定比例的新Pod被創建出來"。可以通過相應地控制參數進行設置,如下:

  1. ... 
  2. spec: 
  3.   selector: 
  4.     matchLabels: 
  5.       app: micro-api 
  6.   replicas: 3 
  7.   #設置滾動升級策略 
  8.   #Kubernetes在等待設置的時間后才開始進行升級,例如5秒 
  9.   minReadySeconds: 5 
  10.   strategy: 
  11.     type: RollingUpdate 
  12.     rollingUpdate: 
  13.       #升級過程中最多可以比原先設置多出的Pod數量 
  14.       maxSurge: 1 
  15.       #升級過程中Deployment控制器最多可以刪除多少個舊Pod,主要用于提供緩沖時間 
  16.       maxUnavailable: 1 
  17. ... 

在上面RollingUpdate Strategy(滾動升級策略)的配置中:

  • maxSurge:指定的是,除了設定的Pod副本數量之外,在一次“滾動”中,Deployment控制器還可以創建多少個新的Pod。
  • maxUnavailable:指的是,在一次“滾動”中,Deployment控制器可以刪除多少個舊Pod。

通過這種精確的“滾動升級”策略,可以使得Kubernetes服務版本發布的過程更加平滑。此外,這兩個配置還可以通過百分比的方式來表示,比如“maxUnavailable=50%”,指的是Deployment控制器最多可以一次刪除“50%*設定Pod副本數”個Pod。

接下來具體演示下在Kubernetes中進行服務滾動升級的詳細過程。

使用的示例代碼說明:

本文及本公眾號之前或之后與Service Mesh(服務網格、Istio)技術相關的分享,均使用《干貨|如何步入Service Mesh微服務架構時代》、《實戰|Service Mesh微服務架構實現服務間gRPC通信》這兩篇文章所展示的項目。

該項目以Spring Boot編寫的Java服務為主,在體驗上更接近真實的項目開發場景。項目的結構如下:

該項目所在的GitHub地址為:

https://github.com/manongwudi/istio-micro-service-demo

“滾動升級”演示:

這里先借助示例項目中的“micro-api”服務來演示其在Kubernetes中進行“滾動升級”的過程,步驟如下:

(1)首先準備“micro-api”服務的k8s發布文件(如:micro-api.yaml)。代碼如下:

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4.   name: micro-api 
  5. spec: 
  6.   type: ClusterIP 
  7.   ports: 
  8.     - name: http 
  9.       port: 19090 
  10.       targetPort: 9090 
  11.   selector: 
  12.     app: micro-api 
  13.  
  14. --- 
  15. apiVersion: apps/v1 
  16. kind: Deployment 
  17. metadata: 
  18.   name: micro-api 
  19. spec: 
  20.   selector: 
  21.     matchLabels: 
  22.       app: micro-api 
  23.   replicas: 3 
  24.   #設置滾動升級策略 
  25.   #Kubernetes在等待設置的時間后才開始進行升級,例如5秒 
  26.   minReadySeconds: 5 
  27.   strategy: 
  28.     type: RollingUpdate 
  29.     rollingUpdate: 
  30.       #升級過程中最多可以比原先設置多出的Pod數量 
  31.       maxSurge: 1 
  32.       #升級過程中Deployment控制器最多可以刪除多少個舊Pod 
  33.       maxUnavailable: 1 
  34.   template: 
  35.     metadata: 
  36.       labels: 
  37.         app: micro-api 
  38.     spec: 
  39.       #設置的阿里云私有鏡像倉庫登陸信息的secret(對應2.1.2的設置) 
  40.       imagePullSecrets: 
  41.         - name: regcred 
  42.       containers: 
  43.         - name: micro-api 
  44.           image: registry.cn-hangzhou.aliyuncs.com/wudimanong/micro-api:1.0-SNAPSHOT 
  45.           imagePullPolicy: Always 
  46.           tty: true 
  47.           ports: 
  48.             - name: http 
  49.               protocol: TCP 
  50.               containerPort: 19090 

上述部署文件設置了“micro-api”服務的Pod副本個數為“3”,并且設置了相應地滾動升級策略。

(2)接下來執行k8s部署命令如下:

  1. $ kubectl apply -f micro-api.yaml  

成功后,查看Deployment創建后的狀態信息,命令效果如下:

  1. $ kubectl get deployments 
  2. NAME          READY   UP-TO-DATE   AVAILABLE   AGE 
  3. micro-api     3/3     3            3           190d 

從上述命令的返回結果中,可以看到三個狀態字段,它們的含義如下所示:

  • READY:表示用戶期望的Pod副本個數,以及當前處于Running狀態的Pod個數。
  • UP-TO-DATE:當前處于最新版本的Pod個數。所謂最新版本,指的是Pod的Spec部分與Deployment中Pod模版里定義的完全一致。
  • AVAILABLE:當前已經可用的Pod的個數——既是Running狀態,又是最新版本,并且已經處于Ready(監控檢查正確)狀態的Pod個數。

(3)模擬服務版本升級,觸發滾動升級。

接下來重新構建“micro-api”服務的版本,并將其上傳至私有鏡像倉庫。之后,通過命令修改“micro-api”的Deployment所使用的鏡像,并觸發滾動升級。

修改Deployment所使用的鏡像的命令如下:

  1. $ kubectl set image deployment/micro-api micro-api=registry.cn-hangzhou.aliyuncs.com/wudimanong/micro-api:1.1-SNAPSHOT 
  2. deployment.apps/micro-api image updated 

這里使用了“kubectl set image”指令,主要是為了方便操作,也可以直接在k8s部署文件中進行鏡像版本的修改。

修改完Deployment的鏡像版本后,Kubernetes會立即觸發“滾動升級”的過程。可以通過“kubectl rollout status”指令來查看Deployment資源的狀態變化。具體如下:

  1. $ kubectl rollout status deployment/micro-api 
  2.  
  3. Waiting for deployment "micro-api" rollout to finish: 2 out of 3 new replicas have been updated... 
  4. Waiting for deployment "micro-api" rollout to finish: 2 out of 3 new replicas have been updated... 
  5.  
  6. Waiting for deployment "micro-api" rollout to finish: 2 out of 3 new replicas have been updated... 
  7. Waiting for deployment "micro-api" rollout to finish: 2 of 3 updated replicas are available... 
  8. Waiting for deployment "micro-api" rollout to finish: 2 of 3 updated replicas are available... 
  9. deployment "micro-api" successfully rolled out 

這時,也可以通過查看Deployment的Events,看到這個“滾動升級”的過程。具體如下:

  1. $ kubectl describe deployment micro-api 
  2. ... 
  3. OldReplicaSets:  <none> 
  4. NewReplicaSet:   micro-api-d745d8649 (3/3 replicas created) 
  5. Events: 
  6.   Type    Reason             Age   From                   Message 
  7.   ----    ------             ----  ----                   ------- 
  8.   Normal  ScalingReplicaSet  12m   deployment-controller  Scaled up replica set micro-api-677dd4d5b6 to 1 
  9.   Normal  ScalingReplicaSet  12m   deployment-controller  Scaled down replica set micro-api-57c7cb5b74 to 2 
  10.   Normal  ScalingReplicaSet  12m   deployment-controller  Scaled up replica set micro-api-677dd4d5b6 to 2 
  11.   Normal  ScalingReplicaSet  5m1s  deployment-controller  Scaled down replica set micro-api-677dd4d5b6 to 0 
  12.   Normal  ScalingReplicaSet  5m    deployment-controller  Scaled up replica set micro-api-d745d8649 to 2 
  13.   Normal  ScalingReplicaSet  56s   deployment-controller  Scaled down replica set micro-api-57c7cb5b74 to 0 
  14.   Normal  ScalingReplicaSet  56s   deployment-controller  Scaled up replica set micro-api-d745d8649 to 3 

可以看到,當你修改了Deployment里的Pod定義后,"Deployment Controller"會使用這個修改后的Pod模版,創建一個新的ReplicaSet,這個新的ReplicaSet的初始Pod副本數是:0。

然后在Age=12 m的位置,開始將這個新的ReplicaSet所控制的Pod副本數從0個變成1個。

緊接著,在Age=12 m的位置,又將舊ReplicaSet所控制的Pod副本數減少1個,即“水平收縮”成兩個副本。

如此交替進行,新ReplicaSet所管理的Pod的副本數,從0個變成1個,再變成2個,最后變成3個;而舊ReplicaSet所管理的Pod的副本數則從3個變成2個,最后變成0個。

這樣,就完成了一組Pod的版本升級過程。而像這樣將一個Kubernetes集群中正在運行的多個Pod版本,交替逐一升級的過程,就是“滾動升級”。

2.金絲雀(灰度)發布

前面“1.”小標題中,比較詳細的演示了Kubernetes的“滾動升級”的方式,雖然通過滾動升級的方式可以方便、平滑的實現版本更新,但是這個過程,并沒有灰度功能。滾動升級的方式,雖然中間有緩沖交替的過程,但這種過程是自動的、迅速的,滾動升級過程結束就相當于直接進行了新版本的全量發布。

而對于需要進行金絲雀(灰度)發布的場景,“滾動升級”的方式很顯然是不夠用的。那么,在Kubernetes中應該如何結合版本更新做到金絲雀(灰度)發布呢?

具體步驟如下:

(1)編寫實現新版本灰度發布的部署文件。

為了實現在Kubernetes中的金絲雀(灰度)發布過程的可觀測,我們重新定義下具體的k8s發布文件(如:micro-api-canary.yaml)的內容如下:

  1. apiVersion: apps/v1 
  2. kind: Deployment 
  3. metadata: 
  4.   name: micro-api 
  5. spec: 
  6.   selector: 
  7.     matchLabels: 
  8.       app: micro-api 
  9.   replicas: 3 
  10.   #設置滾動升級策略 
  11.   #Kubernetes在等待設置的時間后才開始進行升級,例如5秒 
  12.   minReadySeconds: 5 
  13.   strategy: 
  14.     type: RollingUpdate 
  15.     rollingUpdate: 
  16.       #升級過程中最多可以比原先設置多出的Pod數量 
  17.       maxSurge: 1 
  18.       #升級過程中Deployment控制器最多可以刪除多少個舊Pod,主要用于提供緩沖時間 
  19.       maxUnavailable: 1 
  20.   template: 
  21.     metadata: 
  22.       labels: 
  23.         app: micro-api 
  24.         #增加新的標簽(演示k8s的灰度發布) 
  25.         track: canary 
  26.     spec: 
  27.       #設置的阿里云私有鏡像倉庫登陸信息的secret(對應2.1.2的設置) 
  28.       imagePullSecrets: 
  29.         - name: regcred 
  30.       containers: 
  31.         - name: micro-api 
  32.           image: registry.cn-hangzhou.aliyuncs.com/wudimanong/micro-api:1.3-SNAPSHOT 
  33.           imagePullPolicy: Always 
  34.           tty: true 
  35.           ports: 
  36.             - name: http 
  37.               protocol: TCP 
  38.               containerPort: 19090 

上述發布文件與“1.”小標題中演示滾動升級時,發布文件的內容一致,只是為了方便觀察灰度發布過程的實現,這里通過“track: canary”對新發布的Pod版本進行標記。

設置新版本的鏡像為:“micro-api:1.3-SNAPSHOT”。并且通過“spec.selector.matchLabels.app:micro-api”與歷史版本Pod所對應的Service(micro-api.yaml文件中定義的Service)資源定義匹配。

(2)執行"滾動升級"發布命令,實現“灰度發布”效果。

  1. $ kubectl apply -f micro-api-canary.yaml && kubectl rollout pause deployment/micro-api 

上面通過"kubectl rollout pause"命令實現對Deployment的金絲雀(灰度發布)。執行發布命令之后的運行效果如下:

  1. $ kubectl get pods --show-labels -o wide 
  2. NAME                         READY   STATUS    RESTARTS   AGE     IP          NODE         NOMINATED NODE   READINESS GATES   LABELS 
  3. micro-api-57c7cb5b74-mq7m9   1/1     Running   0          6m20s   10.32.0.3   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=57c7cb5b74 
  4. micro-api-57c7cb5b74-ptptj   1/1     Running   0          6m20s   10.32.0.4   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=57c7cb5b74 
  5. micro-api-7dbb6c5d66-4rbdc   1/1     Running   0          5m33s   10.32.0.6   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=7dbb6c5d66,track=canary 
  6. micro-api-7dbb6c5d66-cfk9l   1/1     Running   0          5m33s   10.32.0.5   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=7dbb6c5d66,track=canary 

查看Deployment的滾動升級情況,命令如下:

  1. $ kubectl get deployments 
  2. NAME            READY   UP-TO-DATE   AVAILABLE   AGE 
  3. micro-api       4/3     2            4           194d 

可以看到此時“micro-api” ready的數量為4,其中兩個舊版本Pod,兩個新版本Pod。

(3)接下來進行流量測試。

查詢兩組Pod版本所對應的Service資源的IP,命令如下:

  1. # kubectl get svc micro-api 
  2. NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE 
  3. micro-api   ClusterIP   10.110.169.161   <none>        19090/TCP   194d 

接下來,模擬對服務的接口進行批量訪問,命令如下:

  1. for i in {1..10}; do curl 10.110.169.161:19090/test/test; done 
  2.  
  3. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  4. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  5. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  6. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  7. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  8. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  9. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  10. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  11. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  12. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"

可以看到,此時流量會隨機的流向舊版本和新版本(日志標記為V3)的服務。

(4)將服務版本升級為新版本。

如果新版本的服務經過線上流量測試驗證沒有問題,則可以通過"rollout resume"命令將整體服務的版本升級為新版本。命令如下:

  1. $ kubectl rollout resume deployment micro-api 
  2. deployment.apps/micro-api resumed 

升級后的效果如下:

  1. $ kubectl get pods --show-labels -o wide 
  2. NAME                         READY   STATUS    RESTARTS   AGE   IP          NODE         NOMINATED NODE   READINESS GATES   LABELS 
  3. micro-api-7dbb6c5d66-4rbdc   1/1     Running   0          18m   10.32.0.6   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=7dbb6c5d66,track=canary 
  4. micro-api-7dbb6c5d66-bpjtg   1/1     Running   0          84s   10.32.0.3   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=7dbb6c5d66,track=canary 
  5. micro-api-7dbb6c5d66-cfk9l   1/1     Running   0          18m   10.32.0.5   kubernetes   <none>           <none>            app=micro-api,pod-template-hash=7dbb6c5d66,track=canary 

可以看到,此時目標服務已經通過“滾動升級”的方式完成了全量更新。而如果存在問題,則通過“kubectl rollout undo”命令進行回滾即可!

從上述過程可以看到,Kubernetes中的金絲雀(灰度發布)主要是通過操縱(如:pause)“滾動升級”的過程來實現的——通過發布一定數量的新版本Pod,并利用Service資源類型本身的負載均衡能力來實現流量在新/舊Pod之間的隨機交替。

這樣的方式雖然已經可以滿足一些簡單的場景,但是沒有辦法做到更精準的灰度流量控制。這時候就需要借助 Service Mesh 中的解決方案了,下面我們來看看在 Istio 中如何做到精準流量的金絲雀(灰度)發布。

Istio中的金絲雀(灰度)發布

以下內容默認你已經在Kubernetes中安裝了Istio環境,如果還沒有安裝可以參考《干貨|如何步入Service Mesh微服務架構時代》中分享的內容。

Istio與Kubernetes實現金絲雀(灰度)發布的方式不一樣,Istio通過Envoy(SideCar)強大的路由規則管理能力,可以非常靈活地控制對應版本的流量占比,從而實現具備精準流量控制能力的金絲雀(灰度)發布功能。

Istio通過Envoy(SideCar)實現金絲雀(灰度)發布的流量路由示意圖如下(繼續以“micro-api”服務為例):

從上圖中可以大致看出,Istio具備強大的流量管理能力,而這種能力對于實現流量精準控制的金絲雀(灰度)發布功能來說,自然是水到渠成的。

具體來說,在Istio中是通過VirtualService(虛擬服務)這種特定的資源在服務網格中實現流量路由的。通過VirtualService可以方便地定義流量路由規則,并在客戶端試圖連接到服務時應用這些規則,并最終到達目標服務。

接下來,具體演示如何在Istio中通過VirtualService實現金絲雀(灰度)發布。步驟如下:

(1)首先發布一個v1版本的服務。

要在Istio中實現更精準的版本控制,需要在發布Pod資源時,通過明確的“版本標簽”進行指定。準備“micro-api”服務v1版本的k8s部署文件(micro-api-canary-istio-v1.yaml):

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4.   name: micro-api 
  5. spec: 
  6.   type: ClusterIP 
  7.   ports: 
  8.     - name: http 
  9.       port: 19090 
  10.       targetPort: 9090 
  11.   selector: 
  12.     app: micro-api 
  13.  
  14. --- 
  15.  
  16. apiVersion: apps/v1 
  17. kind: Deployment 
  18. meta data: 
  19.   name: micro-api-v1 
  20. spec: 
  21.   selector: 
  22.     matchLabels: 
  23.       app: micro-api 
  24.       #這里是關鍵,需要設置版本標簽,以便實現灰度發布 
  25.       version: v1 
  26.   replicas: 3 
  27.   #設置滾動升級策略 
  28.   #Kubernetes在等待設置的時間后才開始進行升級,例如5秒 
  29.   minReadySeconds: 5 
  30.   strategy: 
  31.     type: RollingUpdate 
  32.     rollingUpdate: 
  33.       #升級過程中最多可以比原先設置多出的Pod數量 
  34.       maxSurge: 1 
  35.       #升級過程中Deployment控制器最多可以刪除多少個舊Pod,主要用于提供緩沖時間 
  36.       maxUnavailable: 1 
  37.   template: 
  38.     metadata: 
  39.       labels: 
  40.         app: micro-api 
  41.         #設置版本標簽,便于灰度發布 
  42.         version: v1 
  43.     spec: 
  44.       #設置的阿里云私有鏡像倉庫登陸信息的secret 
  45.       imagePullSecrets: 
  46.         - name: regcred 
  47.       containers: 
  48.         - name: micro-api 
  49.           image: registry.cn-hangzhou.aliyuncs.com/wudimanong/micro-api:1.1-SNAPSHOT 
  50.           imagePullPolicy: Always 
  51.           tty: true 
  52.           ports: 
  53.             - name: http 
  54.               protocol: TCP 
  55.               containerPort: 19090 

“spec.selector.matchLabels.version:v1”標簽用來標注服務的版本,該標簽是后續Istio的流量管理規則中,識別服務版本的主要依據。

準備好發布文件后,執行發布命令:

  1. $ kubectl apply -f micro-api-canary-istio-v1.yaml 

此時,一個低版本的服務就運行成功了!接下來我們模擬對其實施金絲雀(灰度)發布。

(2)發布一個v2版本的服務(升級的目標版本)。

與v1版本服務一樣,發布的v2版本的服務也需要明確版本標簽,其發布文件(micro-api-canary-istio-v2.yaml)的內容如下:

  1. apiVersion: apps/v1 
  2. kind: Deployment 
  3. metadata: 
  4.   name: micro-api-v2 
  5. spec: 
  6.   selector: 
  7.     matchLabels: 
  8.       app: micro-api 
  9.       #設置好版本標簽,便于灰度發布 
  10.       version: v2 
  11.   replicas: 3 
  12.   #設置滾動升級策略 
  13.   #Kubernetes在等待設置的時間后才開始進行升級,例如5秒 
  14.   minReadySeconds: 5 
  15.   strategy: 
  16.     type: RollingUpdate 
  17.     rollingUpdate: 
  18.       #升級過程中最多可以比原先設置多出的Pod數量 
  19.       maxSurge: 1 
  20.       #升級過程中Deployment控制器最多可以刪除多少個舊Pod,主要用于提供緩沖時間 
  21.       maxUnavailable: 1 
  22.   template: 
  23.     metadata: 
  24.       labels: 
  25.         app: micro-api 
  26.         #設置好版本標簽,便于灰度發布 
  27.         version: v2 
  28.     spec: 
  29.       #設置的阿里云私有鏡像倉庫登陸信息的secret 
  30.       imagePullSecrets: 
  31.         - name: regcred 
  32.       containers: 
  33.         - name: micro-api 
  34.           image: registry.cn-hangzhou.aliyuncs.com/wudimanong/micro-api:1.3-SNAPSHOT 
  35.           imagePullPolicy: Always 
  36.           tty: true 
  37.           ports: 
  38.             - name: http 
  39.               protocol: TCP 
  40.               containerPort: 19090 

執行發布命令:

  1. $ kubectl apply -f micro-api-canary-istio-v2.yaml  
  2. deployment.apps/micro-api-v2 created 

此時,系統中就存在了兩組版本的Pod資源,具體如下:

  1. # kubectl get pods 
  2. NAME                            READY   STATUS    RESTARTS   AGE 
  3. micro-api-v1-565d749dd4-7c66z   1/1     Running   2          13h 
  4. micro-api-v1-565d749dd4-7dqfb   1/1     Running   2          13h 
  5. micro-api-v1-565d749dd4-l62wc   1/1     Running   2          13h 
  6. micro-api-v2-6f98c598c9-5stlw   1/1     Running   0          82s 
  7. micro-api-v2-6f98c598c9-f2ntq   1/1     Running   0          82s 
  8. micro-api-v2-6f98c598c9-l8g4j   1/1     Running   0          82s 

接下來將演示如何利用Istio強大的流量管理功能,來實現流量在這兩組版本Pod資源之間的精確控制!

(3)創建Istio網關資源。

在Istio中要實現流量的精確控制,需要將VirtualService綁定到具體的Ingressgateway(入口網關)資源。因此在創建VirtualService資源實現流量路由及控制前,需要創建一個Istio網關。部署文件(micro-gateway.yaml)的內容如下:

  1. apiVersion: networking.istio.io/v1alpha3 
  2. kind: Gateway 
  3. metadata: 
  4.   name: micro-gateway 
  5. spec: 
  6.   selector: 
  7.     istio: ingressgateway 
  8.   servers: 
  9.     - port: 
  10.         number: 80 
  11.         name: http 
  12.         protocol: HTTP 
  13.       hosts: 
  14.         - "*" 

上述部署文件執行后將創建一個名稱為“micro-gateway”的Istio網關,并允許所有主機(hosts:"*"指定)通過該網關。

(4)創建Istio虛擬服務資源VirtualService。

前面提到過在Istio中主要是通過VirtualService(虛擬服務)來實現服務網格內的流量路由及控制。接下來我們看看VirtualService資源的具體創建方式,準備資源文件(如virtual-service-all.yaml),內容如下:

  1. apiVersion: networking.istio.io/v1alpha3 
  2. kind: VirtualService 
  3. metadata: 
  4.   name: micro-api-route 
  5. spec: 
  6.   #用于定義流量被發送到的目標主機(這里為部署在k8s中的micro-api服務) 
  7.   hosts: 
  8.     - micro-api.default.svc.cluster.local 
  9.   #將VirtualService綁定到Istio網關,通過網關來暴露路由目標 
  10.   gateways: 
  11.     - micro-gateway 
  12.   http: 
  13.     - route: 
  14.         #設置舊版本(V1)版本的流量占比為70% 
  15.         - destination: 
  16.             host: micro-api.default.svc.cluster.local 
  17.             subset: v1 
  18.           #通過權重值來設置流量占比 
  19.           weight: 70 
  20.         #設置新版本(V2)版本的流量占比為30% 
  21.         - destination: 
  22.             host: micro-api.default.svc.cluster.local 
  23.             subset: v2 
  24.           weight: 30 

如上所示,VirtualService資源具備針對http的精準流量控制能力,可以將指定占比的流量路由到特定的“subset”指定的版本。而為了實現這一能力,VirtualService資源還需要與Istio網關綁定,通過Istio網關來暴露路由目標。

(5)創建Istio目標路由規則資源。

虛擬服務VirtualService在Istio中主要用于控制流量的行為,而定義流量行為的路由規則則需要通過“DestinationRule”路由規則資源來定義。創建路由規則文件(destination-rule-all.yaml),具體內容如下:

  1. apiVersion: networking.istio.io/v1alpha3 
  2. kind: DestinationRule 
  3. metadata: 
  4.   name: micro-api-destination 
  5. spec: 
  6.   #與Deployment資源對應的Service資源名稱關聯 
  7.   host: micro-api 
  8.   #流量策略設置:負載均衡策略、連接池大小、局部異常檢測等,在路由發生后作用于流量 
  9.   trafficPolicy: 
  10.     #限流策略 
  11.     connectionPool: 
  12.       tcp: 
  13.         maxConnections: 10 
  14.       http: 
  15.         http1MaxPendingRequests: 1 
  16.         maxRequestsPerConnection: 1 
  17.     #設置目的地的負債均衡算法 
  18.     loadBalancer: 
  19.       simple: ROUND_ROBIN 
  20.   #目的地指的是不同的子集(subset)或服務版本。通子集(subset),可以識別應用程序的不同版本,以實現流量在不同服務版本之間的切換 
  21.   subsets: 
  22.     - name: v1 
  23.       labels: 
  24.         version: v1 
  25.     - name: v2 
  26.       labels: 
  27.         version: v2 

如上所示,通過subsets屬性,定義了VirtualService資源用于路由的具體版本標簽匹配信息。至此,針對兩個版本服務的灰度流量控制規則就設置好了,接下來測試具體的金絲雀(灰度)發布效果。

(6)測試Istio實現金絲雀(灰度)發布的流量控制效果。

在正式測試之前,可以通過命令查看下當前的部署資源情況:

  1. #查看部署的Deployment資源 
  2. kubectl get deploy  | grep micro-api 
  3.  
  4. micro-api-v1             3/3     3            3           21h 
  5. micro-api-v2             3/3     3            3           8h 
  1. #查看兩組版本Pod資源對應的K8s-Service的服務IP 
  2. kubectl get svc micro-api 
  3.  
  4. NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE 
  5. micro-api   ClusterIP   10.110.169.161   <none>        19090/TCP   205d 
  1. #查看VirtualService資源定義 
  2. kubectl get vs 
  3.  
  4. NAME              GATEWAYS          HOSTS                                   AGE 
  5. micro-api-route   [micro-gateway]   [micro-api.default.svc.cluster.local]   7h34m 
  1. #查看定義的路由規則資源 
  2. kubectl get dr 
  3.  
  4. NAME                    HOST        AGE 
  5. micro-api-destination   micro-api   7h27m 

通過上面的資源信息查看,這里我們已經可以查到Deployments對應的K8s-Service資源的IP,但如果通過K8s-Service資源來進行測試的話,會發現流量的控制并不精準,并不能達到我們設置的70%流量流向v1,30%的流量流向v2(因為這是隨機流量)。

因此,要使用Istio的精準流量控制功能,還需要使用Istio的Ingressgateway。查看Istio的Ingressgateway資源IP的命令如下:

  1. #查看ingress的IP 
  2. kubectl get svc -n istio-system | grep ingress 
  3.  
  4. istio-ingressgateway   LoadBalancer   10.98.178.61     <pending>     15021:31310/TCP,80:32113/TCP,443:31647/TCP,31400:30745/TCP,15443:30884/TCP   7h54m 

接下來,通過Ingress的IP來訪問“micro-api”服務,命令及效果如下:

  1. for i in {1..10}; do curl -H "Host:micro-api.default.svc.cluster.local" 10.98.178.61:80/test/test; done 
  2.  
  3. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  4. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  5. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  6. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  7. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  8. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  9. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  10. {"code":0,"data":"無依賴測試接口返回->OK!","message":"成功"
  11. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  12. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"

如上所示,流量按照設定的比例(v1:70%;v2:30%)進行了分流。

(7)測試將流量全部切向新版本。

為了更明顯地驗證Istio的流量控制效果,接下來,我們通過變更VirtualService資源的流量設置占比,將流量全部切到新版本。變更后的VirtualService資源的配置文件內容如下:

  1. apiVersion: networking.istio.io/v1alpha3 
  2. kind: VirtualService 
  3. metadata: 
  4.   name: micro-api-route 
  5. spec: 
  6.   #用于定義流量被發送到的目標主機(這里為部署在k8s中的micro-api服務) 
  7.   hosts: 
  8.     - micro-api.default.svc.cluster.local 
  9.   #將VirtualService綁定到Istio網關,通過網關來暴露路由目標 
  10.   gateways: 
  11.     - micro-gateway 
  12.   http: 
  13.     - route: 
  14.         #設置舊版本(V1)版本的流量占比為70% 
  15.         - destination: 
  16.             host: micro-api.default.svc.cluster.local 
  17.             subset: v1 
  18.           #通過權重值來設置流量占比 
  19.           weight: 0 
  20.         #設置新版本(V2)版本的流量占比為30% 
  21.         - destination: 
  22.             host: micro-api.default.svc.cluster.local 
  23.             subset: v2 
  24.           weight: 100 

繼續通過Istio網關訪問目標服務,命令如下:

  1. for i in {1..10}; do curl -H "Host:micro-api.default.svc.cluster.local" 10.98.178.61:80/test/test; done 
  2.  
  3. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  4. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  5. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  6. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  7. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  8. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  9. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  10. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  11. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"
  12. {"code":0,"data":"V3|無依賴測試接口返回->OK!","message":"成功"

可以觀察到,此時流量已經全部切換到了新版本服務!

后記

在微服務時代,不同的服務之間相互聯系,關系錯綜復雜,部署升級一個服務,可能造成整個系統的癱瘓,因此,需要選擇合適的部署方式,從而將風險降到最低。金絲雀(灰度)發布只是多種部署方式的一種,還有藍綠部署、滾動部署(如K8s的滾動升級)等,可以根據不同的業務場景選擇不同的發布形式。

 

責任編輯:武曉燕 來源: 無敵碼農
相關推薦

2023-10-08 07:34:04

2021-07-13 06:35:11

Argo Rollou GitOpsKubernetes

2022-02-17 13:09:55

金絲雀部署服務集群測試

2021-10-14 18:21:52

架構IstioService

2022-11-30 08:00:00

金絲雀部署IT測試

2021-07-29 05:09:54

Linkerd金絲雀部署Flagger

2021-06-15 05:52:33

Linkerd canary網絡技術

2022-08-22 10:40:40

Kubernete部署分析運行

2021-02-28 07:52:24

蠕蟲數據金絲雀

2023-09-05 07:24:33

Traefik加權輪詢

2021-06-08 07:04:45

Service Mes微服務熔斷

2024-01-18 08:24:08

2021-06-03 05:48:58

GitOps 云原生Kubernetes

2022-08-15 20:48:28

Chrome安卓網頁

2021-12-08 17:54:55

架構控制平面

2024-04-01 13:04:01

停機部署滾動部署藍綠部署

2019-03-20 09:28:42

Service Mes高可用架構

2025-03-04 08:53:10

2023-11-09 07:23:57

Istio路由分析

2023-11-19 22:59:48

微服務開發
點贊
收藏

51CTO技術棧公眾號

亚洲中文字幕无码不卡电影| 精品国产乱码久久久久久久软件 | 国产精品视频一区二区三区,| 我不卡影院28| 亚洲精品在线观| 精品久久久噜噜噜噜久久图片| 亚洲成a人v欧美综合天堂麻豆| 精品一区二区国语对白| 91精品国产91久久| 精品国产视频一区二区三区| 久久精品国产亚洲5555| 欧美日韩午夜在线视频| 香港三级韩国三级日本三级| 麻豆tv免费在线观看| 成人国产一区二区三区精品| 国产精品高清在线| 日本一区二区免费在线观看| 日韩激情在线| 精品无人区太爽高潮在线播放| 成人国产精品久久久久久亚洲| 久久久久久国产精品免费播放| 欧美美乳视频| 亚洲国产一区二区三区在线观看| 91精品无人成人www| 第一福利在线视频| 依依成人综合视频| 在线看成人av电影| 福利视频在线导航| 99精品一区二区| 91在线在线观看| 国产精品久久久久久久一区二区| 亚洲在线视频| 97av在线视频| 日韩成人免费在线观看| 亚洲国产一成人久久精品| 亚洲图片在线综合| 37p粉嫩大胆色噜噜噜| 亚洲一区二区三区在线免费| 欧美精品乱码久久久久久按摩| 97在线播放视频| 极品美鲍一区| 天天做天天摸天天爽国产一区| 国产精品xxxx| 国产成人在线观看网站| 欧美激情四色| 欧美成人久久久| 小泽玛利亚一区| 精品国产一区二| 欧美四级电影网| 91蝌蚪视频在线观看| 综合在线影院| 欧美中文字幕一区| 91香蕉视频污版| 日本综合视频| 欧美日韩国产综合草草| 国产色视频在线播放| 电影一区二区| 欧美日韩午夜在线视频| av免费一区二区| 亚洲一区二区三区久久久| 欧美日韩国产成人在线91| 手机在线成人免费视频| 国产美女久久| 91精品欧美综合在线观看最新| 亚洲国产精品无码观看久久| 丁香花在线影院| 天天亚洲美女在线视频| 久久久999视频| 久久99久久99精品免观看软件| 一本色道a无线码一区v| www.日本xxxx| 香蕉久久一区| 亚洲成人精品av| 毛片网站免费观看| 精品一级毛片| 久久亚洲精品一区二区| 国产亚洲欧美精品久久久www | 成年人午夜免费视频| 天堂а√在线最新版中文在线| 欧美午夜无遮挡| 午夜精品中文字幕| 成人涩涩网站| 一区二区三区视频免费在线观看| 91香蕉一区二区三区在线观看| 欧美精品1区| 国产成人一区二区三区| 国产精品日韩无码| av亚洲精华国产精华| 日本免费高清不卡| 在线观看男女av免费网址| 精品国产户外野外| 91丨九色丨蝌蚪| 国产精品99久久免费观看| 亚洲欧美在线一区| 少妇精品无码一区二区三区| 狠狠色狠狠色综合婷婷tag| 久久好看免费视频| 正在播放国产对白害羞| 欧美另类亚洲| 国产精品久久久久久久久借妻| www.五月激情| 国产片一区二区| 免费看欧美黑人毛片| 福利一区二区三区视频在线观看| 日韩美女主播在线视频一区二区三区| 国产精品揄拍100视频| 亚州av乱码久久精品蜜桃 | 日本学生初尝黑人巨免费视频| 日本亚洲天堂网| 国产日韩精品推荐| 亚洲美女性生活| 亚洲国产岛国毛片在线| 99视频在线免费播放| av一级久久| 亚洲亚裔videos黑人hd| 中文字幕第28页| 国产一区二区三区久久久| 欧美日韩综合网| 超免费在线视频| 欧美一区二区成人6969| 人妻无码一区二区三区免费| 99精品免费视频| av免费观看久久| 免费av在线网址| 欧美日韩一卡二卡| 无码人妻aⅴ一区二区三区69岛| 国内精品久久久久久久97牛牛 | 五月激情丁香网| 久久综合色婷婷| 日本午夜激情视频| 91蝌蚪精品视频| 精品综合久久久久久97| 91丨porny丨在线中文 | 亚洲成人1区2区| 佐山爱在线视频| 久久亚洲精精品中文字幕| 在线日韩精品视频| 天天干天天色综合| 91丨porny丨户外露出| 97超碰人人澡| 国产精品美女在线观看直播| 欧美黑人巨大精品一区二区| 精品国产av一区二区| 成人免费在线播放视频| 蜜桃福利午夜精品一区| 欧美激情电影| 成人免费淫片aa视频免费| 日本视频不卡| 在线91免费看| 男的操女的网站| 国产91丝袜在线观看| 激情成人开心网| 中文字幕亚洲在线观看| 欧美激情综合色综合啪啪五月| 亚洲精品久久久久久久久久| 一区二区三区高清在线| 2018国产精品| 99国产精品99久久久久久粉嫩| 国产一区二区精品免费| 英国三级经典在线观看| 国产偷亚洲偷欧美偷精品| 在线看成人av| 91在线视频免费91| 午夜dv内射一区二区| 欧美成人自拍| 3d动漫精品啪啪一区二区三区免费| 国产原创视频在线观看| 午夜精品一区二区三区三上悠亚| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲国产日韩综合久久精品| 污污免费在线观看| 天堂蜜桃一区二区三区| 亚洲一卡二卡三卡| 亚洲成人影音| 欧美性受xxx| 香蕉视频免费在线播放| 欧美一二三区精品| 日韩 国产 在线| 日本一区二区视频在线观看| 99re6在线观看| 影院欧美亚洲| 亚洲一区二区在线免费观看| 日韩在线成人| 国产97人人超碰caoprom| 人人干在线视频| 精品99999| 中文字幕精品一区二| 成人激情免费网站| 少妇黄色一级片| 欧美日韩成人| 青娱乐国产91| 亚洲1区在线| 国产精品视频xxxx| 超免费在线视频| 中文字幕亚洲一区| 日韩中文字幕观看| 亚洲综合一区二区精品导航| 韩国无码一区二区三区精品| 捆绑调教一区二区三区| 精品国产av无码一区二区三区| 久久91麻豆精品一区| 51国偷自产一区二区三区的来源| 美女网站在线看| 久久影视免费观看| 国产视频二区在线观看| 亚洲成人av在线播放| 一区二区美女视频| 日韩欧美在线观看视频| 日本老熟俱乐部h0930| 久久久www免费人成精品| 日本一区二区三区在线免费观看| 久久久久国产一区二区| 国产精品视频二| 2020国产精品极品色在线观看| 日本一本a高清免费不卡| 蜜臀av在线| 欧美成人一区二区三区电影| 国产精品毛片一区二区三区四区| 欧美成人精品福利| 国产又大又黄的视频| 在线精品视频免费播放| 91美女免费看| 亚洲大尺度视频在线观看| 久久免费看少妇高潮v片特黄| 国产日产亚洲精品系列| 美国黄色a级片| 99综合电影在线视频| 亚洲av无一区二区三区久久| 黄色亚洲大片免费在线观看| 午夜啪啪免费视频| 不卡日本视频| 91亚洲va在线va天堂va国| 成人毛片免费| 国产精品极品美女粉嫩高清在线| 涩涩视频在线播放| 午夜精品久久久久久99热软件| 五月婷婷视频在线观看| y97精品国产97久久久久久| 国产麻豆免费视频| 欧美日韩视频在线观看一区二区三区| 三级网站在线播放| 欧美日韩一区二区在线播放| 欧美波霸videosex极品| 久久久久久综合| 亚洲精品国产91| 久久久久久久av麻豆果冻| 一出一进一爽一粗一大视频| 99久免费精品视频在线观看| 中国特级黄色大片| 99久久精品国产导航| 50一60岁老妇女毛片| 99视频精品在线| 泷泽萝拉在线播放| 国产丝袜美腿一区二区三区| 日本二区在线观看| 国产精品系列在线| 中文字幕在线有码| 亚洲国产色一区| 在线观看日本网站| 欧美在线|欧美| 国产视频在线一区| 精品精品国产高清a毛片牛牛| 天天爽夜夜爽夜夜爽| 日韩经典中文字幕| 不卡在线视频| 久久久精品久久| 黑人极品ⅴideos精品欧美棵| 国内精品久久久久久| 91精品论坛| 国产精品一区二区久久久久| 日韩三级久久| 久久综合九色综合网站| 日韩成人精品一区二区| 中文字幕超清在线免费观看| 亚洲小说区图片区| 97视频在线免费播放| 韩国一区二区在线观看| 国产裸体视频网站| 久久综合久久综合久久| 永久免费毛片在线观看| 玉米视频成人免费看| 999这里只有精品| 欧美日韩国产不卡| 深夜视频在线免费| 久久黄色av网站| 成人欧美大片| 91最新在线免费观看| 全球av集中精品导航福利| 亚洲第一在线综合在线| 伊人影院久久| 欧美午夜aaaaaa免费视频| 国产成人精品免费视频网站| a天堂中文字幕| 亚洲一区视频在线| 欧美三级在线免费观看| 午夜激情一区二区三区| 在线观看黄色国产| 日韩av在线一区| 2024最新电影免费在线观看| 日本电影亚洲天堂| 亚洲亚洲一区二区三区| 日韩三级电影网站| 日韩亚洲精品在线| 男人操女人下面视频| 国产欧美日韩中文久久| 日本三级2019| 欧美一区二区三区四区五区| 久久天堂电影| 正在播放亚洲1区| 日韩激情电影免费看| 99精品国产一区二区| 99精品在线| 在线观看高清免费视频| 久久综合九色综合97婷婷女人 | 99久久综合| 成人小视频在线看| kk眼镜猥琐国模调教系列一区二区| 神马久久精品综合| 欧美专区亚洲专区| 激情小视频在线| 欧美一级电影久久| 国产精品极品在线观看| 国产在线观看欧美| 国产精品123区| 9.1在线观看免费| 亚洲色图丝袜美腿| 亚洲一区二区影视| 在线播放日韩欧美| 美女网站视频一区| 日本在线观看一区二区| 国产精品日韩精品欧美精品| 91超薄肉色丝袜交足高跟凉鞋| 亚洲欧美日韩人成在线播放| 亚洲天堂网在线观看视频| 中文字幕精品视频| 久久爱.com| 正在播放精油久久| 经典三级在线一区| 色哟哟一一国产精品| 91精品国产综合久久精品| 免费在线观看黄| 91在线观看免费| 欧美一区亚洲| 极品白嫩的小少妇| 精品久久久在线观看| 五月婷婷六月丁香| 深夜成人在线观看| 国产精品诱惑| 国产又粗又爽又黄的视频| 国产一二精品视频| 91在线播放观看| 精品国产污污免费网站入口| 免费毛片在线看片免费丝瓜视频| 99国内精品久久久久久久软件| 国内综合精品午夜久久资源| 一级欧美一级日韩片| 欧美日韩在线第一页| av福利在线播放| 91在线播放国产| 一本色道久久| 久久成人激情视频| 欧美裸体bbwbbwbbw| 国产鲁鲁视频在线观看特色| 97操在线视频| 国产亚洲永久域名| 欧美亚洲色综久久精品国产| 欧美久久久一区| 黄色大片在线| 欧美日韩国产不卡在线看| 免费观看成人av| 久久久午夜精品福利内容| 精品久久久久久中文字幕| 成人免费在线观看| 91免费视频网站| 99国产精品自拍| 精品人体无码一区二区三区| 91精品麻豆日日躁夜夜躁| 成人av影院在线观看| 日韩国产精品一区二区| 国模一区二区三区白浆| 日本亚洲欧美在线| 日韩一区二区三区国产| 红杏一区二区三区| 久久久精品麻豆| 亚洲午夜久久久久久久久久久 | 久久中文字幕视频| 欧美在线导航| 伊人免费视频二| 色网综合在线观看| 18网站在线观看| 欧美专区一二三| 成人性视频网站| 中文字幕人妻色偷偷久久| 欧美黄色片在线观看| 色综合蜜月久久综合网| 波多野结衣加勒比| 欧美一区二区三区影视| 性欧美gay| 999在线观看视频| 亚洲男人电影天堂|