目的地規則

DestinationRule 定義在路由發生後,套用至目標為服務的流量的原則。這些規則指定了負載平衡、來自 Sidecar 的連線池大小,以及用於偵測和從負載平衡池中移除不健康主機的離群值偵測設定。例如,用於評分服務的簡單負載平衡策略如下所示

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_REQUEST

可以透過定義一個名為 subset 的子集,並覆寫服務層級指定的設定來指定版本特定的原則。以下規則使用循環配置 (round robin) 負載平衡策略,用於所有前往名為 testversion 的子集的流量,該子集由具有標籤 (version:v3) 的端點 (例如 pod) 組成。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_REQUEST
  subsets:
  - name: testversion
    labels:
      version: v3
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN

注意:針對子集指定的原則,必須等到路由規則明確將流量傳送至該子集才會生效。

流量策略也可以自訂為特定連接埠。以下規則將最小連線負載平衡策略用於所有傳往連接埠 80 的流量,同時將循環配置負載平衡設定用於傳往連接埠 9080 的流量。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-ratings-port
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy: # Apply to all ports
    portLevelSettings:
    - port:
        number: 80
      loadBalancer:
        simple: LEAST_REQUEST
    - port:
        number: 9080
      loadBalancer:
        simple: ROUND_ROBIN

Destination Rules 也可以自訂為特定工作負載。以下範例示範如何使用 workloadSelector 設定將目標規則套用至特定工作負載。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: configure-client-mtls-dr-with-workloadselector
spec:
  host: example.com
  workloadSelector:
    matchLabels:
      app: ratings
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
    - port:
        number: 31443
      tls:
        credentialName: client-credential
        mode: MUTUAL

DestinationRule

DestinationRule 定義在路由發生後,套用至目標為服務的流量的原則。

欄位類型描述必要
hoststring

服務註冊表中的服務名稱。服務名稱會從平台服務註冊表 (例如 Kubernetes 服務、Consul 服務等) 以及 ServiceEntries 宣告的主機中查閱。針對服務註冊表中不存在的服務定義的規則將被忽略。

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

請注意,host 欄位適用於 HTTP 和 TCP 服務。

trafficPolicyTrafficPolicy

要套用的流量策略 (負載平衡策略、連線池大小、離群值偵測)。

subsetsSubset[]

一個或多個命名的集合,代表服務的個別版本。流量策略可以在子集層級覆寫。

exportTostring[]

此目標規則匯出的命名空間清單。將目標規則套用至服務的解析發生在命名空間階層的內容中。匯出目標規則可讓它包含在其他命名空間中服務的解析階層中。此功能為服務擁有者和網格管理員提供了一種機制,可以控制目標規則在跨命名空間邊界的可見性。

如果未指定任何命名空間,則預設會將目標規則匯出至所有命名空間。

值「.」是保留的,並定義匯出至宣告目標規則的相同命名空間。同樣地,值「*」是保留的,並定義匯出至所有命名空間。

workloadSelectorWorkloadSelector

用於選取應套用此 DestinationRule 設定的特定 Pod/VM 集的準則。如果指定,則只會將 DestinationRule 設定套用至符合相同命名空間中工作負載選取器標籤的工作負載執行個體。工作負載選取器不會跨命名空間邊界套用。如果省略,DestinationRule 會回復為其預設行為。例如,如果特定 Sidecar 需要為網格外服務設定輸出 TLS 設定,而非網格中的每個 Sidecar 都需要設定 (這是預設行為),則可以指定工作負載選取器。

TrafficPolicy

針對特定目標套用的流量策略,跨所有目標連接埠。如需範例,請參閱 DestinationRule。

欄位類型描述必要
loadBalancerLoadBalancerSettings

控制負載平衡器演算法的設定。

connectionPoolConnectionPoolSettings

控制上游服務連線量的設定

outlierDetectionOutlierDetection

控制從負載平衡池中移除不健康主機的設定

tlsClientTLSSettings

連線至上游服務的 TLS 相關設定。

portLevelSettingsPortTrafficPolicy[]

特定於個別連接埠的流量策略。請注意,連接埠層級設定將會覆寫目標層級設定。在目標層級指定的流量設定在被連接埠層級設定覆寫時不會被繼承,也就是說,預設值將會套用至連接埠層級流量策略中省略的欄位。

tunnelTunnelSettings

針對 DestinationRule 中設定的主機,透過其他傳輸層或應用層隧道傳輸 TCP 的設定。通道設定可以套用至 TCP 或 TLS 路由,但無法套用至 HTTP 路由。

proxyProtocolProxyProtocol

上游 PROXY 協定設定。

Subset

服務的端點子集。子集可以用於 A/B 測試等情境,或路由至特定版本的服務。如需在這些情境中使用子集的範例,請參閱 VirtualService 文件。此外,在服務層級定義的流量策略可以在子集層級覆寫。以下規則使用循環配置負載平衡策略,用於所有前往名為 testversion 的子集的流量,該子集由具有標籤 (version:v3) 的端點 (例如 pod) 組成。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_REQUEST
  subsets:
  - name: testversion
    labels:
      version: v3
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN

注意:針對子集指定的原則,必須等到路由規則明確將流量傳送至該子集才會生效。

通常需要一個或多個標籤來識別子集目標,但是,當對應的 DestinationRule 代表支援多個 SNI 主機 (例如輸出閘道) 的主機時,沒有標籤的子集可能會有意義。在這種情況下,具有 ClientTLSSettings 的流量策略可以用來識別對應於指定子集的特定 SNI 主機。

欄位類型描述必要
namestring

子集的名稱。服務名稱和子集名稱可以用於路由規則中的流量分割。

labelsmap<string, string>

標籤會對服務註冊表中的服務端點套用篩選器。如需使用範例,請參閱路由規則。

trafficPolicyTrafficPolicy

套用至此子集的流量策略。子集會繼承在 DestinationRule 層級指定的流量策略。在子集層級指定的設定將覆寫在 DestinationRule 層級指定的對應設定。

LoadBalancerSettings

套用至特定目標的負載平衡策略。如需更多詳細資訊,請參閱 Envoy 的負載平衡文件

例如,以下規則會針對所有傳往評分服務的流量使用循環配置負載平衡策略。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN

以下範例使用 User Cookie 作為雜湊索引鍵,為相同評分服務的雜湊式負載平衡器設定持續性工作階段。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      consistentHash:
        httpCookie:
          name: user
          ttl: 0s
欄位類型描述必要
simpleSimpleLB (其中一個)
consistentHashConsistentHashLB (其中一個)
localityLbSetting本地負載平衡器設定

本地負載平衡器設定,這將完全覆寫網格範圍設定,這表示此物件與 MeshConfig 中的物件之間不會執行任何合併

warmupDurationSecsDuration

代表服務的預熱持續時間。如果設定此值,服務新建立的端點會從建立時間開始,在該視窗的持續時間內保持在預熱模式,而且 Istio 會逐步增加該端點的流量,而非傳送成比例的流量。這應該針對需要預熱時間才能以合理的延遲處理完整生產負載的服務啟用。請注意,當少數新端點出現時,例如 Kubernetes 中的擴展事件,此值最有效。當所有端點都相對較新時,例如新的部署,此值不是很有效,因為所有端點最終都會收到相同數量的請求。目前,只有 ROUND_ROBIN 和 LEAST_REQUEST 負載平衡器支援此值。

ConnectionPoolSettings

上游主機的連線池設定。設定會套用至上游服務中的每個個別主機。如需更多詳細資訊,請參閱 Envoy 的斷路器。連線池設定可以套用在 TCP 層級以及 HTTP 層級。

例如,以下規則會將名為 myredissrv 的 redis 服務的連線數限制為 100 個,連線逾時時間為 30 毫秒

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: bookinfo-redis
spec:
  host: myredissrv.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
        connectTimeout: 30ms
        tcpKeepalive:
          time: 7200s
          interval: 75s
欄位類型描述必要
tcpTCPSettings

HTTP 和 TCP 上游連線共用的設定。

httpHTTPSettings

HTTP 連線池設定。

OutlierDetection

追蹤上游服務中每個個別主機狀態的斷路器實作。適用於 HTTP 和 TCP 服務。對於 HTTP 服務,持續為 API 呼叫傳回 5xx 錯誤的主機會在預先定義的時間段內從集區中移除。對於 TCP 服務,連線逾時或連線至指定主機失敗會被視為測量連續錯誤計量時的錯誤。如需更多詳細資訊,請參閱 Envoy 的離群值偵測

以下規則會將「reviews」服務的連線池大小設定為 100 個 HTTP1 連線,每個連線不超過 10 個 req。此外,它會設定 1000 個並行 HTTP2 請求的限制,並設定每 5 分鐘掃描一次上游主機,以便任何連續失敗 7 次且傳回 502、503 或 504 錯誤碼的主機都會被移除 15 分鐘。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-cb-policy
spec:
  host: reviews.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        http2MaxRequests: 1000
        maxRequestsPerConnection: 10
    outlierDetection:
      consecutive5xxErrors: 7
      interval: 5m
      baseEjectionTime: 15m
欄位類型描述必要
splitExternalLocalOriginErrorsbool

判斷是否要區分本機來源失敗與外部錯誤。如果設定為 true,則在離群值偵測計算中會將 consecutive_local_origin_failure 列入考量。當您想要根據在本機看到的錯誤 (例如,連線失敗、連線時逾時等) 而非上游服務傳回的狀態碼來推導離群值偵測狀態時,應該使用此設定。當上游服務明確針對某些請求傳回 5xx 時,並且您想要在判斷主機的離群值偵測狀態時忽略來自上游服務的這些回應,這尤其有用。預設值為 false。

consecutiveLocalOriginFailuresUInt32Value

發生移除之前的連續本機來源失敗次數。預設值為 5。只有在 split_external_local_origin_errors 設定為 true 時,參數才會生效。

consecutiveGatewayErrorsUInt32Value

在主機從連線池中移除之前的閘道錯誤數。當透過 HTTP 存取上游主機時,502、503 或 504 傳回碼符合閘道錯誤的資格。當透過不透明 TCP 連線存取上游主機時,連線逾時和連線錯誤/失敗事件符合閘道錯誤的資格。此功能預設為停用,或設定為值 0 時停用。

請注意,consecutive_gateway_errors 和 consecutive_5xx_errors 可以分開或一起使用。由於 consecutive_gateway_errors 計算的錯誤也包含在 consecutive_5xx_errors 中,因此如果 consecutive_gateway_errors 的值大於或等於 consecutive_5xx_errors 的值,則 consecutive_gateway_errors 將不會有任何作用。

consecutive5xxErrorsUInt32Value

在主機從連線池中彈出之前,發生 5xx 錯誤的次數。當透過不透明 TCP 連線存取上游主機時,連線逾時、連線錯誤/失敗和請求失敗事件都算作 5xx 錯誤。此功能的預設值為 5,但可以透過將值設為 0 來停用。

請注意,consecutive_gateway_errors 和 consecutive_5xx_errors 可以分開或一起使用。由於 consecutive_gateway_errors 計算的錯誤也包含在 consecutive_5xx_errors 中,因此如果 consecutive_gateway_errors 的值大於或等於 consecutive_5xx_errors 的值,則 consecutive_gateway_errors 將不會有任何作用。

間隔Duration

彈出掃描分析之間的時間間隔。格式:1h/1m/1s/1ms。必須 >=1ms。預設值為 10 秒。

baseEjectionTimeDuration

最短彈出持續時間。主機將保持彈出狀態一段時間,該時間等於最短彈出持續時間與主機被彈出次數的乘積。這種技術允許系統自動增加不健康上游伺服器的彈出時間。格式:1h/1m/1s/1ms。必須 >=1ms。預設值為 30 秒。

maxEjectionPercentint32

上游服務的負載平衡池中可以彈出的主機最大百分比。預設值為 10%。

minHealthPercentint32

只要相關聯的負載平衡池中至少有 min_health_percent 個主機處於健康模式,就會啟用離群值偵測。當負載平衡池中健康主機的百分比低於此閾值時,離群值偵測將被停用,並且代理將在池中的所有主機(健康和不健康)之間進行負載平衡。可以透過將其設定為 0% 來停用閾值。預設值為 0%,因為它通常不適用於每個服務只有少數 Pod 的 k8s 環境。

ClientTLSSettings

用於上游連線的 SSL/TLS 相關設定。有關更多詳細資訊,請參閱 Envoy 的 TLS context。這些設定對於 HTTP 和 TCP 上游都是通用的。

例如,以下規則設定用戶端對上游資料庫叢集的連線使用相互 TLS。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: db-mtls
spec:
  host: mydbserver.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: MUTUAL
      clientCertificate: /etc/certs/myclientcert.pem
      privateKey: /etc/certs/client_private_key.pem
      caCertificates: /etc/certs/rootcacerts.pem

以下規則設定用戶端在與網域符合 *.foo.com 的外部服務通訊時使用 TLS。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: tls-foo
spec:
  host: "*.foo.com"
  trafficPolicy:
    tls:
      mode: SIMPLE

以下規則設定用戶端在與評分服務通訊時使用 Istio 相互 TLS。

apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: ratings-istio-mtls
spec:
  host: ratings.prod.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
欄位類型描述必要
modeTLSmode

指示是否應使用 TLS 保護到此連接埠的連線。此欄位的值決定如何強制執行 TLS。

clientCertificatestring

如果 mode 是 MUTUAL,則為 REQUIRED。要使用的用戶端 TLS 憑證檔案的路徑。如果 mode 是 ISTIO_MUTUAL,則應為空。

privateKeystring

如果 mode 是 MUTUAL,則為 REQUIRED。用戶端私鑰檔案的路徑。如果 mode 是 ISTIO_MUTUAL,則應為空。

caCertificatesstring

選填:用於驗證呈現的伺服器憑證時,包含憑證授權憑證的檔案路徑。如果省略,代理將使用作業系統 CA 憑證來驗證伺服器的憑證。如果 mode 是 ISTIO_MUTUAL,則應為空。

credentialNamestring

保存用戶端 TLS 憑證(包括 CA 憑證)的密鑰名稱。此密鑰必須存在於使用憑證的代理的命名空間中。一個 Opaque 密鑰應包含以下鍵和值:key: <privateKey>cert: <clientCert>cacert: <CACertificate>crl: <certificateRevocationList>。此處的 CACertificate 用於驗證伺服器憑證。對於相互 TLS,cacert: <CACertificate> 可以在同一個密鑰中提供,也可以在單獨名為 <secret>-cacert 的密鑰中提供。還支援具有用於 CA 憑證的額外 ca.crt 鍵和用於憑證撤銷清單 (CRL) 的 ca.crl 鍵的用戶端憑證 TLS 密鑰。只能指定用戶端憑證和 CA 憑證或 credentialName 中的一個。

注意:只有在 DestinationRule 指定了 workloadSelector 時,此欄位才適用於 Sidecar。否則,該欄位僅適用於閘道,而 Sidecar 將繼續使用憑證路徑。

subjectAltNamesstring[]

用於驗證憑證中主體身分的可選名稱清單。如果指定,代理將驗證伺服器憑證的主體替代名稱是否與指定的值之一匹配。如果指定,此清單會覆蓋 ServiceEntry 中 subject_alt_names 的值。如果未指定,則將基於下游 HTTP 主機/授權標頭對新上游連線自動驗證上游呈現的憑證。

snistring

在 TLS 交握期間呈現給伺服器的 SNI 字串。如果未指定,則 SNI 將根據 SIMPLE 和 MUTUAL TLS 模式的下游 HTTP 主機/授權標頭自動設定。

insecureSkipVerifyBoolValue

insecureSkipVerify 指定代理是否應跳過驗證對應於主機的伺服器憑證的 CA 簽名和 SAN。此欄位的預設值為 false。

caCrlstring

選填:用於驗證呈現的伺服器憑證時,包含憑證撤銷清單 (CRL) 的檔案路徑。CRL 是 CA(憑證授權單位)在其預定的到期日之前撤銷的憑證清單。如果指定,代理將驗證呈現的憑證是否屬於撤銷的憑證清單。如果省略,代理將不會根據 crl 驗證憑證。

本地負載平衡器設定

位置加權負載平衡允許管理員根據流量的來源位置和終止位置來控制流量到端點的分佈。這些位置使用任意標籤指定,這些標籤以 {地區}/{區域}/{子區域} 形式指定位置的層次結構。有關更多詳細資訊,請參閱 位置權重。以下範例顯示如何設定網格範圍內的位置權重。

假設一個網格,其工作負載及其服務部署到「us-west/zone1/*」和「us-west/zone2/*」。此範例指定,當存取服務的流量來自「us-west/zone1/*」中的工作負載時,80% 的流量將傳送到「us-west/zone1/*」中的端點,即同一區域,其餘 20% 將傳送到「us-west/zone2/*」中的端點。此設定旨在傾向於將流量路由到同一位置中的端點。對於來自「us-west/zone2/*」的流量,也指定了類似的設定。

  distribute:
    - from: us-west/zone1/*
      to:
        "us-west/zone1/*": 80
        "us-west/zone2/*": 20
    - from: us-west/zone2/*
      to:
        "us-west/zone1/*": 20
        "us-west/zone2/*": 80

如果運營商的目標不是在區域和地區之間分配負載,而是限制故障轉移的區域性以滿足其他運營要求,則運營商可以設定「故障轉移」原則而不是「分配」原則。

以下範例為地區設定了位置故障轉移原則。假設一個服務位於 us-east、us-west 和 eu-west 內的區域中,此範例指定當 us-east 內的端點變得不健康時,流量應故障轉移到 eu-west 內任何區域或子區域中的端點,類似地,us-west 應故障轉移到 us-east。

 failover:
   - from: us-east
     to: eu-west
   - from: us-west
     to: us-east

位置負載平衡設定。

欄位類型描述必要
distributeDistribute[]

選填:只能設定 distribute、failover 或 failoverPriority 中的一個。明確指定跨不同區域和地理位置的負載平衡權重。請參閱 位置加權負載平衡。如果為空,則位置權重將根據其中的端點數量設定。

failoverFailover[]

選填:只能設定 distribute、failover 或 failoverPriority 中的一個。明確指定當本地區域中的端點變得不健康時流量將落入的地區。應與 OutlierDetection 一起使用以偵測不健康的端點。注意:如果未指定 OutlierDetection,則此設定將不會生效。

failoverPrioritystring[]

failoverPriority 是用於排序端點以執行基於優先順序的負載平衡的標籤的有序清單。這是為了支援跨不同端點群組的流量故障轉移。可以指定兩種標籤

  • 僅指定標籤鍵 [key1, key2, key3],istio 將比較用戶端的標籤值與端點。假設總共指定了 N 個標籤鍵 [key1, key2, key3, ...keyN]

    1. 與用戶端代理匹配所有 N 個標籤的端點具有優先順序 P(0),即最高優先順序。
    2. 與用戶端代理匹配前 N-1 個標籤的端點具有優先順序 P(1),即第二高優先順序。
    3. 根據此邏輯的擴展,僅與用戶端代理匹配第一個標籤的端點具有優先順序 P(N-1),即第二低優先順序。
    4. 所有其他端點都具有優先順序 P(N),即最低優先順序。
  • 使用鍵和值指定標籤 [key1=value1, key2=value2, key3=value3],istio 將比較標籤與端點。假設總共指定了 N 個標籤 [key1=value1, key2=value2, key3=value3, ...keyN=valueN]

    1. 匹配所有 N 個標籤的端點具有優先順序 P(0),即最高優先順序。
    2. 匹配前 N-1 個標籤的端點具有優先順序 P(1),即第二高優先順序。
    3. 根據此邏輯的擴展,僅匹配第一個標籤的端點具有優先順序 P(N-1),即第二低優先順序。
    4. 所有其他端點都具有優先順序 P(N),即最低優先順序。

注意:為了考慮標籤是否匹配,之前的標籤必須匹配,即只有在前 n-1 個標籤匹配時,才會考慮第 n 個標籤匹配。

它可以是用戶端和伺服器工作負載上指定的任何標籤。還支援以下具有特殊語義含義的標籤

  • topology.istio.io/network 用於匹配端點的網路中繼資料,可以使用 Pod/命名空間標籤 topology.istio.io/network、Sidecar 環境 ISTIO_META_NETWORK 或 MeshNetworks 來指定。
  • topology.istio.io/cluster 用於匹配端點的叢集 ID,可以使用 Pod 標籤 topology.istio.io/cluster 或 Pod 環境 ISTIO_META_CLUSTER_ID 來指定。
  • topology.kubernetes.io/region 用於匹配端點的地區中繼資料,它對應於 Kubernetes 節點標籤 topology.kubernetes.io/region 或已棄用的標籤 failure-domain.beta.kubernetes.io/region
  • topology.kubernetes.io/zone 用於匹配端點的區域中繼資料,它對應於 Kubernetes 節點標籤 topology.kubernetes.io/zone 或已棄用的標籤 failure-domain.beta.kubernetes.io/zone
  • topology.istio.io/subzone 用於匹配端點的子區域中繼資料,它對應於 Istio 節點標籤 topology.istio.io/subzone
  • kubernetes.io/hostname 用於匹配端點的目前節點,它對應於 Kubernetes 節點標籤 kubernetes.io/hostname

以下拓撲設定指示以下優先順序層級

failoverPriority:
- "topology.istio.io/network"
- "topology.kubernetes.io/region"
- "topology.kubernetes.io/zone"
- "topology.istio.io/subzone"
  1. 與用戶端代理具有相同 [network, region, zone, subzone] 標籤的端點具有最高優先順序。
  2. 與用戶端代理具有相同 [network, region, zone] 標籤但具有不同 [subzone] 標籤的端點具有第二高優先順序。
  3. 與用戶端代理具有相同 [network, region] 標籤但具有不同 [zone] 標籤的端點具有第三高優先順序。
  4. 與用戶端代理具有相同 [network] 標籤但具有不同 [region] 標籤的端點具有第四高優先順序。
  5. 所有其他端點都具有相同的最低優先順序。

假設與服務關聯的端點位於多個叢集中,以下範例表示

  1. clusterA 內且具有 version=v1 標籤的端點具有 P(0) 優先權。
  2. 不在 clusterA 內但具有 version=v1 標籤的端點具有 P(1) 優先權。
  3. 所有其他端點都具有 P(2) 優先權。
failoverPriority:
- "version=v1"
- "topology.istio.io/cluster=clusterA"

可選:只能設定 distribute、failover 或 failoverPriority 其中之一。並且應該與 OutlierDetection 一起使用以偵測不健康的端點,否則無效。

已啟用BoolValue

啟用本地負載平衡,這是 DestinationRule 層級的設定,將完全覆蓋網格範圍的設定。例如,true 表示為此 DestinationRule 開啟本地負載平衡,無論網格範圍設定為何。

流量策略.連接埠流量策略

適用於服務特定埠的流量策略

欄位類型描述必要
PortSelector

指定此策略應用之目的地服務上的埠號。

loadBalancerLoadBalancerSettings

控制負載平衡器演算法的設定。

connectionPoolConnectionPoolSettings

控制上游服務連線量的設定

outlierDetectionOutlierDetection

控制從負載平衡池中移除不健康主機的設定

tlsClientTLSSettings

連線至上游服務的 TLS 相關設定。

流量策略.通道設定

欄位類型描述必要
協定string

指定用於隧道下游連線的協定。支援的協定有:CONNECT - 使用 HTTP CONNECT;POST - 使用 HTTP POST。如果未指定,預設使用 CONNECT。上游請求的 HTTP 版本由為代理定義的服務協定決定。

targetHoststring

指定下游連線隧道的目的地主機。目標主機必須是 FQDN 或 IP 位址。

targetPortuint32

指定下游連線隧道的目的地埠。

流量策略.代理協定

欄位類型描述必要
版本VERSION

要使用的 PROXY 協定版本。詳細資訊請參閱 https://www.haproxy.org/download/2.1/doc/proxy-protocol.txt。預設為 V1

負載平衡器設定.一致性雜湊負載平衡

基於一致性雜湊的負載平衡可以用於根據 HTTP 標頭、Cookie 或其他屬性提供軟性會期親和性。當從目的地服務新增/移除一個或多個主機時,可能會失去與特定目的地主機的親和性。

注意:與常見的「黏性會期」實作相比,一致性雜湊在維持親和性方面較不可靠,後者通常會在 Cookie 中編碼特定目的地,確保只要後端保持不變,親和性就能維持。使用一致性雜湊時,保證較弱;任何主機的加入或移除都可能導致 1/backends 請求的親和性失效。

警告:一致性雜湊取決於每個代理對端點的一致視圖。當啟用本地負載平衡時,情況並非如此。本地負載平衡和一致性雜湊只有在所有代理都在同一本地性中,或由高階負載平衡器處理本地性親和性時才能一起運作。

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

根據特定 HTTP 標頭進行雜湊。

useSourceIpbool (oneof)

根據來源 IP 位址進行雜湊。這適用於 TCP 和 HTTP 連線。

httpQueryParameterNamestring (oneof)

根據特定 HTTP 查詢參數進行雜湊。

ringHashRingHash (oneof)

環形/模數雜湊負載平衡器實作了對後端主機的一致性雜湊。

maglevMagLev (oneof)

Maglev 負載平衡器實作了對後端主機的一致性雜湊。

minimumRingSizeuint64

已棄用。請改用 RingHash。

負載平衡器設定.一致性雜湊負載平衡.環狀雜湊

欄位類型描述必要
minimumRingSizeuint64

用於雜湊環的最小虛擬節點數。預設為 1024。較大的環大小會導致更精細的負載分佈。如果負載平衡池中的主機數量大於環大小,則每個主機將被分配一個虛擬節點。

負載平衡器設定.一致性雜湊負載平衡.MagLev

欄位類型描述必要
tableSizeuint64

用於 Maglev 雜湊的表大小。這有助於控制後端主機變更時的中斷。增加表大小可以減少中斷的程度。表大小必須是小於 5000011 的質數。如果未指定,則預設為 65537。

負載平衡器設定.一致性雜湊負載平衡.HTTP Cookie

描述將用作一致性雜湊負載平衡器雜湊金鑰的 HTTP Cookie。

欄位類型描述必要
namestring

Cookie 的名稱。

路徑string

要為 Cookie 設定的路徑。

ttlDuration

Cookie 的生命週期。如果指定,如果不存在 Cookie,則會產生具有 TTL 的 Cookie。如果 TTL 存在且為零,則產生的 Cookie 將是一個會期 Cookie。

連線池設定.TCP 設定

HTTP 和 TCP 上游連線共用的設定。

欄位類型描述必要
maxConnectionsint32

到目標主機的 HTTP1 / TCP 連線的最大數量。預設值為 2^32-1。

connectTimeoutDuration

TCP 連線逾時。格式:1h/1m/1s/1ms。必須 >= 1ms。預設值為 10 秒。

tcpKeepaliveTcpKeepalive

如果設定,則在 Socket 上設定 SO_KEEPALIVE 以啟用 TCP Keepalives。

maxConnectionDurationDuration

連線的最大持續時間。持續時間定義為自建立連線以來的時間段。如果未設定,則沒有最大持續時間。當達到 max_connection_duration 時,連線將會關閉。持續時間必須至少為 1 毫秒。

idleTimeoutDuration

TCP 連線的閒置逾時。閒置逾時定義為在上游或下游連線上沒有傳送或接收位元組的時間段。如果未設定,則預設閒置逾時為 1 小時。如果設定為 0 秒,則會停用逾時。當使用加權目的地時,不會為每個叢集個別設定閒置逾時,因為 idleTimeout 是接聽器的屬性,而不是叢集的屬性。在這種情況下,為第一個加權路由在目的地規則中指定的 idleTimeout 將在接聽器中設定,這也意味著所有加權路由都將如此。

連線池設定.HTTP 設定

適用於 HTTP1.1/HTTP2/GRPC 連線的設定。

欄位類型描述必要
http1MaxPendingRequestsint32

在等待就緒連線池連線時,將排隊的最大請求數。預設值為 2^32-1。請參閱 https://envoy.dev.org.tw/docs/envoy/latest/intro/arch_overview/upstream/circuit_breaking,了解在哪些情況下會為 HTTP2 建立新連線。請注意,這同時適用於 HTTP/1.1 和 HTTP2。

http2MaxRequestsint32

到目的地的最大活動請求數。預設值為 2^32-1。請注意,這同時適用於 HTTP/1.1 和 HTTP2。

maxRequestsPerConnectionint32

每個連線到後端的最大請求數。將此參數設定為 1 會停用 Keep-Alive。預設值為 0,表示「無限」,最多 2^29。

maxRetriesint32

在給定時間,在叢集中所有主機中可能未完成的最大重試次數。預設值為 2^32-1。

idleTimeoutDuration

上游連線池連線的閒置逾時。閒置逾時定義為沒有活動請求的時間段。如果未設定,則預設值為 1 小時。當達到閒置逾時時,連線將會關閉。如果連線是 HTTP/2 連線,則在關閉連線之前將發生排空序列。請注意,基於請求的逾時表示 HTTP/2 PING 不會保持連線存活。適用於 HTTP1.1 和 HTTP2 連線。

h2UpgradePolicyH2UpgradePolicy

指定是否應將 HTTP1.1 連線升級為關聯目的地的 HTTP2。

useClientProtocolbool

如果設定為 true,則在啟動與後端的連線時,將保留用戶端協定。請注意,當此設定為 true 時,h2_upgrade_policy 將無效,即用戶端連線不會升級為 HTTP2。

maxConcurrentStreamsint32

在一個 HTTP/2 連線上,允許對等方的最大並行串流數。預設值為 2^31-1。

連線池設定.TCP 設定.TCP Keepalive

TCP Keep-Alive。

欄位類型描述必要
probesuint32

在確定連線已斷開之前,要傳送而沒有回應的最大 Keep-Alive 探測次數。預設值為使用作業系統層級設定(除非覆寫,否則 Linux 預設值為 9)。

時間Duration

在開始傳送 Keep-Alive 探測之前,連線需要閒置的時間長度。預設值為使用作業系統層級設定(除非覆寫,否則 Linux 預設值為 7200 秒(即 2 小時)。)

間隔Duration

Keep-Alive 探測之間的時間長度。預設值為使用作業系統層級設定(除非覆寫,否則 Linux 預設值為 75 秒)。

本地負載平衡器設定.分配

描述如何將源自「from」區域或子區域的流量分佈到一組「to」區域。指定區域的語法為 {region}/{zone}/{sub-zone},並且允許在規格的任何區段中使用終端萬用字元。範例

* - 比對所有本地性

us-west/* - us-west 區域內的所有區域和子區域

us-west/zone-1/* - us-west/zone-1 內的所有子區域

欄位類型描述必要
fromstring

起始本地性,以「/」分隔,例如「region/zone/sub_zone」。

tomap<string, uint32>

上游本地性到流量分佈權重的對應。所有權重的總和應為 100。任何不存在的本地性都不會接收流量。

本地負載平衡器設定.故障轉移

指定跨區域的流量故障轉移策略。由於預設支援區域和子區域故障轉移,因此只有在運營商需要限制流量故障轉移,以便不適用於故障轉移到全球任何端點的預設行為時,才需要針對區域指定此設定。當跨區域故障轉移流量不會改善服務健全狀況,或可能需要因其他原因(如法規控制)而受到限制時,此設定很有用。

欄位類型描述必要
fromstring

起始區域。

tostring

當「from」區域中的端點變得不健康時,流量將故障轉移到的目標區域。

google.protobuf.UInt32Value

uint32 的包裝訊息。

UInt32Value 的 JSON 表示為 JSON 數字。

欄位類型描述必要
uint32

uint32 值。

流量策略.代理協定.版本

名稱描述
V1

PROXY 協定版本 1。人類可讀的格式。

V2

PROXY 協定版本 2。二進位格式。

負載平衡器設定.簡單負載平衡

不需要調整的標準負載平衡演算法。

名稱描述
UNSPECIFIED

使用者未指定任何負載平衡演算法。Istio 將選擇適當的預設值。

RANDOM

隨機負載平衡器會選擇隨機健康的的主機。如果未設定任何健全狀況檢查策略,隨機負載平衡器通常比循環配置資源效能更好。

PASSTHROUGH

此選項會將連線轉發到呼叫者請求的原始 IP 位址,而不會進行任何形式的負載平衡。必須小心使用此選項。它適用於進階使用案例。有關詳細資訊,請參閱 Envoy 中的「原始目的地」負載平衡器。

ROUND_ROBIN

基本的循環配置資源負載平衡策略。這對於許多情境(例如,當使用端點加權時)通常是不安全的,因為它會使端點負載過重。一般而言,最好使用 LEAST_REQUEST 作為 ROUND_ROBIN 的替代方案。

LEAST_REQUEST

最小請求負載平衡器會將負載分散到端點,優先考慮具有最少未完成請求的端點。這通常更安全,並且在幾乎所有情況下都優於 ROUND_ROBIN。最好使用 LEAST_REQUEST 作為 ROUND_ROBIN 的替代方案。

LEAST_CONN

已棄用。請改用 LEAST_REQUEST。

連線池設定.HTTP 設定.H2 升級策略

用於將 HTTP1.1 連線升級到 HTTP2 的策略。

名稱描述
DEFAULT

使用全域預設值。

DO_NOT_UPGRADE

不要將連線升級到 HTTP2。此選擇退出選項會覆寫預設值。

UPGRADE

將連線升級到 HTTP2。此選擇加入選項會覆寫預設值。

用戶端 TLS 設定.TLS 模式

TLS 連線模式

名稱描述
DISABLE

不要設定到上游端點的 TLS 連線。

SIMPLE

起始到上游端點的 TLS 連線。

MUTUAL

透過提供用戶端憑證進行驗證,來保護與上游的連線,使用相互 TLS。

ISTIO_MUTUAL

透過呈現用戶端憑證進行身分驗證,使用相互 TLS 安全地連線至上游。相較於「相互」模式,此模式使用 Istio 自動產生的憑證進行 mTLS 身分驗證。當使用此模式時,ClientTLSSettings 中的所有其他欄位都應為空白。

這項資訊是否有用?
您是否有任何改進建議?

感謝您的回饋!