目標(biāo)規(guī)則(Destination Rule)CRD說(shuō)明
目標(biāo)規(guī)則是服務(wù)網(wǎng)格ASM實(shí)現(xiàn)流量路由功能的關(guān)鍵資源之一。目標(biāo)規(guī)則定義在路由發(fā)生后,發(fā)往目標(biāo)服務(wù)的流量策略。目標(biāo)規(guī)則指定了負(fù)載均衡、來(lái)自Sidecar的連接池大小以及異常檢測(cè)設(shè)置的相關(guān)配置,以便從負(fù)載均衡池中檢測(cè)并清除不健康的主機(jī)。本文介紹目標(biāo)規(guī)則的配置示例和字段說(shuō)明。
配置示例
示例一:簡(jiǎn)單負(fù)載均衡策略
以下目標(biāo)規(guī)則使用最少請(qǐng)求(LEAST_REQUEST)負(fù)載均衡算法。在將負(fù)載分配給端點(diǎn)時(shí),優(yōu)先考慮未完成請(qǐng)求最少的端點(diǎn)。
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_REQUEST
示例二:針對(duì)端口進(jìn)行自定義配置
流量策略可以針對(duì)特定端口進(jìn)行定制。以下目標(biāo)規(guī)則使用最少請(qǐng)求(LEAST_REQUEST)負(fù)載均衡策略處理所有到80端口的流量,同時(shí)將使用輪詢(ROUND_ROBIN)負(fù)載均衡設(shè)置處理到9080端口的流量。
apiVersion: networking.istio.io/v1beta1
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
示例三:針對(duì)特定工作負(fù)載進(jìn)行自定義配置
以下示例使用workloadSelector
配置將目標(biāo)規(guī)則應(yīng)用于特定工作負(fù)載。
apiVersion: networking.istio.io/v1beta1
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
字段說(shuō)明
DestinationRule
目標(biāo)規(guī)則定義在路由發(fā)生后,發(fā)往目的服務(wù)的流量策略。
字段 | 類型 | 是否必選 | 說(shuō)明 |
host | string | 是 | 服務(wù)注冊(cè)表中的服務(wù)名稱。服務(wù)名稱將在平臺(tái)的服務(wù)注冊(cè)表(例如Kubernetes服務(wù)、Consul服務(wù)等)和ServiceEntry聲明的主機(jī)中查找。對(duì)于服務(wù)注冊(cè)表中不存在服務(wù)定義的規(guī)則將被忽略。該字段適用于HTTP服務(wù)和TCP服務(wù)。 針對(duì)Kubernetes的說(shuō)明如下:
|
trafficPolicy | 否 | 應(yīng)用的流量策略(負(fù)載均衡策略、連接池大小、異常檢測(cè))。 | |
subsets | 否 | 代表服務(wù)的各個(gè)版本的一個(gè)或多個(gè)子集。服務(wù)基本的流量策略可以被子集級(jí)別覆蓋。 | |
exportTo | string[] | 否 | 目標(biāo)規(guī)則導(dǎo)出到的命名空間列表。將目標(biāo)規(guī)則解析應(yīng)用于服務(wù)時(shí),會(huì)在命名空間層級(jí)的上下文中進(jìn)行。導(dǎo)出的目標(biāo)規(guī)則允許被包含在其他命名空間中的服務(wù)解析層次結(jié)構(gòu)中。此功能提供了一種機(jī)制,使服務(wù)所有者和網(wǎng)格管理員可以控制跨命名空間邊界的目標(biāo)規(guī)則的可見(jiàn)性。
|
workloadSelector | 否 | 選擇應(yīng)用此目標(biāo)規(guī)則的Pods的條件。
|
TrafficPolicy
應(yīng)用到指定目的地的流量策略,作用于目的地的全部端口。
字段 | 類型 | 是否必選 | 說(shuō)明 |
loadBalancer | 否 | 設(shè)置負(fù)載均衡算法。 | |
connectionPool | 否 | 設(shè)置上游服務(wù)的連接池。 | |
outlierDetection | 否 | 設(shè)置如何從負(fù)載平衡池中清除不健康主機(jī)。 | |
tls | 否 | 與上游服務(wù)連接的TLS相關(guān)設(shè)置。 | |
portLevelSettings | 否 | 端口級(jí)別的流量策略。端口級(jí)別的設(shè)置將覆蓋目的地級(jí)別的設(shè)置。當(dāng)端口級(jí)別的流量策略覆蓋了目的地級(jí)別的設(shè)置時(shí),目的地級(jí)別的其他字段的設(shè)置將不會(huì)被繼承,即在端口級(jí)別的流量策略中省略的字段將應(yīng)用默認(rèn)值。 | |
tunnel | 否 | 對(duì)于目標(biāo)規(guī)則中指定的主機(jī),將TCP使用其他傳輸層或者應(yīng)用層協(xié)議進(jìn)行隧道傳輸。TunnelSettings可應(yīng)用于TCP或TLS路由,但不能應(yīng)用于HTTP路由。 |
Subset
服務(wù)全部端點(diǎn)(endpoints)的一個(gè)子集。子集可用于A/B測(cè)試或路由到服務(wù)的特定版本等場(chǎng)景。服務(wù)級(jí)別定義的流量策略可以在子集級(jí)別被覆蓋。關(guān)于子集的更多信息,請(qǐng)參見(jiàn)虛擬服務(wù)(Virtual Service)CRD說(shuō)明。
您可以使用目標(biāo)規(guī)則指定命名的服務(wù)子集,例如按版本為所有給定服務(wù)的實(shí)例分組。在虛擬服務(wù)的路由規(guī)則中使用這些服務(wù)子集來(lái)控制到服務(wù)不同實(shí)例的流量。在子集中可以指定特定版本的策略并覆蓋在服務(wù)級(jí)別指定的設(shè)置。以下目標(biāo)規(guī)則使用輪詢(ROUND_ROBIN)負(fù)載平衡策略,將所有流量發(fā)送到名為testversion
的子集。該子集由具有標(biāo)簽version:v3
的Endpoints組成。
對(duì)子集指定的負(fù)載均衡策略,僅當(dāng)目標(biāo)規(guī)則將流量發(fā)送到該子集時(shí)生效。
apiVersion: networking.istio.io/v1beta1
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
通常需要一個(gè)或多個(gè)標(biāo)簽來(lái)指定子集包含的目標(biāo)。當(dāng)目標(biāo)規(guī)則代表的主機(jī)名支持多個(gè)SNI主機(jī)名時(shí)(例如出口網(wǎng)關(guān)),沒(méi)有標(biāo)簽的子集可能有意義。在這種情況下,可以使用包含ClientTLSSettings的流量策略來(lái)識(shí)別與命名子集對(duì)應(yīng)的特定SNI主機(jī)。
字段 | 類型 | 是否必選 | 說(shuō)明 |
name | string | 是 | 子集的名稱。服務(wù)名稱和子集名稱可用于路由規(guī)則中的流量拆分。 |
labels | map<string, string> | 否 | 標(biāo)簽用于創(chuàng)建過(guò)濾器,篩選服務(wù)注冊(cè)表中服務(wù)的端點(diǎn)。 |
trafficPolicy | 否 | 要應(yīng)用到該子集的流量策略。子集繼承在DestinationRule級(jí)別指定的流量策略。在子集級(jí)別指定的設(shè)置將覆蓋在DestinationRule級(jí)別指定的相應(yīng)設(shè)置。 |
LoadBalancerSettings
應(yīng)用于特定目的地的負(fù)載平衡策略。更多信息,請(qǐng)參見(jiàn)Load Balancing。
以下目標(biāo)規(guī)則對(duì)所有發(fā)往ratings服務(wù)的流量使用Robin負(fù)載平衡策略。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: bookinfo-ratings spec: host: ratings.prod.svc.cluster.local trafficPolicy: loadBalancer: simple: ROUND_ROBIN
以下目標(biāo)規(guī)則為ratings服務(wù)配置會(huì)話保持功能。使用基于哈希的負(fù)載均衡器并使用
httpCookie
字段user
作為哈希的Key。apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: bookinfo-ratings spec: host: ratings.prod.svc.cluster.local trafficPolicy: loadBalancer: consistentHash: httpCookie: name: user ttl: 0s
下表類型列的oneof表示該字段的取值有多個(gè),但是您只能任選其一進(jìn)行配置。
字段 | 類型 | 是否必選 | 說(shuō)明 |
simple | 否 | 指定一種簡(jiǎn)單負(fù)載平衡的算法。 | |
consistentHash | 否 | 指定一種一致性哈希負(fù)載均衡的算法。 | |
localityLbSetting | 否 | 本地負(fù)載均衡器設(shè)置。此配置將完全覆蓋網(wǎng)格范圍的設(shè)置。此對(duì)象和MeshConfig中的對(duì)象不會(huì)進(jìn)行合并。 | |
warmupDurationSecs | 否 | 服務(wù)的預(yù)熱持續(xù)時(shí)間。如果設(shè)置了該字段,服務(wù)的新端點(diǎn)將在其創(chuàng)建時(shí)間開(kāi)始保持預(yù)熱模式,持續(xù)該字段指定的時(shí)間。在此期間Istio將逐漸增加該端點(diǎn)的流量,而不是發(fā)送相應(yīng)比例的流量。
|
ConnectionPoolSettings
連接到上游主機(jī)的連接池設(shè)置。這些設(shè)置適用于上游服務(wù)中的每個(gè)主機(jī)。更多信息,請(qǐng)參見(jiàn)Envoy的circuit breaker。連接池設(shè)置可應(yīng)用于TCP級(jí)別和HTTP級(jí)別。
例如,以下規(guī)則對(duì)名為myredissrv的Redis服務(wù)設(shè)置100個(gè)連接的上限,并設(shè)置連接超時(shí)為30毫秒。
apiVersion: networking.istio.io/v1beta1
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
字段 | 類型 | 是否必選 | 說(shuō)明 |
tcp | 否 | HTTP和TCP上游連接的通用設(shè)置。 | |
http | 否 | HTTP連接池設(shè)置。 |
OutlierDetection
跟蹤上游服務(wù)中主機(jī)的狀態(tài)的熔斷器,適用于HTTP和TCP服務(wù)。
對(duì)于HTTP服務(wù),API調(diào)用不斷返回5xx錯(cuò)誤的主機(jī)將在指定時(shí)間內(nèi)從可用主機(jī)池中排除。
對(duì)于TCP服務(wù),給定主機(jī)的連接超時(shí)或連接失敗在計(jì)算連續(xù)錯(cuò)誤指標(biāo)時(shí)都被視為錯(cuò)誤。更多信息,請(qǐng)參見(jiàn)Envoy的outlier detection。
以下目標(biāo)規(guī)則將連接池大小設(shè)置為100個(gè)HTTP1連接,發(fā)送到reviews服務(wù)的請(qǐng)求或連接不超過(guò)10個(gè)。為HTTP2請(qǐng)求設(shè)置1000并發(fā)的上限,并將上游主機(jī)配置為每5分鐘掃描一次。任何連續(xù)7次出現(xiàn)502、503或504錯(cuò)誤代碼的主機(jī)將被熔斷15分鐘。
apiVersion: networking.istio.io/v1beta1
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
字段 | 類型 | 是否必選 | 說(shuō)明 |
splitExternalLocalOriginErrors | bool | 否 | 指定是否區(qū)分本地源故障和外部錯(cuò)誤。默認(rèn)為false。設(shè)置為true,consecutiveLocalOriginFailures將被用于異常值檢測(cè)計(jì)算。 以下場(chǎng)景時(shí),您可以使用此功能。
|
consecutiveLocalOriginFailures | 否 | 觸發(fā)排除需要的連續(xù)本地故障數(shù)。默認(rèn)為5。該字段僅在splitExternalLocalOriginErrors設(shè)置為true時(shí)生效。 | |
consecutiveGatewayErrors | 否 | 將主機(jī)排除出連接池需要的網(wǎng)關(guān)錯(cuò)誤數(shù)。當(dāng)通過(guò)HTTP訪問(wèn)上游主機(jī)時(shí),502、503或504返回碼被視為網(wǎng)關(guān)錯(cuò)誤。當(dāng)通過(guò)不透明的TCP連接訪問(wèn)上游主機(jī)時(shí),連接超時(shí)和連接錯(cuò)誤/失敗事件被視為網(wǎng)關(guān)錯(cuò)誤。默認(rèn)情況或設(shè)置值為0時(shí),此功能關(guān)閉。 說(shuō)明
| |
consecutive5xxErrors | 否 | 將主機(jī)排除出連接池需要的5xx錯(cuò)誤數(shù)量。當(dāng)通過(guò)不透明的TCP連接訪問(wèn)上游主機(jī)時(shí),連接超時(shí)、連接錯(cuò)誤或失敗、請(qǐng)求失敗事件都被視為5xx錯(cuò)誤。默認(rèn)值為5。您可以通過(guò)將值設(shè)置為0來(lái)關(guān)閉此功能。 說(shuō)明
| |
interval | 否 | 排除操作掃描的時(shí)間間隔。格式為1h/1m/1s/1ms。該值必須≥1毫秒。默認(rèn)為10秒。 | |
baseEjectionTime | 否 | 最短排除時(shí)間。主機(jī)被排除出連接池的時(shí)間等于最短排除時(shí)間和主機(jī)被排除次數(shù)的乘積。該字段允許系統(tǒng)自動(dòng)增加不健康的上游服務(wù)器的彈出時(shí)間。格式為1h/1m/1s/1ms。該值必須≥1毫秒。默認(rèn)為30秒。 | |
maxEjectionPercent | int32 | 否 | 可以排除出負(fù)載均衡池的上游服務(wù)主機(jī)的最大百分比。默認(rèn)為10%。 |
minHealthPercent | int32 | 否 | 當(dāng)負(fù)載均衡池至少有min_health_percent比例的主機(jī)處于健康狀態(tài)時(shí),啟用異常檢測(cè)。當(dāng)負(fù)載均衡池中健康主機(jī)的百分比低于此閾值時(shí),異常檢測(cè)將被禁用,代理將在池中的所有主機(jī)(健康和不健康)之間進(jìn)行負(fù)載均衡。您可以通過(guò)將閾值設(shè)置為0%來(lái)禁用該閾值。默認(rèn)值為0%,因?yàn)樗ǔ2贿m用于每個(gè)服務(wù)只有幾個(gè)Pod的K8s環(huán)境。 |
ClientTLSSettings
上游連接的SSL/TLS相關(guān)設(shè)置。該配置適用于HTTP和TCP上游。更多信息,請(qǐng)參見(jiàn)Envoy的TLS context。
以下目標(biāo)規(guī)則將客戶端配置為使用雙向TLS連接到上游數(shù)據(jù)庫(kù)集群。
apiVersion: networking.istio.io/v1beta1 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
以下目標(biāo)規(guī)則將客戶端配置為在與域名
*.foo.com
匹配的外部服務(wù)對(duì)話時(shí)使用TLS。apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: tls-foo spec: host: "*.foo.com" trafficPolicy: tls: mode: SIMPLE
以下目標(biāo)規(guī)則將客戶端配置為在與ratings服務(wù)通信時(shí)使用Istio雙向TLS。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: ratings-istio-mtls spec: host: ratings.prod.svc.cluster.local trafficPolicy: tls: mode: ISTIO_MUTUAL
字段 | 類型 | 是否必選 | 說(shuō)明 |
mode | 是 | 指定是使用TLS對(duì)此端口的連接進(jìn)行安全保護(hù)。該字段的值決定TLS的應(yīng)用方式。 | |
clientCertificate | string | 否 | 客戶端側(cè)TLS證書(shū)的文件路徑。
|
privateKey | string | 否 | 客戶端私鑰的文件路徑。
|
caCertificates | string | 否 | 用于驗(yàn)證證書(shū)的CA證書(shū)的文件路徑。
|
credentialName | string | 否 | 保存包括CA證書(shū)在內(nèi)的客戶端TLS證書(shū)的密鑰的名稱。密鑰必須存在于使用證書(shū)的代理所在的相同名稱空間中。 支持generic和tls兩種密鑰類型。
說(shuō)明 只有DestinationRule中指定了工作負(fù)載的選擇器(workloadSelector)時(shí),本字段才會(huì)對(duì)Sidecar生效。否則本字段僅適用于網(wǎng)關(guān),Sidecar將繼續(xù)使用證書(shū)路徑。 |
subjectAltNames | string[] | 否 | 用于驗(yàn)證證書(shū)中主體身份的備用名稱列表。
|
sni | string | 否 | 在TLS握手期間提供給服務(wù)器的SNI字符串。如果未指定,當(dāng)將ENABLE_AUTO_SNI環(huán)境變量設(shè)置為true時(shí),在簡(jiǎn)單TLS和相互TLS模式下,會(huì)基于下游HTTP Host或者Authority Header自動(dòng)設(shè)置SNI。 |
insecureSkipVerify | 否 | 此字段指定代理是否跳過(guò)驗(yàn)證與主機(jī)對(duì)應(yīng)的服務(wù)器證書(shū)的CA簽名和SAN。默認(rèn)為false。 僅當(dāng)啟用全局CA簽名驗(yàn)證,并且將VerifyCertAtClient環(huán)境變量設(shè)置為true,但不希望對(duì)特定主機(jī)進(jìn)行驗(yàn)證時(shí),才應(yīng)設(shè)置此標(biāo)志。如果啟用InsecureSkipVerify,無(wú)論是否啟用VerifyCertAtClient,都將跳過(guò)CA簽名和SAN的驗(yàn)證。 |
LocalityLoadBalancerSetting
提供一個(gè)區(qū)域加權(quán)的負(fù)載均衡,使管理員能夠根據(jù)流量的源位置和終止位置來(lái)控制流量分配到端點(diǎn)的比例。區(qū)域信息可以使用任意標(biāo)簽指定。這些標(biāo)簽以{region}/{zone}/{sub-zone}
形式指定區(qū)域的層次結(jié)構(gòu)。更多信息,請(qǐng)參見(jiàn)Locality Weight。
以下示例展示如何在整個(gè)網(wǎng)格中設(shè)置區(qū)域加權(quán)。假設(shè)有一個(gè)包含工作負(fù)載和服務(wù)的網(wǎng)格被部署到區(qū)域
hangzhou/zone1/
和hangzhou/zone2/
。本示例指定當(dāng)訪問(wèn)服務(wù)的流量源自hangzhou/zone1/
的工作負(fù)載時(shí),80%的流量將被發(fā)送到hangzhou/zone1/
中的端點(diǎn)(即同一區(qū)域),剩下的20%將被發(fā)送到hangzhou/zone2/
中的端點(diǎn)。此設(shè)置優(yōu)先將流量路由到相同本地性的終點(diǎn)。對(duì)于源自hangzhou/zone2/
的流量,也指定了類似的設(shè)置。distribute: - from: hangzhou/zone1/* to: "hangzhou/zone1/*": 80 "hangzhou/zone2/*": 20 - from: hangzhou/zone2/* to: "hangzhou/zone1/*": 20 "hangzhou/zone2/*": 80
如果您的目標(biāo)不是跨區(qū)域或可用區(qū)分配負(fù)載,而是限制故障轉(zhuǎn)移的區(qū)域性,則可以設(shè)置
failover
策略而不是distribute
策略。以下示例設(shè)置區(qū)域故障轉(zhuǎn)移策略。假設(shè)服務(wù)駐留在杭州、北京和上海的區(qū)域中。此策略指定當(dāng)杭州的端點(diǎn)變?yōu)椴唤】禃r(shí),流量應(yīng)轉(zhuǎn)移到北京區(qū)域或子區(qū)域中的端點(diǎn)。同理,當(dāng)北京的端點(diǎn)變?yōu)椴唤】禒顟B(tài)時(shí),流量應(yīng)該轉(zhuǎn)移到上海的端點(diǎn)。
failover: - from: hangzhou to: beijing - from: beijing to: shanghai
字段 | 類型 | 是否必選 | 說(shuō)明 |
distribute | 否 | 明確指定跨不同區(qū)域和地理位置的負(fù)載均衡權(quán)重。如果為空,則根據(jù)其中的端點(diǎn)數(shù)設(shè)置區(qū)域權(quán)重。更多信息,請(qǐng)參見(jiàn)Locality weighted load balancing。 說(shuō)明 只能設(shè)置distribute、failover、failoverPriority三者中的任意一項(xiàng)。 | |
failover | Failover[] | 否 | 明確指定當(dāng)本地區(qū)域中的端點(diǎn)變?yōu)椴唤】禃r(shí),流量將轉(zhuǎn)移到哪個(gè)區(qū)域。該字段需要與OutlierDetection一起使用,以檢測(cè)不健康的端點(diǎn)。如果未指定OutlierDetection,此設(shè)置將不會(huì)生效。 說(shuō)明 只能設(shè)置distribute、failover、failoverPriority三者中的任意一項(xiàng)。 |
failoverPriority | string[] | 否 | 一個(gè)有序的標(biāo)簽列表,用于對(duì)端點(diǎn)進(jìn)行排序以進(jìn)行基于優(yōu)先級(jí)的負(fù)載平衡。該字段用于支持跨不同端點(diǎn)組的流量故障轉(zhuǎn)移。該字段需要與OutlierDetection一起使用,以檢測(cè)不健康的端點(diǎn)。如果未指定OutlierDetection,此設(shè)置將不會(huì)生效。 假設(shè)一共指定了N個(gè)標(biāo)簽:
此字段可以是在客戶端和服務(wù)端工作負(fù)載上指定的任何標(biāo)簽,并支持以下具有特殊語(yǔ)義的標(biāo)簽:
以下拓?fù)渑渲玫膬?yōu)先級(jí)說(shuō)明如下:
說(shuō)明 只能設(shè)置distribute、failover、failoverPriority三者中的任意一項(xiàng)。 |
enabled | 否 | 啟用區(qū)域負(fù)載均衡。該配置為DestinationRule級(jí)別,將完全覆蓋網(wǎng)格級(jí)別的設(shè)置。例如,該字段配置為true表示無(wú)論網(wǎng)格級(jí)別是什么設(shè)置,都為此DestinationRule開(kāi)啟區(qū)域負(fù)載均衡。 |
TrafficPolicy.PortTrafficPolicy
服務(wù)特定端口的流量策略。
字段 | 類型 | 是否必選 | 說(shuō)明 |
port | 否 | 指定應(yīng)用此策略的目標(biāo)服務(wù)上的端口號(hào)。 | |
loadBalancer | 否 | 控制負(fù)載均衡器算法。 | |
connectionPool | 否 | 控制與上游服務(wù)的連接量。 | |
outlierDetection | 否 | 控制從負(fù)載平衡池中排除不健康主機(jī)。 | |
tls | 否 | 與上游服務(wù)連接的TLS相關(guān)設(shè)置。 |
LoadBalancerSettings.ConsistentHashLB
Consistent Hash-based load balancing可用于提供基于HTTP頭部、Cookie或其他屬性的軟會(huì)話保持。一致性哈希在會(huì)話保持方面弱于傳統(tǒng)的基于HostName的會(huì)話保持。當(dāng)一個(gè)或多個(gè)主機(jī)被添加或刪除時(shí),使用一致性哈希算法的負(fù)載均衡會(huì)導(dǎo)致一小部分請(qǐng)求的會(huì)話保持失效。基于HostName的會(huì)話保持通常在Cookie中編碼特定目標(biāo),確保只要后端保持不變就會(huì)維持關(guān)聯(lián)。
一致性哈希的優(yōu)勢(shì)在于可以實(shí)現(xiàn)更好的負(fù)載均衡,對(duì)云上系統(tǒng)更加友好。
一致性哈希取決于每個(gè)代理?yè)碛幸恢碌亩它c(diǎn)視圖。當(dāng)啟用區(qū)域負(fù)載平衡時(shí),不保證每個(gè)代理?yè)碛幸恢碌亩它c(diǎn)視圖情況。區(qū)域負(fù)載平衡和一致性哈希只有在所有代理都在同一區(qū)域時(shí)才能一起生效,或者套一個(gè)更高層級(jí)的負(fù)載均衡去處理區(qū)域親和性。
字段 | 類型 | 是否必選 | 說(shuō)明 |
httpHeaderName | string | 否 | 基于特定HTTP標(biāo)頭的哈希。 httpHeaderName、httpCookie、useSourceIp、httpQueryParameterName這四個(gè)參數(shù)只能填一個(gè)。 |
httpCookie | 否 | 基于HTTP Cookie的哈希。 httpHeaderName、httpCookie、useSourceIp、httpQueryParameterName這四個(gè)參數(shù)只能填一個(gè)。 | |
useSourceIp | bool | 否 | 基于源IP地址的哈希,適用于TCP和HTTP連接。 httpHeaderName、httpCookie、useSourceIp、httpQueryParameterName這四個(gè)參數(shù)只能填一個(gè)。 |
httpQueryParameterName | string | 否 | 基于指定HTTP查詢參數(shù)的哈希。 httpHeaderName、httpCookie、useSourceIp、httpQueryParameterName這四個(gè)參數(shù)只能填一個(gè)。 |
ringHash | 否 | Ring或Modulo負(fù)載均衡器實(shí)現(xiàn)的對(duì)后端主機(jī)的一致性哈希。 ringHash和maglev這兩個(gè)參數(shù)只能填一個(gè),都不填默認(rèn)是ringHash。 | |
maglev | 否 | Maglev負(fù)載均衡器實(shí)現(xiàn)的對(duì)后端主機(jī)的一致性哈希。 ringHash和maglev這兩個(gè)參數(shù)只能填一個(gè),都不填默認(rèn)是ringHash。 ASM從1.16開(kāi)始支持maglev算法。 | |
minimumRingSize | uint64 | 否 | 已棄用。請(qǐng)改用ringHash。 |
LoadBalancerSettings.ConsistentHashLB.RingHash
字段 | 類型 | 是否必選 | 說(shuō)明 |
minimumRingSize | uint64 | 否 | Ring算法的最小虛擬節(jié)點(diǎn)數(shù)。默認(rèn)為1024。較大的環(huán)會(huì)導(dǎo)致更細(xì)粒度的負(fù)載分布。如果負(fù)載均衡池中的主機(jī)數(shù)量大于環(huán)大小,則每臺(tái)主機(jī)將分配一個(gè)虛擬節(jié)點(diǎn)。 |
LoadBalancerSettings.ConsistentHashLB.MagLev
字段 | 類型 | 是否必選 | 說(shuō)明 |
tableSize | uint64 | 否 | Maglev算法中散列表的大小,有助于控制當(dāng)后端主機(jī)發(fā)生變化時(shí)的干擾。增加表格大小可以減少干擾的程度。 |
LoadBalancerSettings.ConsistentHashLB.HTTPCookie
指定將被用作一致性哈希負(fù)載均衡器的哈希鍵。如果該Cookie不存在,則將生成該Cookie。
字段 | 類型 | 是否必選 | 說(shuō)明 |
name | string | 是 | 這個(gè)cookie的內(nèi)容將會(huì)被用作Hash Key。如果這個(gè)cookie不存在并且下面的ttl沒(méi)有設(shè)置,將不會(huì)生成hash。 |
path | string | 否 | 如果指定了,在這個(gè)Cookie不存在時(shí),將會(huì)生成一個(gè)帶有TTL的Cookie。如果TTL存在并且等于零,生成的Cookie將會(huì)作為Session Cookie。 |
ttl | 是 | Cookie的生命周期。 |
ConnectionPoolSettings.TCPSettings
HTTP和TCP上游連接通用的設(shè)置。
字段 | 類型 | 是否必選 | 說(shuō)明 |
maxConnections | int32 | 否 | 到目標(biāo)主機(jī)的最大HTTP1或TCP連接數(shù)。默認(rèn)為2^32-1。 |
connectTimeout | 否 | TCP連接超時(shí)時(shí)長(zhǎng)。格式:1h/1m/1s/1ms。必須≥1毫秒。默認(rèn)為10秒。 | |
tcpKeepalive | 否 | 如果設(shè)置,則在Socket上設(shè)置SO_KEEPALIVE以啟用TCP Keepalive。 | |
maxConnectionDuration | 否 | 連接的最長(zhǎng)持續(xù)時(shí)間。持續(xù)時(shí)間定義為自建立連接的時(shí)間間隔。如果未設(shè)置,則沒(méi)有最大持續(xù)時(shí)間。當(dāng)達(dá)到maxConnectionDuration時(shí),連接將被關(guān)閉。持續(xù)時(shí)間必須至少為1毫秒。 |
ConnectionPoolSettings.HTTPSettings
適用于HTTP1.1、HTTP2、GRPC連接的設(shè)置。
字段 | 類型 | 是否必選 | 說(shuō)明 |
http1MaxPendingRequests | int32 | 否 | 隊(duì)列中等待連接就緒的最大請(qǐng)求數(shù)。默認(rèn)為1024。此配置適用于HTTP/1.1和HTTP2。關(guān)于何時(shí)為HTTP2創(chuàng)建新連接,請(qǐng)參見(jiàn)circuit_breaking。 |
http2MaxRequests | int32 | 否 | 發(fā)往一個(gè)目的地的最大活躍請(qǐng)求數(shù)。默認(rèn)為1024。此配置適用于HTTP/1.1和HTTP2。 |
maxRequestsPerConnection | int32 | 否 | 每個(gè)連接的最大請(qǐng)求數(shù)。此參數(shù)設(shè)置為1,將禁用HTTP Keepalive。默認(rèn)為0,表示無(wú)限制,最大為2^29。 |
maxRetries | int32 | 否 | 在給定時(shí)間對(duì)集群中所有主機(jī)可以進(jìn)行的最大重試次數(shù)。默認(rèn)為2^32-1。 |
idleTimeout | 否 | 上游連接池連接的空閑超時(shí)時(shí)間。空閑超時(shí)時(shí)間指沒(méi)有活動(dòng)請(qǐng)求的時(shí)間段。如果未設(shè)置,則默認(rèn)為1小時(shí)。當(dāng)達(dá)到空閑超時(shí)時(shí)間時(shí),連接將被關(guān)閉。如果連接是HTTP/2連接,則在關(guān)閉連接之前將發(fā)送Drain Sequence。 基于請(qǐng)求的超時(shí)表明HTTP/2 PING不會(huì)使連接保持活動(dòng)狀態(tài)。該配置適用于HTTP1.1和HTTP2連接。 | |
h2UpgradePolicy | 否 | 指定是否將連接到相應(yīng)目的地的HTTP1.1連接升級(jí)為HTTP2連接。 | |
useClientProtocol | bool | 否 | 如果設(shè)置為true,則在向后端發(fā)起連接時(shí)將保留客戶端使用的協(xié)議,Ah2UpgradePolicy將會(huì)無(wú)效,即客戶端連接不會(huì)升級(jí)到HTTP2。 |
ConnectionPoolSettings.TCPSettings.TcpKeepalive
TCP Keepalive的相關(guān)設(shè)置。
字段 | 類型 | 是否必選 | 說(shuō)明 |
probes | uint32 | 否 | 在確定連接已死之前要發(fā)送而沒(méi)有響應(yīng)的最大保活探測(cè)數(shù)。默認(rèn)使用操作系統(tǒng)級(jí)別的配置(除非被覆蓋)。Linux默認(rèn)為9。 |
time | 否 | 在開(kāi)始發(fā)送保活探測(cè)之前連接需要空閑的持續(xù)時(shí)間。默認(rèn)使用操作系統(tǒng)級(jí)別的配置(除非被覆蓋)。Linux默認(rèn)為7200秒,即兩小時(shí)。 | |
interval | 否 | 保活探測(cè)之間的間隔時(shí)間。默認(rèn)使用操作系統(tǒng)級(jí)別的配置(除非被覆蓋)。Linux默認(rèn)為75秒。 |
google.protobuf.UInt32Value
uint32的包裝信息。
字段 | 類型 | 是否必選 | 說(shuō)明 |
value | uint32 | 否 | uint32值。在JSON中UInt32Value需要表示成一個(gè)JSON數(shù)字值。 |
LoadBalancerSettings.SimpleLB
標(biāo)準(zhǔn)負(fù)載平衡算法。
字段 | 說(shuō)明 |
UNSPECIFIED | 不指定負(fù)載均衡算法。Istio將選擇一個(gè)合適的默認(rèn)值。 |
RANDOM | 隨機(jī)負(fù)載均衡算法隨機(jī)選擇一個(gè)健康的主機(jī)。如果沒(méi)有配置健康檢查策略,隨機(jī)負(fù)載均衡器通常比輪詢性能好。 |
PASSTHROUGH | 此選項(xiàng)會(huì)將連接轉(zhuǎn)發(fā)到調(diào)用者請(qǐng)求的原始IP地址,而不進(jìn)行任何形式的負(fù)載均衡。此項(xiàng)屬于高級(jí)用法,請(qǐng)謹(jǐn)慎使用。更多信息,請(qǐng)參見(jiàn)Original destination。 |
ROUND_ROBIN | 基本的輪詢循環(huán)負(fù)載均衡策略。在許多場(chǎng)景(例如使用端點(diǎn)加權(quán)時(shí))不太安全,因?yàn)樗鼤?huì)使端點(diǎn)負(fù)擔(dān)過(guò)重。通常情況下,最好使用LEAST_REQUEST作為ROUND_ROBIN的替代方案。 |
LEAST_REQUEST | 最少請(qǐng)求負(fù)載均衡在將負(fù)載分配給端點(diǎn)時(shí),會(huì)優(yōu)先考慮未完成請(qǐng)求最少的端點(diǎn)。通常更加安全,幾乎在所有情況下都優(yōu)于ROUND_ROBIN。建議使用LEAST_REQUEST作為ROUND_ROBIN的替代方案。 |
LEAST_CONN | 已棄用。請(qǐng)改用LEAST_REQUEST。 |
ConnectionPoolSettings.HTTPSettings.H2UpgradePolicy
將HTTP1.1連接升級(jí)到HTTP2的策略。
字段 | 說(shuō)明 |
DEFAULT | 使用全局默認(rèn)值。 |
DO_NOT_UPGRADE | 不將連接升級(jí)到HTTP2。 |
UPGRADE | 將連接升級(jí)到HTTP2。 |
ClientTLSSettings.TLSmode
TLS連接模式。
字段 | 說(shuō)明 |
DISABLE | 不建立與上游端點(diǎn)的TLS連接。 |
SIMPLE | 建立與上游端點(diǎn)的TLS連接。 |
MUTUAL | 通過(guò)提供客戶端證書(shū)進(jìn)行身份驗(yàn)證,使用雙向TLS保護(hù)與上游的連接。 |
ISTIO_MUTUAL | 通過(guò)提供客戶端證書(shū)進(jìn)行身份驗(yàn)證,使用雙向TLS保護(hù)與上游的連接。與Mutual模式相比,該模式使用Istio自動(dòng)生成的證書(shū)進(jìn)行mTLS身份驗(yàn)證。使用此模式時(shí),ClientTLSSettings中所有其他字段都應(yīng)為空。 |