溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么采用Istio實現(xiàn)灰度發(fā)布

發(fā)布時間:2021-11-15 17:14:08 來源:億速云 閱讀:198 作者:柒染 欄目:云計算

本篇文章為大家展示了怎么采用Istio實現(xiàn)灰度發(fā)布,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

灰度發(fā)布(又名金絲雀發(fā)布)介紹

當(dāng)應(yīng)用上線以后,運維面臨的一大挑戰(zhàn)是如何能夠在不影響已上線業(yè)務(wù)的情況下進(jìn)行升級。做過產(chǎn)品的同學(xué)都清楚,不管在發(fā)布前做過多么完備的自動化和人工測試,在發(fā)布后都會出現(xiàn)或多或少的故障。根據(jù)墨菲定律,可能會出錯的版本發(fā)布一定會出錯。

“ANYTHING THAN CAN GO WRONG WILL GO WRONG” –MURPHY’S LAW

因此我們不能寄希望于在線下測試時發(fā)現(xiàn)所有潛在故障。在無法百分百避免版本升級故障的情況下,需要通過一種方式進(jìn)行可控的版本發(fā)布,把故障影響控制在可以接受的范圍內(nèi),并可以快速回退。

可以通過灰度發(fā)布(又名金絲雀發(fā)布)來實現(xiàn)業(yè)務(wù)從老版本到新版本的平滑過渡,并避免升級過程中出現(xiàn)的問題對用戶造成的影響。

“金絲雀發(fā)布”的來源于礦工們用金絲雀對礦井進(jìn)行空氣測試的做法。以前礦工挖煤的時候,礦工下礦井前會先把金絲雀放進(jìn)去,或者挖煤的時候一直帶著金絲雀。金絲雀對甲烷和一氧化碳濃度比較敏感,會先報警。所以大家都用“金絲雀”來搞最先的測試。

下圖中,左下方的少部分用戶就被當(dāng)作“金絲雀”來用于測試新上線的1.1版本。如果新版本出現(xiàn)問題,“金絲雀”們會報警,但不會影響其他用戶業(yè)務(wù)的正常運行。

怎么采用Istio實現(xiàn)灰度發(fā)布

灰度發(fā)布(金絲雀發(fā)布)的流程如下:

  • 準(zhǔn)備和生產(chǎn)環(huán)境隔離的“金絲雀”服務(wù)器。

  • 將新版本的服務(wù)部署到“金絲雀”服務(wù)器上。

  • 對“金絲雀”服務(wù)器上的服務(wù)進(jìn)行自動化和人工測試。

  • 測試通過后,將“金絲雀”服務(wù)器連接到生產(chǎn)環(huán)境,將少量生產(chǎn)流量導(dǎo)入到“金絲雀”服務(wù)器中。

  • 如果在線測試出現(xiàn)問題,則通過把生產(chǎn)流量從“金絲雀”服務(wù)器中重新路由到老版本的服務(wù)的方式進(jìn)行回退,修復(fù)問題后重新進(jìn)行發(fā)布。

  • 如果在線測試順利,則逐漸把生產(chǎn)流量按一定策略逐漸導(dǎo)入到新版本服務(wù)器中。

  • 待新版本服務(wù)穩(wěn)定運行后,刪除老版本服務(wù)。

Istio實現(xiàn)灰度發(fā)布(金絲雀發(fā)布)的原理

從上面的流程可以看到,如果要實現(xiàn)一套灰度發(fā)布的流程,需要應(yīng)用程序和運維流程對該發(fā)布過程進(jìn)行支持,工作量和難度的挑戰(zhàn)是非常大的。雖然面對的問題類似,但每個企業(yè)或組織一般采用不同的私有化實現(xiàn)方案來進(jìn)行灰度發(fā)布,為解決該問題導(dǎo)致研發(fā)和運維花費了大量的成本。

Istio通過高度的抽象和良好的設(shè)計采用一致的方式解決了該問題,采用sidecar對應(yīng)用流量進(jìn)行了轉(zhuǎn)發(fā),通過Pilot下發(fā)路由規(guī)則,可以在不修改應(yīng)用程序的前提下實現(xiàn)應(yīng)用的灰度發(fā)布。

備注:采用kubernetes的滾動升級(rolling update)功能也可以實現(xiàn)不中斷業(yè)務(wù)的應(yīng)用升級,但滾動升級是通過逐漸使用新版本的服務(wù)來替換老版本服務(wù)的方式對應(yīng)用進(jìn)行升級,在滾動升級不能對應(yīng)用的流量分發(fā)進(jìn)行控制,因此無法采用受控地把生產(chǎn)流量逐漸導(dǎo)流到新版本服務(wù)中,也就無法控制服務(wù)升級對用戶造成的影響。

采用Istio后,可以通過定制路由規(guī)則將特定的流量(如指定特征的用戶)導(dǎo)入新版本服務(wù)中,在生產(chǎn)環(huán)境下進(jìn)行測試,同時通過漸進(jìn)受控地導(dǎo)入生產(chǎn)流量,可以最小化升級中出現(xiàn)的故障對用戶的影響。并且在同時存在新老版本服務(wù)時,還可根據(jù)應(yīng)用壓力對不同版本的服務(wù)進(jìn)行獨立的縮擴容,非常靈活。采用Istio進(jìn)行灰度發(fā)布的流程如下圖所示:

0?wx_fmt=png

操作步驟

下面采用Istion自帶的BookinfoInfo示例程序來試驗灰度發(fā)布的流程。

測試環(huán)境安裝

首先參考手把手教你從零搭建Istio及Bookinfo示例程序安裝Kubernetes及Istio控制面。

因為本試驗并不需要安裝全部3個版本的reviews服務(wù),因此如果已經(jīng)安裝了該應(yīng)用,先采用下面的命令卸載。

istio-0.2.10/samples/bookinfo/kube/cleanup.sh

部署V1版本的服務(wù)

首先只部署V1版本的Bookinfo應(yīng)用程序。由于示例中的yaml文件中包含了3個版本的reviews服務(wù),我們先將V2和V3版本的Deployment從yaml文件istio-0.2.10/samples/bookinfo/kube/bookinfo.yaml中刪除。

從Bookinfo.yaml中刪除這部分內(nèi)容:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: reviews-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: reviews
        version: v2
    spec:
      containers:
      - name: reviews
        image: istio/examples-bookinfo-reviews-v2:0.2.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: reviews-v3
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: reviews
        version: v3
    spec:
      containers:
      - name: reviews
        image: istio/examples-bookinfo-reviews-v3:0.2.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080    
---

部署V1版本的Bookinfo程序。

kubectl apply -f <(istioctl kube-inject -f istio-0.2.10/samples/bookinfo/kube/bookinfo.yaml)

通過kubectl命令行確認(rèn)pod部署,可以看到只有V1版本的服務(wù)。

kubectl get pods

NAME                              READY     STATUS    RESTARTS   AGE
details-v1-3688945616-nhkqk       2/2       Running   0          2m
productpage-v1-2055622944-m3fql   2/2       Running   0          2m
ratings-v1-233971408-0f3s9        2/2       Running   0          2m
reviews-v1-1360980140-0zs9z       2/2       Running   0          2m

在瀏覽器中打開應(yīng)用程序頁面,地址為istio-ingress的External IP。由于V1版本的reviews服務(wù)并不會調(diào)用rating服務(wù),因此可以看到Product 頁面顯示的是不帶星級的評價信息。

http://10.12.25.116/productpage

怎么采用Istio實現(xiàn)灰度發(fā)布

此時系統(tǒng)中微服務(wù)的部署情況如下圖所示(下面的示意圖均忽略和本例關(guān)系不大的details和ratings服務(wù)):

0?wx_fmt=png

部署V2版本的reviews服務(wù)

在部署V2版本的reviews服務(wù)前,需要先創(chuàng)建一條缺省路由規(guī)則route-rule-default-reviews.yaml,將所有生產(chǎn)流量都導(dǎo)向V1版本,避免對線上用戶的影響。

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: reviews-default
spec:
  destination:
    name: reviews
  precedence: 1
  route:
  - labels:
      version: v1

啟用該路由規(guī)則。

istioctl create -f route-rule-default-reviews.yaml -n default

創(chuàng)建一個V2版本的部署文件bookinfo-reviews-v2.yaml,內(nèi)容如下

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: reviews-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: reviews
        version: v2
    spec:
      containers:
      - name: reviews
        image: istio/examples-bookinfo-reviews-v2:0.2.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080

部署V2版本的reviews服務(wù)。

kubectl apply -f <(istioctl kube-inject -f  bookinfo-reviews-v2.yaml)

此時系統(tǒng)中部署了V1和V2兩個版本的reviews服務(wù),但所有的業(yè)務(wù)流量都被規(guī)則reviews-default導(dǎo)向了V1,如下圖所示:

怎么采用Istio實現(xiàn)灰度發(fā)布

將測試流量導(dǎo)入到V2版本的reviews服務(wù)

在進(jìn)行模擬測試時,由于測試環(huán)境和生產(chǎn)環(huán)境的網(wǎng)絡(luò),服務(wù)器,操作系統(tǒng)等環(huán)境存在差異,很難完全模擬生產(chǎn)環(huán)境進(jìn)行測試。為了減少環(huán)境因素的對測試結(jié)果的影響,我們希望能在生產(chǎn)環(huán)境中進(jìn)行上線前的測試,但如果沒有很好的隔離措施,可能會導(dǎo)致測試影響已上線的業(yè)務(wù),對企業(yè)造成損失。

通過采用Istio的路由規(guī)則,可以在類生產(chǎn)環(huán)境中進(jìn)行測試,又完全隔離了線上用戶的生產(chǎn)流量和測試流量,最小化模擬測試對已上線業(yè)務(wù)的影響。如下圖所示:

0?wx_fmt=png

創(chuàng)建一條規(guī)則,將用戶名為 test-user 的流量導(dǎo)入到V2

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: reviews-test-user
spec:
  destination:
    name: reviews
  precedence: 2
  match:
    request:
      headers:
        cookie:
          regex: "^(.*?;)?(user=test-user)(;.*)?$"
  route:
  - labels:
      version: v2

注意:precedence屬性用于設(shè)置規(guī)則的優(yōu)先級,在同時存在多條規(guī)則的情況下,優(yōu)先級高的規(guī)則將先執(zhí)行。這條規(guī)則的precedence設(shè)置為2,以確保其在缺省規(guī)則之前運行,將test-user用戶的請求導(dǎo)流到V2版本reviews服務(wù)中。

啟用該規(guī)則。

istioctl create -f route-rule-test-reviews-v2.yaml -n default

以test-user用戶登錄,可以看到V2版本帶星級的評價頁面。

怎么采用Istio實現(xiàn)灰度發(fā)布注銷test-user,只能看到V1版本不帶星級的評價頁面。如下圖所示:0?wx_fmt=png

將部分生產(chǎn)流量導(dǎo)入到V2版本的reviews服務(wù)

在線上模擬測試完成后,如果系統(tǒng)測試情況良好,可以通過規(guī)則將一部分用戶流量導(dǎo)入到V2版本的服務(wù)中,進(jìn)行小規(guī)模的“金絲雀”測試。

修改規(guī)則route-rule-default-reviews.yaml,將50%的流量導(dǎo)入V2版本。

備注:本例只是描述原理,因此為簡單起見,將50%流量導(dǎo)入V2版本,在實際操作中,更可能是先導(dǎo)入較少流量,然后根據(jù)監(jiān)控的新版本運行情況將流量逐漸導(dǎo)入,如采用5%,10%,20%,50% …的比例逐漸導(dǎo)入。

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: reviews-default
spec:
  destination:
    name: reviews
  precedence: 1
  route:
  - labels:
      version: v1
    weight: 50
  - labels:
      version: v2
    weight: 50
istioctl replace -f route-rule-default-reviews.yaml -n default

此時系統(tǒng)部署如下圖所示:

怎么采用Istio實現(xiàn)灰度發(fā)布

將所有生產(chǎn)流量導(dǎo)入到到V2版本的reviews服務(wù)

如果新版本的服務(wù)運行正常,則可以將所有流量導(dǎo)入到V2版本。

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: reviews-default
spec:
  destination: 
    name: reviews
  precedence: 1
  route:
  - labels:
      version: v2
    weight: 100
istioctl replace -f route-rule-default-reviews.yaml -n default

系統(tǒng)部署如下圖所示:

怎么采用Istio實現(xiàn)灰度發(fā)布

備注:如果灰度發(fā)布的過程中新版本的服務(wù)出現(xiàn)問題,則可以通過修改路由規(guī)則,將流量重新導(dǎo)入到V1版本的服務(wù)中,將V2版本故障修復(fù)后再進(jìn)行測試。

刪除V1版本的reviews服務(wù)

待V2版本上線穩(wěn)定運行后,刪除V1版本的reviews服務(wù)和測試規(guī)則。

kubectl delete pod reviews-v1-1360980140-0zs9z

istioctl delete -f route-rule-test-reviews-v2.yaml -n default

上述內(nèi)容就是怎么采用Istio實現(xiàn)灰度發(fā)布,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI