Istio之如何用Isito實現智慧型路由配置

2021-12-30 06:03:51 字數 3011 閱讀 3781

要介紹istio請求路由,我們不由得先從pilot 和 envoy開始談起。 在服務網格中,pilot管理和配置所有的envoy例項。在pilot中,你幾乎可以配置所有的關於流量導向規則及其他故障恢復規則。而envoy不僅會獲得從pilot拿到的基本負載均衡資訊,同時週期性的健康檢查,也會告訴所有的envoy其他的例項現在的執行狀況。負載均衡資訊,及健康檢查的資訊可以使envoy更加智慧型的去分發流量。

在上述的pilot結構中,不難理解,platform adapter作為平台介面卡,可以使istio順利的在任何平台下工作。envoy api則提供動態更新資訊,服務發現及配置路由規則的功能。

請求路由

在istio中,envoy的存在為流入及流出的流量提供了可控和可視的基本條件。envoy根據所維護的資訊對請求流量的一方面有利於平衡各個pod的工作量,保證不會存在極端情況而是「雨露均沾」。另一方面,envoy對請求流量的分發,從使用者角度來講是無感知的。

如圖中,使用者通過某個位址來訪問服務a,服務a的envoy實時發現了網格內存在的服務b,並且根據既定的**規則來分發流量(1%流入pod4訪問b』版本其餘99%根據負載均衡資訊流入pod1-pod3訪問b版本)。也正是envoy掛在服務外部的這一設計,方便開發和運維人員進行故障測試,熔斷以及實時監控。

virtualservice & destinationrule

virtualservice

virtualservice中主要是定義了請求的路由規則,當某個請求滿足了先前預設的路有條件,那麼這個請求就會路由至預設的服務。我們看乙個簡單的virtualservice例子:

在這個virtualservice中,綠色範圍內的host有兩條內容,第一條是服務的短名稱,實際上這個名稱是省略後的fqdn,這裡的全稱應當是reviews.default.svc.cluster.local

中間標紅的是規則所在的namespace,而不是reviews所在的namespace。第二條則是配置給reviews元件的通過負載均衡訪問的位址。部分則是路由位址,其中的subset對應的是服務中的版本。

destinationrule

destinationrule是路由後的流量訪問策略,訪問策略包含負載均衡演算法,熔斷等限制。下圖是乙個destinationrule的例子:

部分很顯然是服務的兩個版本。綠色部分的意義是trafficpolicy,裡面配置的是負載均衡演算法設定為最小連線數,當兩個主機提供服務時,會自動選擇連線數最小的主機。我們也可以在這裡配置連線池,tls連線,埠級別策略,自動移除不健康主機等設定。

連線池管理

連線池配置給上游主機,這意味著該主機所有獲取到來自envoy的鏈結請求,都要遵循配置好的連線池原則,這些原則既可以配在tcp層也可以配在http層。

http連線池配置

http1maxpendingrequests: 到目標主機最大等待請求數,如果不設定預設是1024,這是針對http1.1設定的,對於http2因為不會將請求放入佇列所以不受影響。

http2maxrequests: 對後端的最大請求數量,不設定會預設為1024、

maxrequestsperconnection: 每次連線最大的請求數,如果這個屬性值設為1,那麼每次連線最多傳送乙個請求,也就是無法保持連線。

maxretries: 最大重試次數。

tcp連線池配置

maxconnections: 最大連線數,但是只作用於http1.1也不作用於http2,因為後者只建立一次連線。

connectiontimeout: tcp連線超時

負載均衡器配置

負載均衡概述

負載均衡有兩種:基於負載均衡演算法和基於一致性雜湊。對於基於負載均衡演算法的配置十分簡便,只要在******lb配上響應的字段即可。

基於一致性雜湊的負載均衡方式可以根據http header,cookie來提供soft session affinity,但是這種負載均衡方式僅支援http連線。

負載均衡樣例

負載均衡策略配置十分靈活,可以針對某個服務進行配置,配置後隸屬於該服務的所有pod將會按照設定的負載均衡方式進行請求的分配,除此之外,istio也允許使用者進行更深一層的配置,對於服務中的版本進行負載均衡配置的。配置後符合該版本的pod 將會按照深層配置的負載均衡模式進行分配,其餘的則還按服務層面的負載均衡模式進行分配。下面我們根據乙個例項來看這種情況。

如圖所示,綠色的內容是針對服務層面設定的負載均衡方式,如果請求了ratings這個服務那麼預設將會採用最小連線數這個負載均衡方式,如果請求訪問這個服務需要的是v3版本這時候版本級的負載均衡方式將會覆蓋服務級的負載均衡方式,這時則會使用round_robin的方式。不同層級的負載均衡設定可以讓操作者更加細化自身的服務設計。

總結本文只介紹了很小一部分istio請求路由的內容,其靈活的配置,非侵入式的設計,跨平台的支援極大地提公升了開發效率,降低了測試難度。深入理解virtualservice,destinationrule等是使用istio功能的基本前提,熟練使用連線池和負載均衡配置可以在有限資源的前提下最大化的提公升應用效能。

python實現多型 如何用python實現多型性

建立乙個名為 func 的函式,它將獲取乙個我們將其命名為 obj 的物件。雖然我們使用的名稱是 obj 但是任何例項化的物件都可以被呼叫到這個函式中。用函式實現多型性 class india def capital self print new delhi is the capital of in...

諾基亞娛樂部門如何用DevOps補敏捷之不足

這會使人產生疑問,既然敏捷看上去擁有一切,為什麼devops會獲得如此多的關注,john clapham如是說。他是位於布里斯托的諾基亞娛樂部門的一名軟體開發經理。敏捷有宣言和原則,它側重於人 明確的利益相關者 更快地交付和客戶滿意度,那麼為什麼還需要devops呢?在財務部門和複雜環境的敏捷方法會...

1 如何用好Asser之嵌入更多的資訊。

首先申明這部分關於assert的用法來自 遊戲程式設計精粹 一書,我只是乙個搬運工,讓在這裡好好的與大家分享。當然也會有自己的一些心得。asser巨集的缺點就是無法告訴你太多的資訊,如果你只是這樣使用 assert point null 那麼你很有可能找不到出錯的地方,有乙個簡單的小辦法,可以幫助你...