Istio 入門(六):版本控制

2023-10-18 09:01:39


完整系統教學電子書閱讀地址:https://istio.whuanle.cn/

VirtualService 和 DestinationRule

VirtualService 與 Service 的關係

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 結合使用,以實現所需的服務治理目標。

VirtualService 和 DestinationRule 的關係

在 Istio 中,VirtualService 和 DestinationRule 是兩個關鍵的自定義資源定義(CRD),它們用於設定和控制服務間的流量路由。

它們之間的關係可以概括為:VirtualService 定義了流量的路由規則,而 DestinationRule 定義了流量到達目的地後如何進行負載分發和連線池管理

VirtualService 用於定義流量的路由規則。當請求從一個服務到另一個服務時,VirtualService 可以指定如何將流量路由到不同的目的地(例如,不同的服務範例,版本或子集)。VirtualService 還可以根據請求的屬性(如請求頭、路徑、來源等)對流量進行匹配和分發。此外,VirtualService 可以設定複雜的路由行為,如重試、超時和故障注入等。

DestinationRule 被用於控制流量的分發和連線池管理。DestinationRule 定義了服務的子集(即服務的不同版本或變體),並指定如何根據負載均衡策略(如輪詢、隨機、最少連線等)將流量分發到這些子集。此外,DestinationRule 還可以設定連線池設定(如最大連線數、空閒超時等)和傳輸層安全策略(如 TLS 設定)。

總之,VirtualService 和 DestinationRule 在 Istio 中共同實現了流量的精細控制。VirtualService 用於定義流量的路由規則,而 DestinationRule 則負責處理流量到達目的地後的負載分發和連線池管理。

VirtualService 的定義

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 屬性是 VirtualService spec 中的一個欄位,它包含一個 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 的定義

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