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