目的地規則
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 定義在路由發生後,套用至目標為服務的流量的原則。
TrafficPolicy
針對特定目標套用的流量策略,跨所有目標連接埠。如需範例,請參閱 DestinationRule。
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 主機。
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
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
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
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
本地負載平衡器設定
位置加權負載平衡允許管理員根據流量的來源位置和終止位置來控制流量到端點的分佈。這些位置使用任意標籤指定,這些標籤以 {地區}/{區域}/{子區域} 形式指定位置的層次結構。有關更多詳細資訊,請參閱 位置權重。以下範例顯示如何設定網格範圍內的位置權重。
假設一個網格,其工作負載及其服務部署到「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
位置負載平衡設定。
流量策略.連接埠流量策略
適用於服務特定埠的流量策略
流量策略.通道設定
流量策略.代理協定
負載平衡器設定.一致性雜湊負載平衡
基於一致性雜湊的負載平衡可以用於根據 HTTP 標頭、Cookie 或其他屬性提供軟性會期親和性。當從目的地服務新增/移除一個或多個主機時,可能會失去與特定目的地主機的親和性。
注意:與常見的「黏性會期」實作相比,一致性雜湊在維持親和性方面較不可靠,後者通常會在 Cookie 中編碼特定目的地,確保只要後端保持不變,親和性就能維持。使用一致性雜湊時,保證較弱;任何主機的加入或移除都可能導致 1/backends
請求的親和性失效。
警告:一致性雜湊取決於每個代理對端點的一致視圖。當啟用本地負載平衡時,情況並非如此。本地負載平衡和一致性雜湊只有在所有代理都在同一本地性中,或由高階負載平衡器處理本地性親和性時才能一起運作。
負載平衡器設定.一致性雜湊負載平衡.環狀雜湊
負載平衡器設定.一致性雜湊負載平衡.MagLev
負載平衡器設定.一致性雜湊負載平衡.HTTP Cookie
描述將用作一致性雜湊負載平衡器雜湊金鑰的 HTTP Cookie。
連線池設定.TCP 設定
HTTP 和 TCP 上游連線共用的設定。
連線池設定.HTTP 設定
適用於 HTTP1.1/HTTP2/GRPC 連線的設定。
連線池設定.TCP 設定.TCP Keepalive
TCP Keep-Alive。
本地負載平衡器設定.分配
描述如何將源自「from」區域或子區域的流量分佈到一組「to」區域。指定區域的語法為 {region}/{zone}/{sub-zone},並且允許在規格的任何區段中使用終端萬用字元。範例
*
- 比對所有本地性
us-west/*
- us-west 區域內的所有區域和子區域
us-west/zone-1/*
- us-west/zone-1 內的所有子區域
本地負載平衡器設定.故障轉移
指定跨區域的流量故障轉移策略。由於預設支援區域和子區域故障轉移,因此只有在運營商需要限制流量故障轉移,以便不適用於故障轉移到全球任何端點的預設行為時,才需要針對區域指定此設定。當跨區域故障轉移流量不會改善服務健全狀況,或可能需要因其他原因(如法規控制)而受到限制時,此設定很有用。
google.protobuf.UInt32Value
uint32
的包裝訊息。
UInt32Value
的 JSON 表示為 JSON 數字。
流量策略.代理協定.版本
名稱 | 描述 |
---|---|
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 身分驗證。當使用此模式時, |