前言
這篇文章屬于純理論,所含內(nèi)容如下,按需閱讀:
Istio概念、服務(wù)網(wǎng)格、流量管理、istio架構(gòu)(Envoy、Sidecar 、Istiod)虛擬服務(wù)(VirtualService)、路由規(guī)則、目標(biāo)規(guī)則(DestinationRule)-
網(wǎng)關(guān)(Gateway)、網(wǎng)絡(luò)彈性和測試(超時(shí)、重試、熔斷器、故障注入)
Istio是什么?
Istio是一個(gè)開源的
服務(wù)網(wǎng)格,透明的接入到分布式服務(wù)中。它也是一個(gè)平臺,集成任何日志、遙測和策略系統(tǒng)的 API 接口。Istio 成功高效地運(yùn)行
分布式微服務(wù)架構(gòu),并提供保護(hù)、連接和監(jiān)控微服務(wù)的統(tǒng)一方法。Istio 有助于降低
DevOps壓力、開發(fā)團(tuán)隊(duì)的壓力。
服務(wù)網(wǎng)格是什么?
- 組成
微服務(wù)網(wǎng)絡(luò) - 實(shí)現(xiàn)
服務(wù)之間的交互
應(yīng)用場景
服務(wù)發(fā)現(xiàn)、負(fù)載均衡、故障恢復(fù)、度量和監(jiān)控A/B 測試、金絲雀發(fā)布、速率限制、訪問控制和端到端認(rèn)證
為什么使用Istio?
服務(wù)網(wǎng)格是通過sidecar(邊車)代理服務(wù)實(shí)現(xiàn),控制平面主要是對sidecar的配置和管理,這包括:
- 為
HTTP、gRPC、WebSocket和TCP 流量自動(dòng)負(fù)載均衡。 - 通過豐富的
路由規(guī)則、重試、故障轉(zhuǎn)移和故障注入對流量行為進(jìn)行細(xì)粒度控制。 - 可插拔的策略層和配置 API,支持
訪問控制、速率限制和配額。 - 集群內(nèi)(包括集群的入口和出口)所有流量的
自動(dòng)化度量、日志記錄和追蹤。 - 在具有強(qiáng)大的基于
身份驗(yàn)證和授權(quán)的集群中實(shí)現(xiàn)安全的服務(wù)間通信。
Istio還支持?jǐn)U展,滿足你部署需求!
流量管理介紹
Istio流量路由規(guī)則可以很容易的
控制服務(wù)之間的流量和API調(diào)用。能實(shí)現(xiàn)A/B測試、金絲雀發(fā)布、基于流量百分比發(fā)布。開箱即用的
故障恢復(fù)特性,有助于增強(qiáng)應(yīng)用的健壯性,從而更好地應(yīng)對被依賴的服務(wù)或網(wǎng)絡(luò)發(fā)生故障的情況。Istio 的流量管理由
Envoy代理服務(wù)提供。網(wǎng)格內(nèi)服務(wù)發(fā)送和接收的所有流量都由Envoy 代理處理,讓控制網(wǎng)格內(nèi)的流量變得異常簡單,不需要對服務(wù)做更改。
為了在網(wǎng)格中導(dǎo)流,Istio 需要知道 endpoint 在哪和屬于哪個(gè)服務(wù)。為了定位到service registry(服務(wù)注冊中心),Istio 會連接到一個(gè)服務(wù)發(fā)現(xiàn)系統(tǒng)。例如,如果您在 Kubernetes 集群上安裝了 Istio,那么它將自動(dòng)檢測該集群中的服務(wù)和 endpoint(端點(diǎn))。
使用此服務(wù)注冊中心,Envoy 代理可以將流量定向到相關(guān)服務(wù)。大多數(shù)基于微服務(wù)的應(yīng)用程序,每個(gè)服務(wù)的工作負(fù)載都有多個(gè)實(shí)例來處理流量,稱為負(fù)載均衡池。默認(rèn)情況下,Envoy 代理基于輪詢調(diào)度在服務(wù)的負(fù)載均衡池內(nèi)分發(fā)流量,按順序請求發(fā)送給池中每個(gè)成員,一旦所有服務(wù)實(shí)例均接收過一次請求后,重新回到第一個(gè)池成員。
這些 API 也使用 Kubernetes 的自定義資源定義(CRDs)來聲明,可以使用 YAML 進(jìn)行配置。
istio架構(gòu)
Istio 服務(wù)網(wǎng)格 邏輯上分為數(shù)據(jù)平面和控制平面
數(shù)據(jù)平面:Envoy代理被部署為sidecar,負(fù)責(zé)協(xié)調(diào)和控制微服務(wù)之間的通信,收集和報(bào)告所有網(wǎng)格流量的遙測數(shù)據(jù)。-
控制平面:管理并配置Envoy代理
image.png
-
C++ 開發(fā)的高性能代理,用于協(xié)調(diào)服務(wù)網(wǎng)格中所有服務(wù)的入站和出站流量。Envoy 代理是唯一與數(shù)據(jù)平面流量交互的 Istio 組件。
Envoy 代理被部署為服務(wù)的 Sidecar,在邏輯上為服務(wù)增加了 Envoy 的許多內(nèi)置特性,例如:
動(dòng)態(tài)服務(wù)發(fā)現(xiàn)負(fù)載均衡TLS 終端HTTP/2 與 gRPC 代理熔斷器健康檢查基于百分比流量分割的分階段發(fā)布故障注入豐富的指標(biāo)
Sidecar
- 允許 Istio 可以執(zhí)行
策略決策,提取豐富的遙測數(shù)據(jù),接著將這些數(shù)據(jù)發(fā)送到監(jiān)視系統(tǒng)以提供整個(gè)網(wǎng)格行為的信息。 - Sidecar 代理還允許
向 Istio 添加功能,不需要重新設(shè)計(jì)架構(gòu)或重寫代碼。
Istiod
- Istiod 提供
服務(wù)發(fā)現(xiàn)、配置和證書管理。 - Istiod 將
控制流量的高級路由規(guī)則轉(zhuǎn)換為 Envoy 特定的配置,并在運(yùn)行時(shí)傳播給 Sidecar。 - Istiod 安全通過內(nèi)置的
身份和憑證管理,實(shí)現(xiàn)了強(qiáng)大的服務(wù)對服務(wù)和終端用戶認(rèn)證。 - Istiod 充當(dāng)證書
授權(quán)(CA),生成證書以允許在數(shù)據(jù)平面中進(jìn)行mTLS 通信。
虛擬服務(wù)(VirtualService)
配置
請求流量到服務(wù),基于連通性和服務(wù)發(fā)現(xiàn)能力。每個(gè)虛擬服務(wù)包含
一組路由規(guī)則??梢詫?shí)現(xiàn)負(fù)載均衡、基于不同版本流量百分比路由。
為什么使用虛擬服務(wù)?
虛擬服務(wù)在增強(qiáng) Istio 流量管理方面,發(fā)揮著至關(guān)重要的作用,通過對客戶端請求與真實(shí)響應(yīng)請求的目標(biāo)工作負(fù)載進(jìn)行解耦來實(shí)現(xiàn)。
基于不同服務(wù)版本的流量百分比路由,實(shí)現(xiàn)A/B 測試、金絲雀發(fā)布。
栗子
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: v3
hosts字段
虛擬服務(wù)的主機(jī),
客戶端請求或路由規(guī)則的目標(biāo)地址。虛擬服務(wù)主機(jī)名可以是
IP 地址、DNS 名稱,或者依賴于平臺的一個(gè)簡稱(Kubernetes 服務(wù)的短名稱)也可以使用通配符(“*”)前綴
路由規(guī)則
-
http字段包含虛擬服務(wù)的路由規(guī)則,用來描述匹配條件和路由行為,它們把HTTP/1.1、HTTP2 和 gRPC等流量發(fā)送到hosts字段指定的目標(biāo)
一個(gè)路由規(guī)則包含了請求要流向哪個(gè)目標(biāo)地址,具有 0 或多個(gè)匹配條件,取決于您的使用場景。
匹配條件
示例中的第一個(gè)路由規(guī)則有一個(gè)條件,因此以 match 字段開始。在本例中,您希望此路由應(yīng)用于來自”jason“ 用戶的所有請求,所以使用 headers、end-user 和 exact 字段選擇適當(dāng)?shù)恼埱蟆?/p>
- match:
- headers:
end-user:
exact: jason
Destination
route 部分的
destination字段指符合此條件的流量的實(shí)際目標(biāo)地址。與虛擬服務(wù)的
hosts不同,destination的 host 必須是存在于Istio 服務(wù)注冊中心的實(shí)際目標(biāo)地址,否則 Envoy 不知道該將請求發(fā)送到哪里。
route:
- destination:
host: reviews
subset: v2
destination 片段還指定了 Kubernetes 服務(wù)的子集,將符合此規(guī)則條件的請求轉(zhuǎn)入其中,本例中子集名稱是 v2。
路由規(guī)則優(yōu)先級
路由規(guī)則按從上到下的順序選擇,虛擬服務(wù)中定義的第一條規(guī)則有最高優(yōu)先級,不滿足第一個(gè)路由規(guī)則的流量均流向一個(gè)默認(rèn)的目標(biāo)。
本例中:第二條規(guī)則沒有 match 條件,直接將流量導(dǎo)向 v3 子集。
- route:
- destination:
host: reviews
subset: v3
路由規(guī)則的更多內(nèi)容
可以在流量端口、header 字段、URI 等內(nèi)容上設(shè)置匹配條件
匹配條件:

目標(biāo)規(guī)則(DestinationRule)
可以將虛擬服務(wù)視為將流量如何路由到目標(biāo)地址,然后目標(biāo)規(guī)則來配置該目標(biāo)的流量。虛擬服務(wù)路由規(guī)則之后,目標(biāo)規(guī)則將應(yīng)用于流量的“真實(shí)”目標(biāo)地址。
簡單來說:虛擬服務(wù)通過目標(biāo)規(guī)則后,到達(dá)目標(biāo)地址(服務(wù))
應(yīng)用場景:整個(gè)目的地服務(wù)或特定服務(wù)子集時(shí)定制 Envoy 的流量策略,負(fù)載均衡模型、TLS 安全模式或熔斷器設(shè)置。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-svc
trafficPolicy:
loadBalancer:
simple: RANDOM # 隨機(jī)負(fù)載均衡器
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN # 輪詢負(fù)載均衡器
- name: v3
labels:
version: v3
每個(gè)子集都是基于一個(gè)或多個(gè) labels 定義的,標(biāo)簽應(yīng)用于kubernetes集群中deployment控制器metadata字段來識別不同版本。
負(fù)載均衡選項(xiàng)
Istio 默認(rèn)使用輪詢的負(fù)載均衡策略,Istio 同時(shí)支持如下的負(fù)載均衡模型,可以在 DestinationRule 中為指定:
- 隨機(jī):請求以隨機(jī)的方式轉(zhuǎn)到池中的實(shí)例。
- 權(quán)重:請求根據(jù)指定的百分比轉(zhuǎn)到實(shí)例。
- 最少請求:請求被轉(zhuǎn)到最少被訪問的實(shí)例。
網(wǎng)關(guān)(Gateway)
管理入站和出站流量,網(wǎng)關(guān)配置網(wǎng)格邊界的獨(dú)立 Envoy 代理,而不是服務(wù)工作負(fù)載的 sidecar 代理。
Istio 網(wǎng)關(guān)可以配置 4-6 層的負(fù)載均衡屬性,如對外暴露的端口、TLS 設(shè)置等
網(wǎng)關(guān)主要用于管理進(jìn)入的流量
Istio 提供了預(yù)先配置的網(wǎng)關(guān)代理(
istio-ingressgateway和istio-egressgateway)
栗子
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: ext-host-gwy
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- ext-host.example.com
tls:
mode: SIMPLE
serverCertificate: /tmp/tls.crt
privateKey: /tmp/tls.key
這個(gè)網(wǎng)關(guān)配置讓 HTTPS 流量從 ext-host.example.com 通過 443 端口流入網(wǎng)格,但沒有為請求指定任何路由規(guī)則。為想要工作的網(wǎng)關(guān)指定路由,您必須把網(wǎng)關(guān)綁定到虛擬服務(wù)上。
如下面的示例所示,使用虛擬服務(wù)的 gateways 字段進(jìn)行設(shè)置:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: virtual-svc
spec:
hosts:
- ext-host.example.com
gateways:
- ext-host-gwy
然后就可以為出口流量配置帶有路由規(guī)則的虛擬服務(wù)。
Sidecar
默認(rèn)情況下,Istio 讓每個(gè) Envoy 代理都可以訪問和它關(guān)聯(lián)工作負(fù)載的所有端口的請求,然后轉(zhuǎn)發(fā)到對應(yīng)的工作負(fù)載。
可以使用 sidecar配置做:
-
微調(diào)Envoy 代理接受的端口和協(xié)議集。 -
限制Envoy 代理可以訪問的服務(wù)集合。
在較龐大的應(yīng)用程序中限制 sidecar 可達(dá)性,配置每個(gè)代理能訪問網(wǎng)格中的任意服務(wù),可能會因?yàn)?code>高內(nèi)存使用量而影響網(wǎng)格的性能。
可以指定將 sidecar 配置應(yīng)用于特定命名空間中的所有工作負(fù)載,或者使用 workloadSelector 選擇特定的工作負(fù)載
例如,下面的 sidecar 配置將 bookinfo 命名空間中的所有服務(wù)配置為,僅能訪問運(yùn)行在相同命名空間和 Istio 控制平面中的服務(wù):
apiVersion: networking.istio.io/v1alpha3
kind: Sidecar
metadata:
name: default
namespace: bookinfo
spec:
egress:
- hosts:
- "./*"
- "istio-system/*"
網(wǎng)絡(luò)彈性和測試
除了網(wǎng)格導(dǎo)流外,Istio 還提供了故障恢復(fù)和故障注入功能,您可以在運(yùn)行時(shí)動(dòng)態(tài)配置這些功能。使用這些特性可以讓您的應(yīng)用程序運(yùn)行穩(wěn)定,確保服務(wù)網(wǎng)格能夠容忍故障節(jié)點(diǎn),并防止局部故障級聯(lián)影響到其他節(jié)點(diǎn)。
超時(shí)
超時(shí)是 Envoy 代理等待來自給服務(wù)答復(fù)的時(shí)間,確保服務(wù)不會因?yàn)榈却饛?fù)而無限期的掛起。HTTP 請求的默認(rèn)超時(shí)時(shí)間是15 秒,這意味著如果服務(wù)在 15 秒內(nèi)沒有響應(yīng),調(diào)用將失敗。
為了找到最佳超時(shí)設(shè)置,Istio 允許使用虛擬服務(wù),按服務(wù)輕松地動(dòng)態(tài)調(diào)整超時(shí),而不必修改您的業(yè)務(wù)代碼。
栗子:
一個(gè)虛擬服務(wù),對 ratings 服務(wù)的 v1 子集的調(diào)用,指定 10 秒超時(shí)時(shí)間
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
timeout: 10s
重試
服務(wù)為初始調(diào)用失敗,Envoy 代理嘗試連接服務(wù)的最大次數(shù)。確保調(diào)用不會因?yàn)?code>臨時(shí)過載的服務(wù)或網(wǎng)絡(luò)等問題而永久失敗。
重試之間的間隔(25ms+)是可變的,HTTP 請求的默認(rèn)重試行為是在返回錯(cuò)誤之前重試兩次。
應(yīng)用場景:與超時(shí)一樣,Istio 默認(rèn)的重試行為在延遲方面可能不適合您的應(yīng)用程序需求(對失敗的服務(wù)進(jìn)行過多的重試會降低速度)或可用性。
栗子
配置了在初始調(diào)用失敗后,最多重試 3 次來連接到服務(wù)子集,每個(gè)重試都有 2 秒的超時(shí)。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
retries:
attempts: 3
perTryTimeout: 2s
熔斷器
熔斷器中,設(shè)置一個(gè)對服務(wù)中單個(gè)主機(jī)調(diào)用的限制,例如并發(fā)連接的數(shù)量或?qū)υ撝鳈C(jī)調(diào)用失敗的次數(shù)。一旦限制被觸發(fā),熔斷器就會“跳閘”并停止連接到該主機(jī)。
作用:使用熔斷模式可以快速失敗而不必讓客戶端嘗試連接到過載或有故障的主機(jī)。
熔斷適用于在負(fù)載均衡池中的“真實(shí)”網(wǎng)格目標(biāo)地址,可以在目標(biāo)規(guī)則中配置熔斷器閾值,讓配置適用于服務(wù)中的每個(gè)主機(jī)。
栗子:
將 v1 子集的reviews服務(wù)工作負(fù)載的并發(fā)連接數(shù)限制為 100:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
故障注入
是什么:可以使用 Istio 的故障注入機(jī)制來為整個(gè)應(yīng)用程序測試故障恢復(fù)能力。
為什么使用:故障注入是一種將錯(cuò)誤引入系統(tǒng)以確保系統(tǒng)能夠承受并從錯(cuò)誤條件中恢復(fù)的測試方法。
作用:使用故障注入特別有用,能確保故障恢復(fù)策略不至于不兼容或者太嚴(yán)格,這會導(dǎo)致關(guān)鍵服務(wù)不可用。
可以注入兩種故障,都使用虛擬服務(wù)配置:
-
延遲:延遲是時(shí)間故障。它們模擬增加的網(wǎng)絡(luò)延遲或一個(gè)超載的上游服務(wù)。 -
終止:終止是崩潰失敗。他們模仿上游服務(wù)的失敗。終止通常以 HTTP 錯(cuò)誤碼或 TCP 連接失敗的形式出現(xiàn)。
栗子:
千分之一訪問ratings 服務(wù)的請求,配置了一個(gè) 5 秒的延遲:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 0.1
fixedDelay: 5s
route:
- destination:
host: ratings
subset: v1
和您的應(yīng)用程序一起運(yùn)行
Istio 故障恢復(fù)功能對應(yīng)用程序來說是完全透明的。在返回響應(yīng)之前,應(yīng)用程序不知道 Envoy sidecar 代理是否正在處理被調(diào)用服務(wù)的故障。這意味著,如果在應(yīng)用程序代碼中設(shè)置了故障恢復(fù)策略,那么您需要記住這兩個(gè)策略都是獨(dú)立工作的,否則會發(fā)生沖突。
例如,假設(shè)您設(shè)置了兩個(gè)超時(shí),一個(gè)在虛擬服務(wù)中配置,另一個(gè)在應(yīng)用程序中配置。應(yīng)用程序?yàn)榉?wù)的 API 調(diào)用設(shè)置了 2 秒超時(shí)。而您在虛擬服務(wù)中配置了一個(gè) 3 秒超時(shí)和重試。在這種情況下,應(yīng)用程序的超時(shí)會先生效,因此 Envoy 的超時(shí)和重試嘗試會失效。
雖然 Istio 故障恢復(fù)特性提高了網(wǎng)格中服務(wù)的可靠性和可用性,但應(yīng)用程序必須處理故障或錯(cuò)誤并采取適當(dāng)?shù)幕赝瞬僮?。例如,?dāng)負(fù)載均衡中的所有實(shí)例都失敗時(shí),Envoy 返回一個(gè)HTTP 503代碼。應(yīng)用程序必須實(shí)現(xiàn)回退邏輯來處理HTTP 503錯(cuò)誤代碼。
總結(jié)
這篇花費(fèi)了不少精力,還望博友們支持支持新人!??!
后期會發(fā)布一篇實(shí)際操作,期待大家持續(xù)關(guān)注?。?!
