虛擬服務
更新時間 2024-09-09 19:34:01
最近更新時間: 2024-09-09 19:34:01
分享文章
本章節介紹虛擬服務能力
概述
虛擬服務(VirtualService)是服務網格的關鍵資源。虛擬服務定義了一組路由規則,并與請求匹配,根據匹配的結果將流量路由到響應的目標服務。本文介紹虛擬服務的基本管理以及CRD說明。
創建虛擬服務
- 進入網格實例頁,選擇菜單欄 流量管理中心 -> 虛擬服務。
- 確認虛擬服務所在命名空間,選擇 使用yaml創建。
- 當前已經定義了一些路由模板,可以選擇對應模板,按照自己的路由需求進行修改,然后提交。

修改虛擬服務
- 進入服務網格實例頁,選擇菜單欄 流量管理中心 -> 虛擬服務。
- 選擇相應的命名空間,列表頁會展示當前命名空間下所有的虛擬服務定義。
- 選擇操作欄下的編輯選項,可以對已經創建的虛擬服務進行編輯修改。

刪除虛擬服務
- 進入服務網格實例頁,選擇菜單欄 流量管理中心 -> 虛擬服務。
- 選擇相應的命名空間,列表頁會展示當前命名空間下所有的虛擬服務定義。
- 選擇操作欄下的刪除選項,可以刪除已經創建的虛擬服務。

虛擬服務配置資源配置示例及關鍵字段說明
下面的虛擬服務配置將對reviews服務的訪問默認轉發到reviews服務的v1版本,如果uri匹配到/test前綴,則將請求轉發到reviews服務的v2版本,reviews服務的兩個版本使用另外一個目標規則定義。
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
reviews.prod.svc.cluster.local
http:
- name:
"reviews-v2-routes"
match:
- uri:
prefix: "/test"
route:
- destination:
host:
reviews.prod.svc.cluster.local
subset: v2
- name:
"reviews-v1-route"
route:
- destination:
host:
reviews.prod.svc.cluster.local
subset: v1
關聯的目標規則配置中定義了reviews服務的兩個子集,分別對應v1和v2版本:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews-destination
spec:
host:
reviews.prod.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
VirtualService字段說明:
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| hosts | string | 否 | 流量轉發規則匹配的主機名稱,可以是DNS域名(支持前綴通配匹配)、ip或者在K8s里可以是服務的名稱(推薦使用FQDN)。 Hosts字段適用于tcp和http流量路由規則,對于引用網格內部服務的規則,hosts字段必須是域名的形式,ip形式的hosts只能用到Gateway資源對象中。 |
| gateways | string | 否 | 當前路由規則綁定的Gateway對象列表,可以是gateway-ns/gateway-name的形式,如果不加命名空間前綴,默認引用當前命名空間下的網關。 |
| http | HTTPRoute | 否 | 針對http流量的路由規則列表,適用于HTTP/HTTP2/GRPC協議。 |
| tls | TLSRoute | 否 | 針對TLS和HTTPS協議的路由規則列表,通常基于TLS連接過程中的sni信息進行路由。 |
| tcp | TCPRoute | 否 | 針對非HTTP和TLS協議的所有請求的路由規則。 |
| exportTo | string | 否 | 定義了當前虛擬服務對哪些命名空間暴露,用于實現可見性控制;不定義的話默認對所有命名空間可見。 |
HTTPRoute定義了對HTTP1.1 、HTTP2 、gRPC的路由規則,字段說明如下:
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| name | string | No | 路由名稱,會被記錄到訪問日志中,主要用于定位問題用。 |
| match | HTTPMatchRequest | No | 路由匹配規則列表,一個match下面的多個匹配規則之間是and關系,必須同時滿足;match之間是or的關系。 |
| route | HTTPRouteDestination | No | 路由配置,可以直接返回結果、重定向請求或者將請求轉發到其他服務。 |
| redirect | HTTPRedirect | No | 用于返回301重定向。 |
| directResponse | HTTPDirectResponse | No | 用于返回固定的響應,在route和redirect為空的時候可以配置該字段。 |
| delegate | Delegate | No | 指定用于委托HTTPRoute的虛擬服務,當route和redirect為空時可以設置,委托的虛擬服務會和當前規則合并。 注意: 1.當前只支持一層委托。 2.委托的HTTPMatchRequest必須是根的嚴格子集,否則會有沖突,HTTPRoute將不會生效。 |
| rewrite | HTTPRewrite | No | 重寫uri或者authority頭部,不能與redirect一起使用;重寫發生在轉發請求之前。 |
| timeout | Duration | No | http請求的超時時間。 |
| retries | HTTPRetry | No | http請求重試策略。 |
| fault | HTTPFaultInjection | No | 客戶端的故障注入策略(重試和超時策略將不生效)。 |
| mirror | Destination | No | 將流量鏡像一份轉發到指定的目標服務;該行為遵循盡最大努力原則,sidecar將不等待鏡像結果返回。 |
| mirrorPercentage | Percent | No | 和mirror字段配合使用,定義鏡像流量比例,默認為100%。 |
| corsPolicy | CorsPolicy | No | 跨域策略配置。 |
| headers | Headers | No | Header操作策略。 |
TLSRoute定義了對TLS和HTTPS流量的路由規則,主要基于SNI路由,配置參數:
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| match | TLSMatchAttributes | Yes | TLS匹配規則,一個match內的多個規則是and關系,多個match之間是or的關系。 |
| route | RouteDestination | No | 流量轉發目標。 |
TCPRoute描述了對TCP流量的匹配和轉發規則,主要是基于端口的流量轉發,配置字段包括:
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| match | L4MatchAttributes | Yes | TCP流量匹配規則,一個match內的多個規則是and關系,多個match之間是or的關系。 |
| route | RouteDestination | No | 流量轉發目標。 |
HTTPMatchRequest配置定義了對http請求的一系列的匹配規則,具體字段如下:
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| name | string | No | 標識一個匹配規則,會被記錄到訪問日志中,主要用于debug。 |
| uri | StringMatch | No | Uri的匹配規則,當前支持三種匹配,分別是精確匹配、前綴匹配和正則匹配; uri匹配支持大小寫敏感或不敏感匹配,可以通過ignore_uri_case字段配置。 |
| scheme | StringMatch | No | Uri的scheme匹配,支持精確、前綴和正則匹配;大小寫敏感。 |
| method | StringMatch | No | HTTP方法匹配,支持精確、前綴和正則匹配;大小寫敏感。 |
| authority | StringMatch | No | HTTP Authority匹配,支持精確、前綴和正則匹配;大小寫敏感。 |
| headers | map<string, StringMatch> | No | HTTP頭部匹配,針對每個頭部支持定義匹配規則,支持精確、前綴和正則匹配;大小寫敏感; uri, scheme, method, authority幾個頭部的匹配會被忽略。 |
| port | uint32 | No | 目標主機的服務端口。 |
| sourceLabels | map<string, string> | No | 請求源工作負載應當具備的標簽。 |
| gateways | string | No | 當前匹配規則適用的網關列表,會覆蓋虛擬服務級別的網關列表。 |
| queryParams | map<string, StringMatch> | No | 請求參數匹配,針對每個頭部支持定義匹配規則,支持精確、前綴和正則匹配;大小寫敏感。 |
| ignoreUriCase | bool | No | Uri匹配是否需要大小寫敏感。 |
| withoutHeaders | map<string, StringMatch> | No | 和headers一樣是對頭部的匹配,匹配的效果剛好相反:如果header匹配了,則該請求不會應用該規則的處理。 |
| sourceNamespace | string | No | 限制請求源工作負載所在的命名空間。 |
| statPrefix | string | No | 相關監控指標的前綴。 |
HTTPRouteDestination定義了HTTP路由轉發規則的目標服務
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| destination | Destination | Yes | 要轉發的目標服務信息。 |
| weight | int32 | No | 當前目標服務的權重。 |
| headers | Headers | No | 頭部操作規則。 |
RouteDestination定義了四層轉發的目標服務
| 字段 | 類型 | 必選 | 說明 |
|---|---|---|---|
| destination | Destination | Yes | 要轉發的目標服務信息。 |
| weight | int32 | No | 當前目標服務的權重。 |