微服務運維減負:Istio Service Mesh原理+實戰

王青,JFrog中國首席架構師,曾在新浪、愛奇藝、IBM、HPE、VIPKID從事架構研發與諮詢,曾在中興通訊、宜人貸、順豐、易保科技等大型企業從事DevOps落地。專注於微服務架構、持續集成、持續交付、DevOps、容器化平臺建設等等。

一、Istio的來源

微服務運維減負:Istio Service Mesh原理+實戰

隨著微服務架構的普及,越來越多的應用已經拆分成了微服務的架構。而微服務架構落地的一個難點,就是如何讓服務和服務之間進行穩定的通信。

微服務運維減負:Istio Service Mesh原理+實戰

部署微服務之後,如何做服務的負載均衡、容錯性、服務監控、日誌追蹤以及熔斷等功能都需要考慮周全。

微服務運維減負:Istio Service Mesh原理+實戰

還好,現在已經有很多開源工具幫你做這樣的事情。例如:

  • Netflix的Eureka實現服務註冊,它的優勢在於實現跨數據中心的服務註冊;

  • Ribbon – 客戶端的負載均衡;

  • Hystrix – 微服務的熔斷器;

  • Zipkin – 分佈式的追蹤組件;

  • Prometheus – 監控組件;

  • Grafana – 數據可視化的工具;

  • ……

微服務運維減負:Istio Service Mesh原理+實戰

於是,在寫完我的微服務之後,我引入了更多的組件,帶來了極大的部署複雜度,每個組件都需要高可用、負載均衡、熔斷、日誌收集等等。

為了讓業務團隊返璞歸真,將所有精力集中在業務代碼而不是配合微服務組件寫大量非功能性需求的代碼,Istio應運而生。

微服務運維減負:Istio Service Mesh原理+實戰

Istio是谷歌、IBM、Lyft等公司貢獻的開源Service Mesh組件。它實現的目標就是讓業務開發不再關注微服務之間如何調用、管理、監控等非功能性需求,而是讓Istio來處理這些問題。Istio和Kubernetes有天然的支持。

Istio能輕鬆解決藍綠髮布和金絲雀發佈的問題。

金絲雀發佈有什麼用?它的最大實際意義,是讓運維不用在夜裡加班上線,而是能夠在白天工作時間進行上線。先上線1%的節點,如果失敗了,立刻回滾。稍後會詳細解釋Istio如何支持藍綠髮布、金絲雀發佈。

微服務運維減負:Istio Service Mesh原理+實戰

Istio提供Control Plane,讓服務和服務之間能夠實現實時請求,並且支持了自定義的路由規則、重試機制、熔斷機制、性能監控以及追蹤。而之前這些事情都是由程序員處理(Spring Cloud組件)。

微服務運維減負:Istio Service Mesh原理+實戰

使用Istio之後,再來看我們的微服務組件架構圖,你會發現,之前的API網關、服務註冊中心、負載均衡、熔斷等組件都不需要了,這些都由Istio來處理。

沒錯,Istio就是要來取代部門Spring Cloud的功能。

微服務運維減負:Istio Service Mesh原理+實戰

所以你的微服務會只剩下服務本身和一個代理(SideCar)。Istio使用Envoy作為代理實現服務的動態發現、負載均衡、熔斷等等。Envoy是基於C++開發的4/7層代理。

微服務運維減負:Istio Service Mesh原理+實戰

在Kubernetes集群裡,你可以為每個微服務通過一個Policy文件描述代理服務,Istio Pilot會統一收集所有的代理註冊信息,用來進行服務之間的請求調度。Istio的調度機制如下:

  • Service Mesh解析所有的請求,並把這些請求發送到本地的代理;

  • 負載均衡會將請求分發到某個代理實例;

  • 代理實例會進行檢查,例如ACL、Quota等等;

  • 如果成功,目標服務返回結果給請求調用者。

微服務運維減負:Istio Service Mesh原理+實戰

所有的服務追蹤信息可以統一通過Istio Mixer進行收集,併發送到Prometheus,用Grafana進行數據可視化展示。

二、Istio實戰

微服務運維減負:Istio Service Mesh原理+實戰

先實現一個最簡單的微服務,上述代碼啟動了一個最簡單的HTTP服務器,註冊了"/meet"路徑,訪問這個服務即開始Sleep 250毫秒。這個服務啟動和一個會議服務。

微服務運維減負:Istio Service Mesh原理+實戰

再實現一個微服務,這個微服務啟動HTTP客戶端,註冊"/work",實現對會議服務的訪問。

OK,就這樣,我們搭建了兩個“微小的”微服務。並且,它實現了服務和服務之間的調用。我們將看看使用Istio如何實現服務和服務之間的智能調用。

在這裡我們為Work服務建立兩個版本的Docker鏡像,做藍綠髮布。默認情況下,當我們把V1版本的服務和V2版本的服務都運行起來,Kubernetes會將流量均勻的分配到這兩個實例。

微服務運維減負:Istio Service Mesh原理+實戰

如上圖所示,同一個請求,返回的結果不同,V1版本返回的是4個會議,V2版本返回的是8個會議。

假設Work V2版本的服務有問題,我們:

  • 如何動態的將流量都切換到Meeting服務的V1版本?

微服務運維減負:Istio Service Mesh原理+實戰

只要執上面的行istioctl create –f route-to-v1.yaml 文件,即可實現將所有的流量都切換到V1版本。

微服務運維減負:Istio Service Mesh原理+實戰

如下圖所示:

微服務運維減負:Istio Service Mesh原理+實戰

  • 如何實現自動重試?

微服務運維減負:Istio Service Mesh原理+實戰

如果服務出現503錯誤,此時再讓服務接受請求,會造成服務的雪崩。這時,你可能的選擇是讓服務30秒之後再接受請求,而不是在線程數量達到峰值的時候仍然接受請求。

  • 如何實現熔斷?

微服務運維減負:Istio Service Mesh原理+實戰

Spring Cloud提供的Hystrix作為熔斷的工具,在Istio裡,你可以定義你的CircuitBreaker的策略。比如,如果服務出現不能訪問的情況,你可以允許服務出現連續5次錯誤,並且設置最大併發連接數為100,當連接數達到這個數目時,Istio不會將流量導入到這個服務裡。

  • 如何追蹤服務的調用棧?

微服務運維減負:Istio Service Mesh原理+實戰

使用Zipkin可以將服務的調用棧可視化,可以在這裡發現,在服務調用之間有Istio-Mixer進行了服務的Check操作,此操作耗時大概1毫秒,它處理該目標服務是否符合Istio的路由規則,如果通過,則運維目標服務進行請求的處理,並返回給調用方。

  • 如何根據客戶端的特徵進行藍綠髮布?

例如,將所有Chrome的客戶端請求都分發到V2版本,剩下的請求發送到V1版本?

微服務運維減負:Istio Service Mesh原理+實戰

你可以在你的Istio路由規則裡配置根據User-Agent的關鍵字,做流量的規劃,而不需要修改任何應用的代碼。執行“Istio apply -f”之後可以看到以下效果:

微服務運維減負:Istio Service Mesh原理+實戰

Chrome的用戶看到的是V2版本,而非Chrome的用戶仍然看到的是老版本,這樣就能輕鬆實現藍綠髮布。而通過配置本次發佈的節點數,能夠智能地讓Istio來分配比如2%的流量給V2版本,做金絲雀發佈的驗證,如果成功了,再自動進行10%節點的升級和流量調度。

三、總結

微服務運維減負:Istio Service Mesh原理+實戰

Istio基本實現了Spring Cloud的很多非功能性的需求,如果是將微服務部署到Kubernetes集群,你可以使用Istio來簡化你的Spring Cloud組件,為你的微服務運維減輕負擔,讓業務團隊將更多的精力放在業務代碼上。

如果想快速試用Istio,最好的方法是使用Kubernetes Helm Chart進行一鍵Istio部署:"helm install incubator/istio",即可在你的Kubernetes集群裡部署Istio服務。

  • https://www.youtube.com/watch?v=AGztKw580yQ&t=1893s

  • https://istio.io/


分享到:


相關文章: