Istio 的 VirtualService 和 Kubernetes 的 Service 都是服務治理的元件,但它們有不同的作用和關係。
下面是它們之間的關係和區別:
定義和作用
Kubernetes 的 Service 主要負責服務發現和負載均衡,它為一組執行相同應用的 Pod 提供一個統一的存取入口。
而 Istio 的 VirtualService 主要負責定義流量路由規則,實現對服務間流量的細粒度控制。
關係
VirtualService 與 Service 是相互關聯的。
在 VirtualService 的定義中,可以指定將流量路由到 Kubernetes 的 Service,VirtualService 會在 Service 的基礎上增強流量管理和控制功能。
請一定要注意這裡。
定義 VirtualService 時,需要將流量路由指向到一個 Service。
route:
- destination:
host: productpage
port:
number: 9080
route:
- destination:
host: productpage.bookinfo.svc.cluster.local
port:
number: 9080
但是服務間請求的流量實際上不會到達 Service,因為流量輸出到 Envoy 時,Istio 直接間流量轉發到對應的 Pod。
強調過很多次,流量實際上不會到達 Service。
這裡的 Service 為 Envoy 提供了一些關於 Pod 的基礎資訊,VirtualService 會在 Service 的基礎上增強流量管理和控制功能。
雖然 Istio 使用 Envoy 管理流量,但 Kubernetes 的 Service 仍然在 Istio 中發揮作用。Service 用於定義服務的基本屬性,例如服務的名稱和埠。Istio 使用這些資訊從 Kubernetes API 伺服器獲取服務的端點,並將這些資訊傳遞給 Envoy 。這樣,Envoy 就可以知道如何路由到其他服務。
功能差異
Kubernetes 的 Service 提供了基本的負載均衡和服務發現功能,而 Istio 的 VirtualService 提供了更豐富的流量管理能力,如按權重分配流量、請求重試、故障注入、流量映象等。
相容性
Istio 可以與 Kubernetes 叢集無縫整合,VirtualService 和 Service 可共同工作以實現更強大的服務治理功能。Istio 不僅支援 Kubernetes,還可以與其他平臺(如 VM、Consul 等)一起使用。
總之,Istio 的 VirtualService 和 Kubernetes 的 Service 是相輔相成的,它們共同為服務提供了更強大的流量管理和控制功能。在使用 Istio 時,通常需要將 VirtualService 與 Kubernetes 的 Service 結合使用,以實現所需的服務治理目標。
在 Istio 中,VirtualService 和 DestinationRule 是兩個關鍵的自定義資源定義(CRD),它們用於設定和控制服務間的流量路由。
它們之間的關係可以概括為:VirtualService 定義了流量的路由規則,而 DestinationRule 定義了流量到達目的地後如何進行負載分發和連線池管理。
VirtualService 用於定義流量的路由規則。當請求從一個服務到另一個服務時,VirtualService 可以指定如何將流量路由到不同的目的地(例如,不同的服務範例,版本或子集)。VirtualService 還可以根據請求的屬性(如請求頭、路徑、來源等)對流量進行匹配和分發。此外,VirtualService 可以設定複雜的路由行為,如重試、超時和故障注入等。
DestinationRule 被用於控制流量的分發和連線池管理。DestinationRule 定義了服務的子集(即服務的不同版本或變體),並指定如何根據負載均衡策略(如輪詢、隨機、最少連線等)將流量分發到這些子集。此外,DestinationRule 還可以設定連線池設定(如最大連線數、空閒超時等)和傳輸層安全策略(如 TLS 設定)。
總之,VirtualService 和 DestinationRule 在 Istio 中共同實現了流量的精細控制。VirtualService 用於定義流量的路由規則,而 DestinationRule 則負責處理流量到達目的地後的負載分發和連線池管理。
VirtualService 的 spec 一共有五大類屬性。
spec:
hosts:
gateways:
http:
tls:
tcp:
hosts
:這是一個字串列表,用於指定 VirtualService 應用的目標主機。這些主機可以是 Kubernetes Service 名稱,也可以是外部服務的域名。流量將根據這些主機進行路由。
hosts:
- my-service.example.com
gateways
:這是一個字串列表,用於指定 VirtualService 應用的閘道器。Istio 閘道器用於設定進出網格的流量。如果省略此欄位,預設情況下,VirtualService 僅適用於網格內部的流量。
gateways:
- my-gateway
http
:此屬性包含一個 HTTPRoute 列表,用於定義 HTTP 流量的路由規則。每個 HTTPRoute 可以包含匹配條件、路由目標、重試、超時等設定。
http
屬性是 VirtualServicespec
中的一個欄位,它包含一個 HTTPRoute 列表,用於定義 HTTP 流量的路由規則。HTTPRoute 包含以下主要屬性:
match
:此屬性包含一個 HTTPMatchRequest 列表,用於定義流量匹配條件。每個 HTTPMatchRequest 可以包含以下匹配條件:
uri
:請求 URI 的匹配條件,可以是字首匹配、精確匹配或正規表示式匹配。method
:請求方法(如 GET、POST 等)的匹配條件。headers
:請求頭的匹配條件,可以是字首匹配、精確匹配或正規表示式匹配。queryParams
:查詢引數的匹配條件,可以是字首匹配、精確匹配或正規表示式匹配。sourceLabels
:流量來源的 Pod 標籤匹配條件。gateways
:流量來源的閘道器列表。
route
:此屬性包含一個 HTTPRouteDestination 列表,用於定義流量的路由目標。每個 HTTPRouteDestination 包含以下屬性:
destination
:流量的目的地,包括host
(目標主機名)、subset
(目標服務子集)和port
(目標埠)。weight
:流量分發到此目的地的權重。所有路由目標的權重總和應為 100。
redirect
:此屬性用於設定 HTTP 重定向。可以指定重定向的 URI、Authority 和狀態碼。
rewrite
:此屬性用於設定 URI 和 Authority 的重寫規則。
timeout
:此屬性用於設定請求的超時時間。
retries
:此屬性用於設定重試策略,包括嘗試次數、每次嘗試的超時時間和可重試的狀態碼。
fault
:此屬性用於設定故障注入,包括延遲注入和異常注入。這對於測試和模擬故障場景非常有用。
mirror
:此屬性用於設定流量映象目的地。流量映象允許將流量複製到另一個服務,用於觀察和測試。
corsPolicy
:此屬性用於設定 CORS 策略,包括允許的來源、允許的方法、允許的頭部等。
headers
:此屬性用於設定請求和響應頭的操作,包括新增、修改和刪除頭部。
tls
:此屬性包含一個 TLSRoute 列表,用於定義基於 SNI 的 TLS 流量的路由規則。每個 TLSRoute 可以包含匹配條件和路由目標。
tcp
:此屬性包含一個 TCPRoute 列表,用於定義 TCP 流量的路由規則。每個 TCPRoute 可以包含匹配條件和路由目標。
下面是一個 VirtualService 範例。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-virtual-service
spec:
hosts:
- my-service.example.com
gateways:
- my-gateway
http:
- match:
- uri:
prefix: /api/v1
route:
- destination:
host: my-service-v1
weight: 90
- destination:
host: my-service-v2
weight: 10
retries:
attempts: 3
perTryTimeout: 2s
timeout: 10s
- route:
- destination:
host: my-service-v1
DestinationRule 的 spec 中一共有三大類屬性。
spec:
host: my-service
trafficPolicy:
subsets:
host
:此屬性是一個字串,用於指定目標主機名。它可以是 Kubernetes Service 名稱,也可以是外部服務的域名。
trafficPolicy
:此屬性用於設定全域性的流量策略,包括負載均衡策略、連線池設定和傳輸層安全策略。這些設定將應用於所有子集(除非子集中明確覆蓋)。
subsets
:此屬性包含一個 Subset 列表,用於定義服務的子集(即服務的不同版本或變體)。每個 Subset 包含以下屬性:
name
:子集的名稱。labels
:子集的標籤選擇器。這些標籤用於選擇對應子集的 Kubernetes Pod。trafficPolicy
:子集的流量策略。這些設定將覆蓋全域性的 trafficPolicy
。下面是一個範例:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-destination-rule
spec:
host: my-service
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
connectionPool:
tcp:
maxConnections: 100
http:
http2MaxRequests: 1000
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v2
labels:
version: v2