<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Istio 流量管理之故障注入

          共 8095字,需瀏覽 17分鐘

           ·

          2021-07-28 09:11

          對(duì)于一個(gè)系統(tǒng),尤其是一個(gè)復(fù)雜的系統(tǒng),重要的不是故障會(huì)不會(huì)發(fā)生,而是什么時(shí)候發(fā)生。故障處理對(duì)于開(kāi)發(fā)人員和測(cè)試人員來(lái)說(shuō)都特別耗費(fèi)時(shí)間和精力:對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),他們?cè)陂_(kāi)發(fā)代碼時(shí)需要用20%的時(shí)間寫80%的主要邏輯,然后留出80%的時(shí)間處理各種非正常場(chǎng)景;對(duì)于測(cè)試人員來(lái)說(shuō),除了需要用80%的時(shí)間寫20%的異常測(cè)試項(xiàng),更要用超過(guò)80%的時(shí)間執(zhí)行這些異常測(cè)試項(xiàng),并構(gòu)造各種故障場(chǎng)景,尤其是那種理論上才出現(xiàn)的故障,讓人苦不堪言。

          故障注入是一種評(píng)估系統(tǒng)可靠性的有效方法,例如異常處理、故障恢復(fù)等。只有當(dāng)系統(tǒng)的所有服務(wù)都經(jīng)過(guò)故障測(cè)試且具備容錯(cuò)能力時(shí),整個(gè)應(yīng)用才健壯可靠。故障注入從方法上來(lái)說(shuō)有編譯期故障注入和運(yùn)行期故障注入,前者要通過(guò)修改代碼來(lái)模擬故障,后者在運(yùn)行階段觸發(fā)故障。Istio 的故障注入就是在網(wǎng)格中對(duì)特定的應(yīng)用層協(xié)議進(jìn)行故障注入,這樣,基于 Istio 的故障注入就可以模擬出應(yīng)用的故障場(chǎng)景了。

          接下來(lái)我們就來(lái)說(shuō)明如何注入故障并測(cè)試應(yīng)用程序的彈性。

          延遲故障注入

          為了測(cè)試微服務(wù)應(yīng)用程序 Bookinfo 的彈性,我們將為用戶 jason 在 reviews:v2ratings 服務(wù)之間注入一個(gè) 7 秒的延遲,這個(gè)測(cè)試將會(huì)發(fā)現(xiàn)一個(gè)故意引入 Bookinfo 應(yīng)用程序中的 bug。

          首先移除之前創(chuàng)建的 VirtualService:

          ?  ~ kubectl delete virtualservice reviews
          virtualservice.networking.istio.io "reviews" deleted
          ?  ~ kubectl get virtualservice
          NAME       GATEWAYS             HOSTS   AGE
          bookinfo   [bookinfo-gateway]   [*]     16d

          為了能夠讓請(qǐng)求穩(wěn)定,這里我們對(duì) Reviews 服務(wù)配置請(qǐng)求路由,對(duì)應(yīng)的資源清單文件 samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

          apiVersion: networking.istio.io/v1alpha3
          kind: VirtualService
          metadata:
            name: reviews
          spec:
            hosts:
              - reviews
            http:
            - match:
              - headers:
                  end-user:
                    exact: jason
              route:
              - destination:
                  host: reviews
                  subset: v2
            - route:
              - destination:
                  host: reviews
                  subset: v1

          上面的配置應(yīng)用過(guò)后 jason 用戶會(huì)被路由到 reviews:v2 版本服務(wù),其他用戶路由到 reviews:v1 版本服務(wù)。創(chuàng)建故障注入規(guī)則以延遲來(lái)自測(cè)試用戶 jason 的流量,對(duì)應(yīng)的資源清單為 samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml

          apiVersion: networking.istio.io/v1alpha3
          kind: VirtualService
          metadata:
            name: ratings
          spec:
            hosts:
            - ratings
            http:
            - match:
              - headers:
                  end-user:
                    exact: jason
              fault:
                delay:
                  percentage:
                    value: 100.0
                  fixedDelay: 7s
              route:
              - destination:
                  host: ratings
                  subset: v1
            - route:
              - destination:
                  host: ratings
                  subset: v1

          這個(gè) VirtualService 定義了一個(gè)在 jason 登錄的情況下,訪問(wèn) ratings 服務(wù)的 100% 的 7s 訪問(wèn)延遲。前面我們知道,Bookinfo 這個(gè)示例 productpage 服務(wù)調(diào)用 reviews,reviews 的不同版本會(huì)對(duì) ratings 進(jìn)行不同的調(diào)用,其中 reviews-v1 不調(diào)用 ratings,reviews-v2 和 reviews-v3 會(huì)調(diào)用 ratings,并做不同樣式的渲染。注意 reviews:v2 服務(wù)對(duì) ratings 服務(wù)的調(diào)用具有 10 秒的硬編碼連接超時(shí)。因此,盡管引入了 7 秒的延遲,我們?nèi)匀黄谕说蕉说牧鞒淌菦](méi)有任何錯(cuò)誤的。

          了解這一點(diǎn)后,我們現(xiàn)在來(lái)創(chuàng)建上面的 VirtualService 資源對(duì)象:

          ?  ~ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
          ?  ~ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
          virtualservice.networking.istio.io/ratings created
          ?  ~ kubectl get virtualservice
          NAME       GATEWAYS               HOSTS         AGE
          bookinfo   ["bookinfo-gateway"]   ["*"]         6d23h
          ratings                           ["ratings"]   23m
          reviews                           ["reviews"]   4s

          通過(guò)瀏覽器打開(kāi) Bookinfo 應(yīng)用,使用用戶 jason 登錄到 /productpage 頁(yè)面。我們期望的是 Bookinfo 主頁(yè)在大約 7 秒鐘加載完成并且沒(méi)有錯(cuò)誤,但是 Reviews 部分顯示了一個(gè)錯(cuò)誤消息:Sorry, product reviews are currently unavailable for this book.

          reviews unavailable

          而且我們可以看到頁(yè)面加載實(shí)際上用了大約6s,按照預(yù)期,我們引入的 7s 延遲不會(huì)影響到 reviews 服務(wù),因?yàn)?reviews 和 ratings 服務(wù)間的超時(shí)被硬編碼為 10 秒,但實(shí)際上在 productpage 和 reviews 服務(wù)之間也有一個(gè) 3s 的硬編碼的超時(shí),再加 1 次重試,一共 6s,所以 productpage 對(duì) reviews 的調(diào)用在 6s 后提前超時(shí)并拋出錯(cuò)誤了。

          這種類型的錯(cuò)誤在不同的團(tuán)隊(duì)獨(dú)立開(kāi)發(fā)不同的微服務(wù)的企業(yè)應(yīng)用程序中是可能會(huì)出現(xiàn)的,Istio 的故障注入規(guī)則可以幫助我們識(shí)別此類異常,而不會(huì)影響最終用戶。

          請(qǐng)注意,此次故障注入限制為僅影響用戶 jason,如果你以任何其他用戶身份登錄,則不會(huì)遇到任何延遲。

          我們可以增加 productpage 與 reviews 服務(wù)之間的超時(shí)或降低 reviews 與 ratings 的超時(shí)來(lái)解決這個(gè)問(wèn)題,在 reviews 服務(wù)的 v3 版本中已經(jīng)修復(fù)了這個(gè)問(wèn)題,reviews:v3 服務(wù)已將 reviews 與 ratings 的超時(shí)時(shí)間從 10s 降低為 2.5s,因此它可以兼容(小于)下游的 productpage 的請(qǐng)求。

          如果我們將上面 Reviews 的流量轉(zhuǎn)移到 reviews:v3 服務(wù),然后可以嘗試修改延遲規(guī)則為任何低于 2.5s 的數(shù)值,例如 2s,然后可以確認(rèn)端到端的流程沒(méi)有任何錯(cuò)誤。

          通過(guò)這種超時(shí)故障注入,可以幫助我們方便地發(fā)現(xiàn)服務(wù)間相互訪問(wèn)中存在的潛在問(wèn)題。

          中斷訪問(wèn)故障注入

          測(cè)試微服務(wù)彈性的另一種方法是引入 HTTP abort 故障,接下來(lái)我們將給 ratings 微服務(wù)為測(cè)試用戶 jason 引入一個(gè) HTTP abort。在這種情況下,我們希望頁(yè)面能夠立即加載,同時(shí)顯示 Ratings service is currently unavailable 這樣的消息。

          這里我們需要使用到的資源清單文件為 samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml

          apiVersion: networking.istio.io/v1alpha3
          kind: VirtualService
          metadata:
            name: ratings
          spec:
            hosts:
            - ratings
            http:
            - match:
              - headers:
                  end-user:
                    exact: jason
              fault:
                abort:
                  percentage:
                    value: 100.0
                  httpStatus: 500
              route:
              - destination:
                  host: ratings
                  subset: v1
            - route:
              - destination:
                  host: ratings
                  subset: v1

          上面這個(gè) VirtualService 資源對(duì)象配置了在 jason 登錄時(shí),reviews 對(duì) ratings 訪問(wèn)時(shí) 100% 的返回一個(gè)500錯(cuò)誤響應(yīng)。然后創(chuàng)建這個(gè)資源對(duì)象:

          ?  ~ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
          virtualservice.networking.istio.io/ratings created
          ?  ~ kubectl get virtualservice
          NAME       GATEWAYS               HOSTS         AGE
          bookinfo   ["bookinfo-gateway"]   ["*"]         7d
          ratings                           ["ratings"]   68m
          reviews                           ["reviews"]   44m

          現(xiàn)在我們回到 BookInfo 應(yīng)用,登錄 jason,刷新頁(yè)面,有時(shí)候可以很快就看到 Rating 服務(wù)不可用的提示信息:

          bookinfo error

          如果注銷用戶 jason,我們將看到 /productpage 為除 jason 以外的其他用戶調(diào)用了 reviews:v1(完全不調(diào)用 ratings),因此,不會(huì)看到任何錯(cuò)誤消息,不會(huì)顯示星標(biāo)的圖形。

          K8S 進(jìn)階訓(xùn)練營(yíng)


           點(diǎn)擊屏末  | 即刻學(xué)習(xí)


          掃描二維碼獲取

          更多云原生知識(shí)





          k8s 技術(shù)圈

          瀏覽 81
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  搜一搜小美女操逼 | 特黄录像 | 亚洲一卡二卡 | 国产毛片在线视频 | 欧美性爱娱乐网 |