虛擬服務

影響流量路由的設定。以下是一些在流量路由上下文中定義有用的術語。

服務 (Service):應用程式行為的單元,在服務註冊表中與唯一的名稱綁定。服務由多個網路端點 (endpoints)組成,這些端點由在 Pod、容器、VM 等上執行的工作負載實例實現。

服務版本(又稱子集)(Service versions (a.k.a. subsets)):在持續部署的場景中,對於給定的服務,可以有不同的實例子集,它們執行應用程式二進制檔案的不同變體。這些變體不一定是不同的 API 版本。它們可能是對同一服務的迭代變更,部署在不同的環境中(生產、預備、開發等)。發生這種情況的常見場景包括 A/B 測試、金絲雀發布等。特定版本的選擇可以基於各種標準(標頭、URL 等)和/或分配給每個版本的權重來決定。每個服務都有一個預設版本,由其所有實例組成。

來源 (Source):呼叫服務的下游用戶端。

主機 (Host):用戶端嘗試連線到服務時使用的位址。

存取模型 (Access model):應用程式僅尋址目標服務(主機),而不知道個別服務版本(子集)。版本的實際選擇由代理/邊車決定,使應用程式碼能夠將自身與相依服務的演變分離。

VirtualService 定義在尋址主機時要應用的一組流量路由規則。每個路由規則都定義了特定協定的流量匹配條件。如果流量匹配,則會將其傳送到註冊表中定義的指定目的地服務(或其子集/版本)。

流量的來源也可以在路由規則中匹配。這允許為特定的用戶端內容自訂路由。

以下 Kubernetes 範例預設將所有 HTTP 流量路由到具有標籤 “version: v1” 的 reviews 服務的 Pod。此外,路徑以 /wpcatalog/ 或 /consumercatalog/ 開頭的 HTTP 請求將被重寫為 /newcatalog,並傳送到具有標籤 “version: v2” 的 Pod。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - name: "reviews-v2-routes"
    match:
    - uri:
        prefix: "/wpcatalog"
    - uri:
        prefix: "/consumercatalog"
    rewrite:
      uri: "/newcatalog"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
  - name: "reviews-v1-route"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1

路由目的地的子集/版本由對指定服務子集的參考來識別,該子集必須在相應的 DestinationRule 中宣告。

apiVersion: networking.istio.io/v1
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

影響流量路由的設定。

欄位類型描述必要
hostsstring[]

流量傳送到的目的地主機。可以是帶有萬用字元字首的 DNS 名稱或 IP 位址。根據平台,也可以使用簡短名稱而不是 FQDN(即名稱中沒有點)。在這種情況下,主機的 FQDN 將根據底層平台衍生。

可以使用單個 VirtualService 來描述相應主機的所有流量屬性,包括多個 HTTP 和 TCP 連接埠的屬性。或者,可以使用多個 VirtualService 來定義主機的流量屬性,但有一些注意事項。有關詳細資訊,請參閱操作指南

Kubernetes 使用者注意事項:當使用簡短名稱(例如「reviews」而不是「reviews.default.svc.cluster.local」)時,Istio 將根據規則的命名空間而不是服務來解讀簡短名稱。在「預設」命名空間中包含主機「reviews」的規則將被解讀為「reviews.default.svc.cluster.local」,而與與 reviews 服務關聯的實際命名空間無關。為了避免潛在的錯誤配置,建議始終使用完整網域名稱而不是簡短名稱。

hosts 欄位適用於 HTTP 和 TCP 服務。網格內的服務,即在服務註冊表中找到的服務,必須始終使用其字母數字名稱來引用。僅允許透過閘道定義的服務使用 IP 位址。

注意:對於委派的 VirtualService,它必須為空。

gatewaysstring[]

應套用這些路由的閘道和邊車的名稱。其他命名空間中的閘道可以使用 <閘道命名空間>/<閘道名稱> 來引用;指定沒有命名空間限定詞的閘道與指定 VirtualService 的命名空間相同。單個 VirtualService 用於網格內的邊車以及一個或多個閘道。可以使用特定於協定路由的匹配條件中的來源欄位來覆寫此欄位施加的選擇條件。保留字 mesh 用於表示網格中的所有邊車。如果省略此欄位,將使用預設閘道(mesh),這會將規則套用於網格中的所有邊車。如果提供了閘道名稱清單,則規則僅適用於閘道。若要將規則同時套用於閘道和邊車,請指定 mesh 作為閘道名稱之一。

httpHTTPRoute[]

用於 HTTP 流量的路由規則的有序清單。HTTP 路由將套用於使用 HTTP/HTTP2/GRPC 協定的平台服務連接埠、使用 HTTP/HTTP2/GRPC/TLS 終止 HTTPS 協定的閘道連接埠,以及使用 HTTP/HTTP2/GRPC 協定的服務條目連接埠。將使用第一個與傳入請求匹配的規則。

tlsTLSRoute[]

用於未終止 TLS 和 HTTPS 流量的路由規則的有序清單。路由通常使用 ClientHello 訊息提供的 SNI 值執行。TLS 路由將套用於名為「https-」、「tls-」的平台服務連接埠、使用 HTTPS/TLS 協定的未終止閘道連接埠(即使用「passthrough」TLS 模式)以及使用 HTTPS/TLS 協定的服務條目連接埠。將使用第一個與傳入請求匹配的規則。注意:沒有關聯虛擬服務的流量「https-」或「tls-」連接埠將被視為不透明 TCP 流量。

tcpTCPRoute[]

用於不透明 TCP 流量的路由規則的有序清單。TCP 路由將套用於任何非 HTTP 或 TLS 連接埠。將使用第一個與傳入請求匹配的規則。

exportTostring[]

此虛擬服務匯出到的命名空間清單。匯出虛擬服務允許其他命名空間中定義的邊車和閘道使用它。此功能為服務擁有者和網格管理員提供了一種機制,以控制跨命名空間邊界的虛擬服務的可見性。

如果未指定命名空間,則預設情況下會將虛擬服務匯出到所有命名空間。

值「.」是保留的,並定義匯出到宣告虛擬服務所在的相同命名空間。同樣,值「*」是保留的,並定義匯出到所有命名空間。

Destination

目的地表示處理路由規則後,請求/連線將傳送到的網路可尋址服務。destination.host 應明確指向服務註冊表中的服務。Istio 的服務註冊表由平台服務註冊表(例如,Kubernetes 服務、Consul 服務)中找到的所有服務,以及透過ServiceEntry資源宣告的服務組成。

Kubernetes 使用者注意事項:當使用簡短名稱(例如「reviews」而不是「reviews.default.svc.cluster.local」)時,Istio 將根據規則的命名空間而不是服務來解讀簡短名稱。在「預設」命名空間中包含主機「reviews」的規則將被解讀為「reviews.default.svc.cluster.local」,而與與 reviews 服務關聯的實際命名空間無關。為了避免潛在的錯誤配置,建議始終使用完整網域名稱而不是簡短名稱。

以下 Kubernetes 範例預設將所有流量路由到具有標籤「version: v1」(即子集 v1)的 reviews 服務的 Pod,並將某些流量路由到子集 v2(在 Kubernetes 環境中)。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
  namespace: foo
spec:
  hosts:
  - reviews # interpreted as reviews.foo.svc.cluster.local
  http:
  - match:
    - uri:
        prefix: "/wpcatalog"
    - uri:
        prefix: "/consumercatalog"
    rewrite:
      uri: "/newcatalog"
    route:
    - destination:
        host: reviews # interpreted as reviews.foo.svc.cluster.local
        subset: v2
  - route:
    - destination:
        host: reviews # interpreted as reviews.foo.svc.cluster.local
        subset: v1

以及相關聯的 DestinationRule

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-destination
  namespace: foo
spec:
  host: reviews # interpreted as reviews.foo.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

以下 VirtualService 為 Kubernetes 中對 productpage.prod.svc.cluster.local 服務的所有呼叫設定 5 秒的逾時。請注意,此規則中未定義子集。Istio 將從服務註冊表中擷取 productpage.prod.svc.cluster.local 服務的所有實例,並填入邊車的負載平衡池。此外,請注意,此規則設定在 istio-system 命名空間中,但使用 productpage 服務的完整網域名稱 productpage.prod.svc.cluster.local。因此,規則的命名空間不會影響解析 productpage 服務的名稱。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: my-productpage-rule
  namespace: istio-system
spec:
  hosts:
  - productpage.prod.svc.cluster.local # ignores rule namespace
  http:
  - timeout: 5s
    route:
    - destination:
        host: productpage.prod.svc.cluster.local

若要控制傳送到網格外部服務的流量的路由,必須先使用 ServiceEntry 資源將外部服務新增至 Istio 的內部服務註冊表。然後可以定義 VirtualServices 來控制傳送到這些外部服務的流量。例如,以下規則定義了 wikipedia.org 的服務,並為 HTTP 請求設定了 5 秒的逾時。

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-wikipedia
spec:
  hosts:
  - wikipedia.org
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: example-http
    protocol: HTTP
  resolution: DNS
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: my-wiki-rule
spec:
  hosts:
  - wikipedia.org
  http:
  - timeout: 5s
    route:
    - destination:
        host: wikipedia.org
欄位類型描述必要
hoststring

來自服務註冊表的服務名稱。服務名稱會從平台的服務註冊表(例如,Kubernetes 服務、Consul 服務等)以及由 ServiceEntry 宣告的主機中查閱。傳送到在兩者中都找不到的目的地的流量將被丟棄。

Kubernetes 使用者注意事項:當使用簡短名稱(例如「reviews」而不是「reviews.default.svc.cluster.local」)時,Istio 將根據規則的命名空間而不是服務來解讀簡短名稱。在「預設」命名空間中包含主機「reviews」的規則將被解讀為「reviews.default.svc.cluster.local」,而與與 reviews 服務關聯的實際命名空間無關。為了避免潛在的錯誤配置,建議始終使用完整網域名稱而不是簡短名稱。

subsetstring

服務內子集的名稱。僅適用於網格內的服務。子集必須在相應的 DestinationRule 中定義。

portPortSelector

指定正在尋址的主機上的連接埠。如果服務僅公開單個連接埠,則不需要明確選取連接埠。

HTTPRoute

描述 HTTP/1.1、HTTP2 和 gRPC 流量的匹配條件和路由動作。如需使用範例,請參閱 VirtualService。

欄位類型描述必要
namestring

為了偵錯目的分配給路由的名稱。路由的名稱將與匹配的名稱串連,並記錄在符合此路由/匹配的請求的存取記錄中。

matchHTTPMatchRequest[]

規則被啟動需滿足的匹配條件。單個匹配區塊內的所有條件都具有 AND 語義,而匹配區塊清單具有 OR 語義。如果任何一個匹配區塊成功,則規則會匹配。

routeHTTPRouteDestination[]

HTTP 規則可以傳回 direct_response、redirect 或轉送(預設)流量。轉送目標可以是多個版本的服務之一(請參閱文件開頭的詞彙表)。與服務版本關聯的權重決定其接收的流量比例。

redirectHTTPRedirect

一條 HTTP 規則可以回傳 direct_response、重新導向或轉發(預設)流量。如果在規則中指定了流量直通選項,則路由/重新導向將被忽略。重新導向原始指令可用於將 HTTP 301 重新導向傳送到不同的 URI 或授權單位。

directResponseHTTPDirectResponse

一條 HTTP 規則可以回傳 direct_response、重新導向或轉發(預設)流量。Direct Response 用於指定應傳送給客戶端的固定回應。

只有在 RouteRedirect 為空時才能設定。

delegateDelegate

Delegate 用於指定可用於定義委派 HTTPRoute 的特定 VirtualService。

只有在 RouteRedirect 為空時才能設定,並且委派 VirtualService 的路由規則將與目前規則中的路由規則合併。

注意:

  1. 僅支援一層委派。
  2. 委派的 HTTPMatchRequest 必須是根目錄的嚴格子集,否則會發生衝突,HTTPRoute 將不會生效。
rewriteHTTPRewrite

重寫 HTTP URI 和 Authority 標頭。重寫不能與 Redirect 原始指令一起使用。重寫將在轉發之前執行。

timeout持續時間

HTTP 請求的逾時時間,預設為停用。

retriesHTTPRetry

HTTP 請求的重試策略。

注意:如果未指定,預設的叢集範圍重試策略為

attempts: 2
retryOn: "connect-failure,refused-stream,unavailable,cancelled,503"

這可以在 Mesh Config defaultHttpRetryPolicy 中自訂。

faultHTTPFaultInjection

在用戶端套用在 HTTP 流量上的錯誤注入策略。請注意,當在用戶端啟用錯誤時,將不會啟用逾時或重試。

mirrorDestination

除了將請求轉發到預定的目的地之外,還將 HTTP 流量鏡像到另一個目的地。鏡像流量是以盡力而為為基礎,其中 sidecar/閘道不會等待鏡像叢集回應,然後才從原始目的地傳回回應。將會為鏡像目的地產生統計資料。

mirrorsHTTPMirrorPolicy[]

指定除了原始目的地之外,要鏡像 HTTP 流量的目的地。鏡像流量是以盡力而為為基礎,其中 sidecar/閘道不會等待鏡像目的地回應,然後才從原始目的地傳回回應。將會為鏡像目的地產生統計資料。

mirrorPercentagePercent

要由 mirror 欄位鏡像的流量百分比。如果此欄位不存在,將會鏡像所有流量 (100%)。最大值為 100。

corsPolicyCorsPolicy

跨來源資源共享原則 (CORS)。如需關於跨來源資源共享的詳細資訊,請參閱 CORS

headersHeaders

標頭操作規則

Delegate

描述委派 VirtualService。以下路由規則將流量轉發到名為 productpage 的委派 VirtualService 的 /productpage,並將流量轉發到名為 reviews 的委派 VirtualService 的 /reviews

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "bookinfo.com"
  gateways:
  - mygateway
  http:
  - match:
    - uri:
        prefix: "/productpage"
    delegate:
       name: productpage
       namespace: nsA
  - match:
    - uri:
        prefix: "/reviews"
    delegate:
        name: reviews
        namespace: nsB
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: productpage
  namespace: nsA
spec:
  http:
  - match:
     - uri:
        prefix: "/productpage/v1/"
    route:
    - destination:
        host: productpage-v1.nsA.svc.cluster.local
  - route:
    - destination:
        host: productpage.nsA.svc.cluster.local
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
  namespace: nsB
spec:
  http:
  - route:
    - destination:
        host: reviews.nsB.svc.cluster.local
欄位類型描述必要
namestring

Name 指定委派 VirtualService 的名稱。

namespacestring

Namespace 指定委派 VirtualService 所在的命名空間。預設情況下,它與根目錄相同。

Headers

當 Envoy 將請求轉發到目的地服務或從目的地服務傳回回應時,可以操作訊息標頭。可以為特定路由目的地或所有目的地指定標頭操作規則。以下 VirtualService 將 test 標頭以及值 true 新增至路由到任何 reviews 服務目的地的請求。它也會移除 foo 回應標頭,但僅限於來自 reviews 服務的 v1 子集(版本)的回應。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - headers:
      request:
        set:
          test: "true"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      headers:
        response:
          remove:
          - foo
      weight: 75
欄位類型描述必要
requestHeaderOperations

在將請求轉發到目的地服務之前要套用的標頭操作規則

responseHeaderOperations

在將回應傳回給呼叫者之前要套用的標頭操作規則

TLSRoute

描述用於路由未終止 TLS 流量 (TLS/HTTPS) 的比對條件和動作。以下路由規則會根據 SNI 值,將到達名為「mygateway」的閘道之連接埠 443 的未終止 TLS 流量轉發到網格中的內部服務。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-sni
spec:
  hosts:
  - "*.bookinfo.com"
  gateways:
  - mygateway
  tls:
  - match:
    - port: 443
      sniHosts:
      - login.bookinfo.com
    route:
    - destination:
        host: login.prod.svc.cluster.local
  - match:
    - port: 443
      sniHosts:
      - reviews.bookinfo.com
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
欄位類型描述必要
matchTLSMatchAttributes[]

規則被啟動需滿足的匹配條件。單個匹配區塊內的所有條件都具有 AND 語義,而匹配區塊清單具有 OR 語義。如果任何一個匹配區塊成功,則規則會匹配。

routeRouteDestination[]

應該將連線轉發到的目的地。

TCPRoute

描述用於路由 TCP 流量的比對條件和動作。以下路由規則會將到達 mongo.prod.svc.cluster.local 之連接埠 27017 的流量轉發到連接埠 5555 上的另一個 Mongo 伺服器。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-mongo
spec:
  hosts:
  - mongo.prod.svc.cluster.local
  tcp:
  - match:
    - port: 27017
    route:
    - destination:
        host: mongo.backup.svc.cluster.local
        port:
          number: 5555
欄位類型描述必要
matchL4MatchAttributes[]

規則被啟動需滿足的匹配條件。單個匹配區塊內的所有條件都具有 AND 語義,而匹配區塊清單具有 OR 語義。如果任何一個匹配區塊成功,則規則會匹配。

routeRouteDestination[]

應該將連線轉發到的目的地。

HTTPMatchRequest

HttpMatchRequest 指定為了將規則套用到 HTTP 請求而需要符合的一組條件。例如,以下規則將規則限制為僅比對 URL 路徑開頭為 /ratings/v2/ 且請求包含值為 jason 的自訂 end-user 標頭的請求。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - headers:
        end-user:
          exact: jason
      uri:
        prefix: "/ratings/v2/"
      ignoreUriCase: true
    route:
    - destination:
        host: ratings.prod.svc.cluster.local

HTTPMatchRequest 不可以是空的。注意:

  1. 如果根 VirtualService 已使用 regex 比對任何屬性(路徑、標頭等),委派 VirtualService 不應在相同屬性上進行任何其他比對。
  2. 如果委派 VirtualService 已使用 regex 比對任何屬性(路徑、標頭等),根 VirtualService 不應在相同屬性上進行任何其他比對。
欄位類型描述必要
namestring

指派給比對的名稱。比對的名稱將與父路由的名稱串連在一起,並且將在比對此路由的請求的存取記錄中記錄。

uriStringMatch

URI 比對值會區分大小寫,並格式化如下

注意: 可以透過 ignoreUriCase 旗標啟用不區分大小寫的比對。

schemeStringMatch

URI Scheme 值會區分大小寫,並格式化如下

methodStringMatch

HTTP Method 值會區分大小寫,並格式化如下

authorityStringMatch

HTTP Authority 值會區分大小寫,並格式化如下

headersmap<string, StringMatch>

標頭金鑰必須是小寫,並使用連字號作為分隔符號,例如 x-request-id

標頭值會區分大小寫,並格式化如下

如果值為空,並且僅指定了標頭的名稱,則會檢查標頭是否存在。若要提供空值,請使用 {},例如

 - match:
   - headers:
       myheader: {}

注意: 將忽略金鑰 urischememethodauthority

portuint32

指定正在定址的主機上的連接埠。許多服務僅公開單一連接埠或使用它們支援的協定來標記連接埠,在這些情況下,不需要明確選擇連接埠。

sourceLabelsmap<string, string>

一個或多個標籤,用於將規則的適用性限制為具有指定標籤的來源(用戶端)工作負載。如果 VirtualService 在最上層 gateways 欄位中指定了閘道清單,則它必須包含保留的閘道 mesh,此欄位才能適用。

gatewaysstring[]

應該套用規則的閘道名稱。最上層 VirtualService 的 gateways 欄位中的閘道名稱(如果有的話)會被覆寫。閘道比對與 sourceLabels 無關。

queryParamsmap<string, StringMatch>

用於比對的查詢參數。

範例

  • 對於類似「?key=true」的查詢參數,對應的 map 金鑰會是「key」,而字串比對可以定義為 exact: "true"

  • 對於類似「?key」的查詢參數,對應的 map 金鑰會是「key」,而字串比對可以定義為 exact: ""

  • 對於類似「?key=abc」或「?key=abx」的查詢參數,對應的 map 金鑰會是「key」,而字串比對可以定義為 prefix: "ab"

  • 對於類似「?key=123」的查詢參數,對應的 map 金鑰會是「key」,而字串比對可以定義為 regex: "\d+$"。請注意,此組態僅會比對類似「123」的值,但不會比對「a123」或「123a」。

ignoreUriCasebool

指定 URI 比對是否應該不區分大小寫的旗標。

注意: 僅在 exactprefix URI 比對的情況下才會忽略大小寫。

withoutHeadersmap<string, StringMatch>

withoutHeader 的語法與標頭相同,但意義相反。如果標頭與 withoutHeader 中的比對規則比對,則流量將變成不比對的流量。

sourceNamespacestring

來源命名空間限制規則對該命名空間中工作負載的適用性。如果 VirtualService 在最上層 gateways 欄位中指定了閘道清單,則它應包含保留的閘道 mesh,此欄位才能適用。

statPrefixstring

在發出此路由的統計資料時要使用的人類可讀前置字元。統計資料會以前置字元 route.<stat_prefix> 產生。這應該設定為需要取得「每個路由」統計資料的高度重要路由。此前置字元僅用於 Proxy 層級的統計資料 (envoy_*),而不適用於服務層級的統計資料 (istio_*)。請參閱 https://envoy.dev.org.tw/docs/envoy/latest/api-v3/config/route/v3/route_components.proto#envoy-v3-api-field-config-route-v3-route-stat-prefix,以瞭解設定此選項時產生的統計資料。

HTTPRouteDestination

每個路由規則都與一個或多個服務版本相關聯(請參閱文件開頭的詞彙表)。與版本相關聯的權重決定了它接收的流量比例。例如,以下規則會將「reviews」服務的 25% 流量路由到帶有「v2」標籤的執行個體,其餘流量(即 75%)則路由到「v1」。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      weight: 75

以及相關聯的 DestinationRule

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-destination
spec:
  host: reviews.prod.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

流量也可以在兩個完全不同的服務之間分割,而無需定義新的子集。例如,以下規則會將 25% 的流量從 reviews.com 轉發到 dev.reviews.com

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route-two-domains
spec:
  hosts:
  - reviews.com
  http:
  - route:
    - destination:
        host: dev.reviews.com
      weight: 25
    - destination:
        host: reviews.com
      weight: 75
欄位類型描述必要
destinationDestination

目的地會唯一識別應該將請求/連線轉發到的服務執行個體。

weightint32

權重指定要轉發到目的地的相對流量比例。目的地將接收 weight/(所有權重總和) 個請求。如果規則中只有一個目的地,則它將接收所有流量。否則,如果權重為 0,則目的地將不會接收任何流量。

headersHeaders

標頭操作規則

RouteDestination

L4 路由規則加權目的地。

欄位類型描述必要
destinationDestination

目的地會唯一識別應該將請求/連線轉發到的服務執行個體。

weightint32

權重指定要轉發到目的地的相對流量比例。目的地將接收 weight/(所有權重總和) 個請求。如果規則中只有一個目的地,則它將接收所有流量。否則,如果權重為 0,則目的地將不會接收任何流量。

L4MatchAttributes

L4 連線比對屬性。請注意,L4 連線比對支援尚未完成。

欄位類型描述必要
destinationSubnetsstring[]

具有選用子網路的目的地 IPv4 或 IPv6 IP 位址。例如,a.b.c.d/xx 形式或僅限 a.b.c.d。

portuint32

指定正在定址的主機上的連接埠。許多服務僅公開單一連接埠或使用它們支援的協定來標記連接埠,在這些情況下,不需要明確選擇連接埠。

sourceLabelsmap<string, string>

一個或多個標籤,用於將規則的適用性限制為具有指定標籤的工作負載。如果 VirtualService 在最上層 gateways 欄位中指定了閘道清單,則它應包含保留的閘道 mesh,此欄位才能適用。

gatewaysstring[]

應該套用規則的閘道名稱。最上層 VirtualService 的 gateways 欄位中的閘道名稱(如果有的話)會被覆寫。閘道比對與 sourceLabels 無關。

sourceNamespacestring

來源命名空間限制規則對該命名空間中工作負載的適用性。如果 VirtualService 在最上層 gateways 欄位中指定了閘道清單,則它應包含保留的閘道 mesh,此欄位才能適用。

TLSMatchAttributes

TLS 連線比對屬性。

欄位類型描述必要
sniHostsstring[]

要比對的 SNI(伺服器名稱指示)。萬用字元前置字元可以在 SNI 值中使用,例如,*.com 將會比對 foo.example.com 和 example.com。SNI 值必須是相應 Virtual Service 主機的子集(即,落在網域內)。

destinationSubnetsstring[]

具有選用子網路的目的地 IPv4 或 IPv6 IP 位址。例如,a.b.c.d/xx 形式或僅限 a.b.c.d。

portuint32

指定正在定址的主機上的連接埠。許多服務僅公開單一連接埠或使用它們支援的協定來標記連接埠,在這些情況下,不需要明確選擇連接埠。

sourceLabelsmap<string, string>

一個或多個標籤,用於將規則的適用性限制為具有指定標籤的工作負載。如果 VirtualService 在最上層 gateways 欄位中指定了閘道清單,則它應包含保留的閘道 mesh,此欄位才能適用。

gatewaysstring[]

應該套用規則的閘道名稱。最上層 VirtualService 的 gateways 欄位中的閘道名稱(如果有的話)會被覆寫。閘道比對與 sourceLabels 無關。

sourceNamespacestring

來源命名空間限制規則對該命名空間中工作負載的適用性。如果 VirtualService 在最上層 gateways 欄位中指定了閘道清單,則它應包含保留的閘道 mesh,此欄位才能適用。

HTTPRedirect

HTTPRedirect 可用於向呼叫者傳送 301 重新導向回應,其中回應中的 Authority/Host 和 URI 可以與指定的值交換。例如,以下規則會將 ratings 服務上對 /v1/getProductRatings API 的請求重新導向到 bookratings 服務提供的 /v1/bookRatings。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    redirect:
      uri: /v1/bookRatings
      authority: newratings.default.svc.cluster.local
  ...
欄位類型描述必要
uristring

在重新導向上,以這個值覆寫 URL 的路徑部分。請注意,無論請求 URI 是以完全符合路徑還是前綴匹配,整個路徑都會被替換。

authoritystring

在重新導向上,以這個值覆寫 URL 的 Authority/Host 部分。

portuint32 (oneof)

在重新導向上,以這個值覆寫 URL 的 Port 部分。

derivePortRedirectPortSelection (oneof)

在重新導向上,動態設定 Port

  • FROM_PROTOCOL_DEFAULT: 自動設定為 HTTP 的 80 和 HTTPS 的 443。
  • FROM_REQUEST_PORT: 自動使用請求的 Port。
schemestring

在重新導向上,以這個值覆寫 URL 的 scheme 部分。例如,httphttps。如果未設定,則將使用原始的 scheme。如果 derivePort 設定為 FROM_PROTOCOL_DEFAULT,這也會影響使用的 Port

redirectCodeuint32

在重新導向上,指定要在重新導向回應中使用的 HTTP 狀態碼。預設的回應碼為 MOVED_PERMANENTLY (301)。

HTTPDirectResponse

HTTPDirectResponse 可用於向用戶端傳送固定的回應。例如,以下規則會對 /v1/getProductRatings API 的請求傳回固定的 503 狀態和主體。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    directResponse:
      status: 503
      body:
        string: "unknown error"
  ...

也可以指定二進位回應主體。這對於非基於文字的協定(例如 gRPC)最為有用。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    directResponse:
      status: 503
      body:
        bytes: "dW5rbm93biBlcnJvcg==" # "unknown error" in base64
  ...

在 HTTPRoute 以及 direct_response 中新增標頭是很好的實務,例如指定傳回的 Content-Type。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        exact: /v1/getProductRatings
    directResponse:
      status: 503
      body:
        string: "{\"error\": \"unknown error\"}"
    headers:
      response:
        set:
          content-type: "text/plain"
  ...
欄位類型描述必要
statusuint32

指定要傳回的 HTTP 回應狀態。

bodyHTTPBody

指定回應主體的內容。如果省略此設定,則產生的回應中不包含主體。

HTTPBody

欄位類型描述必要
stringstring (oneof)

回應主體為字串

bytesbytes (oneof)

回應主體為 base64 編碼的位元組。

HTTPRewrite

HTTPRewrite 可用於在將請求轉發到目的地之前,重寫 HTTP 請求的特定部分。重寫基本類型只能與 HTTPRouteDestination 一起使用。以下範例示範如何在進行實際 API 呼叫之前,重寫 api 呼叫 (/ratings) 到 ratings 服務的 URL 前綴。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        prefix: /ratings
    rewrite:
      uri: /v1/bookRatings
    route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
欄位類型描述必要
uristring

以這個值重寫 URI 的路徑(或前綴)部分。如果原始 URI 是基於前綴匹配的,則此欄位中提供的值將取代對應的匹配前綴。

authoritystring

以這個值重寫 Authority/Host 標頭。

uriRegexRewriteRegexRewrite

使用指定的 Regex 重寫 URI 的路徑部分。

RegexRewrite

欄位類型描述必要
matchstring

RE2 樣式的基於 Regex 的匹配.

rewritestring

應該替換為原始 URI 的匹配部分的字串。模式中的捕獲群組可以在新的 URI 中引用。範例

範例 1:使用捕獲群組重寫路徑模式「/service/update/v1/api」,其匹配項為「^/service/([^/]+)(/.*)$」,重寫字串為「/customprefix/\2/\1」將轉換為「/customprefix/v1/api/update」。

範例 2:不區分大小寫的重寫路徑模式「/aaa/XxX/bbb」,其匹配項為「(?i)/xxx/」,重寫字串為 /yyy/,將進行不區分大小寫的匹配,並將路徑轉換為「/aaa/yyy/bbb」。

StringMatch

描述如何在 HTTP 標頭中匹配給定的字串。exactprefix 匹配區分大小寫。regex 匹配支援不區分大小寫的匹配。

欄位類型描述必要
exactstring (oneof)

完全字串匹配

prefixstring (oneof)

基於前綴的匹配

regexstring (oneof)

RE2 樣式的基於 Regex 的匹配.

範例:(?i)^aaa$ 可用於不區分大小寫地匹配由三個 a 組成的字串。

HTTPRetry

描述 HTTP 請求失敗時要使用的重試原則。例如,以下規則設定呼叫 ratings:v1 服務時允許的最大重試次數為 3 次,每次重試嘗試的逾時時間為 2 秒。如果發生連線失敗、拒絕串流或上游伺服器回應 Service Unavailable(503) 錯誤,則會嘗試重試。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: gateway-error,connect-failure,refused-stream
欄位類型描述必要
attemptsint32

允許對給定請求進行的重試次數。重試之間的時間間隔將自動決定 (25ms+)。當設定HTTP 路由的請求 timeoutper_try_timeout 時,嘗試的實際重試次數也取決於指定的請求 timeoutper_try_timeout 值。必須 >= 0。如果為 0,則會停用重試。發出的最大可能請求次數為 1 + attempts

perTryTimeout持續時間

給定請求的每次嘗試(包括初始呼叫和任何重試)的逾時時間。格式:1h/1m/1s/1ms。必須 >=1ms。預設值與 HTTP 路由的請求 timeout 值相同,表示沒有逾時。

retryOnstring

指定發生重試的條件。可以使用以「,」分隔的清單指定一或多個原則。請參閱重試原則gRPC 重試原則以了解更多詳細資訊。

除了上述指定的原則之外,還可以傳遞 HTTP 狀態碼的清單,例如 retryOn: "503,reset"。請注意,這些狀態碼是指從目的地收到的實際回應。例如,如果連線重設,Istio 會將其轉換為 503 以作為其回應。但是,目的地並未傳回 503 錯誤,因此這不會與 "503" 匹配(但會與 "reset" 匹配)。

如果未指定,則預設為 connect-failure,refused-stream,unavailable,cancelled,503

retryRemoteLocalitiesBoolValue

指定重試是否應重試其他區域的旗標。請參閱 重試外掛程式設定以了解更多詳細資訊。

CorsPolicy

描述給定服務的跨來源資源共享 (CORS) 原則。請參閱 CORS 以了解更多有關跨來源資源共享的詳細資訊。例如,以下規則將跨來源請求限制為來自 example.com 網域的請求(使用 HTTP POST/GET),並將 Access-Control-Allow-Credentials 標頭設定為 false。此外,它只會公開 X-Foo-bar 標頭,並設定 1 天的到期期限。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
    corsPolicy:
      allowOrigins:
      - exact: https://example.com
      allowMethods:
      - POST
      - GET
      allowCredentials: false
      allowHeaders:
      - X-Foo-Bar
      maxAge: "24h"
欄位類型描述必要
allowOriginsStringMatch[]

與允許的來源匹配的字串模式。如果任何字串匹配器匹配,則允許來源。如果找到匹配項,則傳出的 Access-Control-Allow-Origin 將設定為用戶端提供的來源。

allowMethodsstring[]

允許存取資源的 HTTP 方法清單。內容將序列化為 Access-Control-Allow-Methods 標頭。

allowHeadersstring[]

請求資源時可以使用的 HTTP 標頭清單。序列化為 Access-Control-Allow-Headers 標頭。

exposeHeadersstring[]

瀏覽器允許存取的 HTTP 標頭清單。序列化為 Access-Control-Expose-Headers 標頭。

maxAge持續時間

指定預檢請求的結果可以快取多長時間。轉換為 Access-Control-Max-Age 標頭。

allowCredentialsBoolValue

指示是否允許呼叫者使用憑證傳送實際請求(而非預檢請求)。轉換為 Access-Control-Allow-Credentials 標頭。

unmatchedPreflightsUnmatchedPreflights

指示不符合設定的允許來源的預檢請求是否不應轉發到上游。預設為轉發到上游。

HTTPFaultInjection

HTTPFaultInjection 可用於指定一或多個要在將 HTTP 請求轉發到路由中指定的目的地時注入的錯誤。錯誤規格是 VirtualService 規則的一部分。錯誤包括從下游服務中止 Http 請求和/或延遲請求的 Proxy 處理。錯誤規則必須具有延遲或中止或兩者。

注意: 延遲和中止錯誤彼此獨立,即使同時指定兩者。

欄位類型描述必要
delayDelay

延遲請求後再轉發,模擬各種失敗,例如網路問題、上游服務過載等。

abortAbort

中止 Http 請求嘗試並將錯誤碼傳回下游服務,讓人覺得上游服務有問題。

HTTPMirrorPolicy

HTTPMirrorPolicy 可用於指定除了原始目的地之外,還要鏡像 HTTP 流量的目的地。鏡像流量是盡力而為,側車/閘道不會等待鏡像目的地回應,才會傳回來自原始目的地的回應。將為鏡像目的地產生統計資料。

欄位類型描述必要
destinationDestination

Destination 指定鏡像作業的目標。

percentagePercent

destination 欄位鏡像的流量百分比。如果此欄位不存在,則會鏡像所有流量 (100%)。最大值為 100。

PortSelector

PortSelector 指定要用於匹配或選取最終路由的 Port 號碼。

欄位類型描述必要
numberuint32

有效的 Port 號碼

Percent

Percent 指定 [0.0, 100.0] 範圍內的百分比。

欄位類型描述必要
valuedouble

Headers.HeaderOperations

HeaderOperations 描述要應用的標頭操作

欄位類型描述必要
setmap<string, string>

使用給定的值覆寫以金鑰指定的標頭

addmap<string, string>

將給定的值附加到以金鑰指定的標頭(將建立以逗號分隔的值清單)

removestring[]

移除指定的標頭

HTTPFaultInjection.Delay

延遲規格用於將延遲注入請求轉發路徑。以下範例會在所有具有標籤 env: prod 的 Pod 中,每 1000 個請求中對「reviews」服務的「v1」版本引入 5 秒的延遲

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - match:
    - sourceLabels:
        env: prod
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
    fault:
      delay:
        percentage:
          value: 0.1
        fixedDelay: 5s

fixedDelay 欄位用於表示延遲的秒數。選用的 percentage 欄位可以用於僅延遲特定百分比的請求。如果未指定,則不會延遲任何請求。

欄位類型描述必要
fixedDelayDuration (oneof)

在轉發請求之前新增固定延遲。格式:1h/1m/1s/1ms。必須 >=1ms。

percentagePercent

將注入延遲的請求百分比。如果未指定,則不會延遲任何請求。

percentint32

將注入延遲的請求百分比 (0-100)。不建議使用整數 percent 值。請改用 double percentage 欄位。

HTTPFaultInjection.Abort

中止規格用於以預先指定的錯誤碼過早中止請求。以下範例會針對「ratings」服務「v1」的每 1000 個請求中的 1 個傳回 HTTP 400 錯誤碼。

apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1
    fault:
      abort:
        percentage:
          value: 0.1
        httpStatus: 400

httpStatus 欄位用於指示要傳回給呼叫端的 HTTP 狀態碼。選擇性的 percentage 欄位可用於僅中止特定百分比的請求。如果未指定,則不會中止任何請求。

欄位類型描述必要
httpStatusint32 (oneof)

用於中止 HTTP 請求的 HTTP 狀態碼。

grpcStatusstring (oneof)

用於中止請求的 GRPC 狀態碼。支援的程式碼記錄在 https://github.com/grpc/grpc/blob/master/doc/statuscodes.md。注意:如果您想傳回「Unavailable」狀態,則應將程式碼指定為 UNAVAILABLE (全部大寫),而不是 14

percentagePercent

要以提供的錯誤碼中止的請求百分比。如果未指定,則不會中止任何請求。

google.protobuf.UInt32Value

uint32 的包裝訊息。

UInt32Value 的 JSON 表示法是 JSON 數字。

欄位類型描述必要
valueuint32

uint32 值。

HTTPRedirect.RedirectPortSelection

名稱描述
FROM_PROTOCOL_DEFAULT
FROM_REQUEST_PORT

CorsPolicy.UnmatchedPreflights

名稱描述
UNSPECIFIED

預設為 FORWARD

FORWARD

不符合設定的允許來源的預檢請求將會轉發到上游。

IGNORE

不符合設定的允許來源的預檢請求將不會轉發到上游。

這個資訊有用嗎?
您有任何改進建議嗎?

感謝您的回饋!