istio 1.10学习笔记05: 流量管理API资源对象虚拟服务和目标规则
Istio通過流量管理API進(jìn)行流量配置。流量管理API使用Kubernetes的CRDs(自定義資源定義)來聲明。 本節(jié)學(xué)習(xí)在前面2節(jié)配置請求路由中用過的兩個(gè)API資源:虛擬服務(wù)VirtualService和目標(biāo)路由DestinationRule。
虛擬服務(wù)VirtualService
使用虛擬服務(wù)可以為一個(gè)或多個(gè)主機(jī)名(hostnames)指定流量行為。在虛擬機(jī)服務(wù)中使用路由規(guī)則(route)告訴Envoy如何發(fā)送虛擬服務(wù)的流量到適當(dāng)?shù)哪繕?biāo)(destination)。 路由(route)的目標(biāo)(destination)可以是同一服務(wù)的不同版本,也可以是完全不同的服務(wù)。
下面是一個(gè)典型的用例,將流量發(fā)送到被指定為服務(wù)子集的不同版本。客戶端將虛擬服務(wù)視為一個(gè)單一實(shí)體將請求發(fā)送到虛擬服務(wù)reviews,然后Envoy根據(jù)虛擬服務(wù)規(guī)則將流量路由到不同版本,25%的流量調(diào)用轉(zhuǎn)到reviews服務(wù)的v2版本。 這是一個(gè)金絲雀發(fā)布的場景,逐步增加發(fā)送到新版本服務(wù)的流量百分比。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 75
- destination:
host: reviews
subset: v2
weight: 25
虛擬服務(wù)有如下兩個(gè)使用場景:
- 通過單個(gè)虛擬服務(wù)處理多個(gè)應(yīng)用程序服務(wù),例如配置一個(gè)虛擬服務(wù)處理Kubernetes特定命名空間中的所有服務(wù)。映射單一的虛擬服務(wù)到多個(gè)“真實(shí)”服務(wù),可以在不需要客戶適應(yīng)轉(zhuǎn)換的情況下,將單體應(yīng)用轉(zhuǎn)換為微服務(wù)構(gòu)建的復(fù)合應(yīng)用系統(tǒng)。
- 和網(wǎng)關(guān)整合并配置流量規(guī)則來控制出入流量
再來看一下“基于用戶身份進(jìn)行請求路由”這個(gè)例子中創(chuàng)建的虛擬服務(wù)VirtualService,將根據(jù)請求是否來自特定的用戶,把它們路由到服務(wù)的不同版本:
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ī)則的應(yīng)用目標(biāo),是客戶端向服務(wù)發(fā)送請求時(shí)使用的一個(gè)或多個(gè)地址,這里只有一個(gè)reivews。 虛擬服務(wù)的主機(jī)名hosts可以是IP地址,DNS名稱或者依賴于平臺(tái)的一個(gè)簡稱(例如Kubernetes服務(wù)的短名稱),隱式或顯式的指向一個(gè)完全限定域名(FQDN)。 也可以使用通配符*前綴來創(chuàng)建一組匹配所有服務(wù)的路由規(guī)則。虛擬服務(wù)的hosts字段實(shí)際上不必是istio服務(wù)注冊的一部分,它只是虛擬的目標(biāo)地址,這樣就可以為沒有路由到網(wǎng)格內(nèi)部的虛擬主機(jī)建模。
http字段包含了虛擬服務(wù)的路由規(guī)則,用來描述匹配條件和路由行為。通過路由規(guī)則把HTTP1.1, HTTP2和gRPC等流量發(fā)送到hosts字段指定的目標(biāo)。一個(gè)路由規(guī)則具有0個(gè)或多個(gè)匹配條件(match),并包含指定的請求要流向哪個(gè)目標(biāo)地址(destination)。 示例中的第一個(gè)路由規(guī)則就有一個(gè)匹配條件,以match字段開始,通過使用headers, end-user, exact等字段匹配請求頭end-user=jason的請求。 route部分的destination字段指定了符合此條件的流量的實(shí)際目標(biāo)地址。與虛擬機(jī)服務(wù)的hosts字段不同,destination的host字段必須是存在于isito服務(wù)注冊中心的實(shí)際目標(biāo)地址, 否則Envoy不知道將請求發(fā)送到哪里。在本例中host為Kubernetes中的reviews服務(wù)名(這里使用的Kubernetes服務(wù)的短名稱設(shè)置)。destination片段還指定了reviews這個(gè)Kubernetes服務(wù)子集subset。
路由規(guī)則在匹配時(shí)按從上到下的順序選擇。因此一般建議提供一個(gè)默認(rèn)的“無條件”或基于權(quán)重的規(guī)則作為每個(gè)虛擬服務(wù)的最后一條路由規(guī)則,確保流經(jīng)虛擬服務(wù)的流量至少能夠匹配一條路由規(guī)則。
路由規(guī)則是將特定流量子集路由到指定目標(biāo)地址的強(qiáng)大工具。可以在流量端口、header 字段、URI 等內(nèi)容上設(shè)置匹配條件。 例如,下面這個(gè)虛擬服務(wù)讓用戶發(fā)送請求到兩個(gè)獨(dú)立的服務(wù):ratings 和 reviews,就好像它們是http://bookinfo.com/這個(gè)更大的虛擬服務(wù)的一部分。 虛擬服務(wù)規(guī)則根據(jù)請求的URI和指向適當(dāng)服務(wù)的請求匹配流量。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- bookinfo.com
http:
- match:
- uri:
prefix: /reviews
route:
- destination:
host: reviews
- match:
- uri:
prefix: /ratings
route:
- destination:
host: ratings
...
http:
- match:
sourceLabels:
app: reviews
route:
路由規(guī)則的配置十分靈活,除了上面例子中已經(jīng)展示的,還可以使用路由規(guī)則在流量上執(zhí)行一些操作,例如添加刪除header、重寫URL、為調(diào)用這一目標(biāo)地址的請求設(shè)置重試策略等。 關(guān)于VirtualService的更多內(nèi)容可以查看官方的配置手冊https://istio.io/latest/zh/docs/reference/config/networking/virtual-service。
目標(biāo)規(guī)則DestinationRule
虛擬服務(wù)用來配置如何將流量路由到目標(biāo)地址,而目標(biāo)規(guī)則就是用來配置流量真實(shí)的目標(biāo)地址上的。可以使用目標(biāo)規(guī)則來指定命名的服務(wù)子集,例如按版本為所有給定服務(wù)的實(shí)例分組,然后可以在虛擬服務(wù)的路由規(guī)則中使用這些服務(wù)子集來控制到服務(wù)不同實(shí)例的流量。 使用目標(biāo)規(guī)則還可以在調(diào)用這個(gè)目標(biāo)服務(wù)或特定子集時(shí)定制Envoy的流量策略,例如負(fù)載均衡策略、TLS安全模式或熔斷器設(shè)置。
默認(rèn)情況下,Istio使用輪詢(ROUND_ROBIN)的負(fù)載均衡策略,實(shí)例池中的每個(gè)實(shí)例依次獲取請求。Istio同時(shí)支持如下的負(fù)載均衡模型,可以在目標(biāo)規(guī)則DestinationRule中為流向某個(gè)特定服務(wù)或服務(wù)子集的流量指定這些模型。
- 隨機(jī)(RANDOM):請求以隨機(jī)的方式轉(zhuǎn)到池中的實(shí)例。
- 權(quán)重:請求根據(jù)指定的百分比轉(zhuǎn)到實(shí)例。
- 最少請求(LEAST_CONN):請求被轉(zhuǎn)到最少被訪問的實(shí)例
在下面的示例中,目標(biāo)規(guī)則為my-svc目標(biāo)服務(wù)的3個(gè)子集配置了負(fù)載均衡策略,v1,v3為RANDOM,v2為ROUND_ROBIN:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-svc
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v3
labels:
version: v3
每個(gè)子集都是基于一個(gè)或多個(gè)labels定義的,在Kubernetes中它是附加到像Pod這種對象上的鍵/值對。這些標(biāo)簽應(yīng)用于Kubernetes服務(wù)的Deployment并作為metadata來識(shí)別不同的版本。
總結(jié)
本節(jié)學(xué)習(xí)了Isito流量管理API的兩個(gè)資源對象VirtualService和DestinationRule。 虛擬服務(wù)用來配置如何將流量路由到目標(biāo)地址,虛擬服務(wù)的路由規(guī)則可以在流量端口、header 字段、URI 等內(nèi)容上設(shè)置匹配條件,將流量到路由到適當(dāng)?shù)哪繕?biāo),同時(shí)還可以使用路由規(guī)則在流量上執(zhí)行一些操作,例如添加刪除header、重寫URL、為調(diào)用這一目標(biāo)地址的請求設(shè)置重試策略等。 目標(biāo)規(guī)則是應(yīng)用在目標(biāo)地址上的規(guī)則,使用目標(biāo)規(guī)則可以在調(diào)用這個(gè)目標(biāo)服務(wù)或特定子集時(shí)定制Envoy的流量策略,例如負(fù)載均衡策略、TLS安全模式或熔斷器設(shè)置。
參考
- https://istio.io/latest/zh/docs/concepts/traffic-management
- https://istio.io/latest/zh/docs/reference/config/networking/virtual-service
- https://istio.io/latest/zh/docs/reference/config/networking/destination-rule/
總結(jié)
以上是生活随笔為你收集整理的istio 1.10学习笔记05: 流量管理API资源对象虚拟服务和目标规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 端口映射失败的故障分析和解决方法(端口映
- 下一篇: 中国电信推出孝心卡套餐(中国电信 孝心卡