ASM配置建議
本文介紹ASM的配置建議,包括網(wǎng)格診斷、網(wǎng)關(guān)、網(wǎng)格、API、服務(wù)治理等,幫助您規(guī)避錯(cuò)誤的配置。
網(wǎng)格診斷
ASM支持對(duì)實(shí)例進(jìn)行網(wǎng)格診斷。診斷項(xiàng)包括數(shù)據(jù)平面版本檢查、服務(wù)端口檢查、服務(wù)關(guān)聯(lián)檢查等。建議您經(jīng)常使用網(wǎng)格診斷功能對(duì)配置進(jìn)行診斷。對(duì)于未通過的檢查項(xiàng),請(qǐng)按照相關(guān)提示進(jìn)行配置修改。具體操作,請(qǐng)參見使用ASM網(wǎng)格診斷。
網(wǎng)關(guān)
一個(gè)域名對(duì)應(yīng)一個(gè)Gateway資源。不建議多個(gè)Gateway CR關(guān)聯(lián)同一個(gè)域名。
一個(gè)Gateway對(duì)應(yīng)一個(gè)VirtualService。若需要使用多個(gè)VirtualSerice關(guān)聯(lián)同一個(gè)Gateway,請(qǐng)勿在多個(gè)VirtualService下針對(duì)同一個(gè)URI或者同一個(gè)URI范圍進(jìn)行配置,避免因合并的順序?qū)е虏环项A(yù)期的路由優(yōu)先級(jí)問題。
若VirtualService下配置條目過多,需要拆分為多個(gè)VirtualService進(jìn)行配置。建議按照路由的目標(biāo)服務(wù)(Destination)進(jìn)行拆分,一個(gè)目標(biāo)服務(wù)對(duì)應(yīng)一個(gè)子VirtualService。
使用VirtualService Delegate功能時(shí),需滿足CI/CD單獨(dú)上線一個(gè)服務(wù)并關(guān)聯(lián)配置一條路由。
一個(gè)后端應(yīng)用服務(wù)建議對(duì)應(yīng)一個(gè)DestinationRule。多個(gè)DestinationRule低版本可能會(huì)導(dǎo)致配置同步(xDS)不一致的問題。
網(wǎng)格
同一個(gè)Host的流控規(guī)則(VirtualService)不支持分布到多個(gè)VirtualService資源下。如果同一個(gè)Host存在多個(gè)VirtualService,僅生效最新創(chuàng)建的一個(gè)VirtualService。
一個(gè)后端應(yīng)用服務(wù)對(duì)應(yīng)一個(gè)VirtualService和DestinationRule。VirtualService和DestinationRule需創(chuàng)建在服務(wù)對(duì)應(yīng)的Namespace下。不建議資源跨Namespace進(jìn)行配置。
針對(duì)同一個(gè)服務(wù),若該服務(wù)也暴露在入口網(wǎng)關(guān)下,東西向流量(針對(duì)Sidecar的路由配置)和南北向(針對(duì)Gateway的路由配置)建議分開配置。
API
通用規(guī)則
istio-system空間下未包含WorkLoadSelector的CR配置,一般針對(duì)當(dāng)前整個(gè)集群生效。
非istio-system空間下未包含WorkLoadSelector的CR配置,一般針對(duì)當(dāng)前Namespace生效。
ServiceEntry
必須密切監(jiān)控服務(wù)項(xiàng)目的添加,以確保不向命名空間提供任意的外部訪問權(quán)限。
HostName
一個(gè)給定的主機(jī)名只能有一個(gè)服務(wù)條目。同一主機(jī)名的多個(gè)服務(wù)條目將導(dǎo)致未定義的行為。
不建議有多個(gè)服務(wù)條目在主機(jī)名上重疊。例如,兩個(gè)帶有主機(jī)xx.example.com和example.com的服務(wù)條目將在運(yùn)行時(shí)導(dǎo)致未定義的行為。
必須使用完全符合格式規(guī)范的域名作為主機(jī)名。不建議使用沒有英文半角句號(hào)(.)的短名稱。
Address
除非地址字段有一個(gè)CIDR塊,否則避免使用NONE解析模式。一個(gè)沒有地址字段的NONE解析的服務(wù)條目,將會(huì)允許在服務(wù)條目中指定端口上的任何IP的流量。
VirtualService
虛擬服務(wù)不能被繼承。因此,針對(duì)xx.example.com的虛擬服務(wù)的設(shè)置與example.com的虛擬服務(wù)的設(shè)置無關(guān)。如果具有不同通配符主機(jī)的多個(gè)虛擬服務(wù)與給定的主機(jī)名相匹配,在運(yùn)行時(shí)將只應(yīng)用最具體的虛擬服務(wù)的設(shè)置。
對(duì)于HTTP規(guī)則,首選精確或前綴的URL匹配,而不是正則表達(dá)式。基于正則表達(dá)式的匹配速度較慢,還可能導(dǎo)致不符合預(yù)期的行為。
網(wǎng)格內(nèi)部,對(duì)于一個(gè)給定的主機(jī)名,應(yīng)該只有一個(gè)虛擬服務(wù)。多個(gè)虛擬服務(wù)將導(dǎo)致不符合預(yù)期的行為。請(qǐng)避免使用短名稱來指代虛擬服務(wù)中的主機(jī),因?yàn)橹鳈C(jī)名稱解釋受制于運(yùn)行時(shí)的上下文,短名稱可能會(huì)造成名稱模糊,不具有唯一性。
DestinationRule
DestinationRule定義在路由發(fā)生之后如何為網(wǎng)絡(luò)流量提供服務(wù)的策略。在DestinationRule中可以配置如下內(nèi)容:
網(wǎng)絡(luò)流量策略
負(fù)載均衡策略
連接池設(shè)置
mTLS
回彈性
使用標(biāo)簽(
label
)指定服務(wù)的子集(subsets
),這些子集將在VirtualService中用到。
配置Destination Rule時(shí),請(qǐng)注意如下內(nèi)容:
在創(chuàng)建流量轉(zhuǎn)移的子集時(shí),在創(chuàng)建帶有子集的目標(biāo)規(guī)則和創(chuàng)建指向這些子集的虛擬服務(wù)之間需要留有幾秒的延遲。這個(gè)延遲可以確保在Pilot發(fā)送指向這些子集的路由配置時(shí),對(duì)應(yīng)的Envoy上游配置已經(jīng)就緒。
可以使用通配符目標(biāo)規(guī)則在一系列的主機(jī)上指定一個(gè)單一的目標(biāo)規(guī)則。例如,istio-config根命名空間中的全局目標(biāo)規(guī)則將所有與
.local
主機(jī)名匹配的服務(wù)配置為mTLS。當(dāng)為一個(gè)更具體的主機(jī)名創(chuàng)建目標(biāo)規(guī)則時(shí)(例如.ns1.svc.cluster.local
或svc1.ns1.svc.cluster.local
),會(huì)選擇最具體的目標(biāo)規(guī)則。其他通配符目標(biāo)規(guī)則的設(shè)置不會(huì)被繼承。因此,您編寫的任意目標(biāo)規(guī)則都必須攜帶全局目標(biāo)規(guī)則中的所有必選項(xiàng),例如mTLS。
VirtualService和DestinationRule的可見性
若訪問的權(quán)限未嚴(yán)格控制,網(wǎng)格運(yùn)維人員可能會(huì)在客戶端命名空間中編寫導(dǎo)出值為'.'
的規(guī)則以覆蓋服務(wù)器指定的目標(biāo)規(guī)則和虛擬服務(wù)。服務(wù)的目標(biāo)規(guī)則和虛擬服務(wù)(在Kubernetes或Service Entry中)會(huì)影響到與該服務(wù)對(duì)話的所有Sidecar,例如離群值檢測、重試策略等設(shè)置,將在客戶端側(cè)的Sidecar上執(zhí)行。雖然讓每個(gè)服務(wù)消費(fèi)者命名空間為另一個(gè)命名空間的服務(wù)編寫自己的虛擬服務(wù)和目標(biāo)規(guī)則可能較為便捷,但如果不限制這種自定義配置的可見性,就會(huì)導(dǎo)致未定義的行為。
Sidecar
若訪問的權(quán)限未嚴(yán)格控制,命名空間所有者可能會(huì)通過在
egress.hosts
部分聲明對(duì)*/*
的依賴,或者通過從具有潛在沖突配置的多個(gè)命名空間導(dǎo)入服務(wù)和配置,來覆蓋全局指定的Sidecar,導(dǎo)致與沒有Sidecar系統(tǒng)的效果一致。建議使用Istio中的Sidecar API來限制每個(gè)工作負(fù)載對(duì)系統(tǒng)中其他工作負(fù)載的依賴性。整個(gè)命名空間有一個(gè)Sidecar資源即可,無需工作負(fù)載選擇器來配置整個(gè)命名空間的默認(rèn)值。每個(gè)Sidecar資源都指定了命名空間中工作負(fù)載所需要的主機(jī),這些主機(jī)對(duì)應(yīng)Kubernetes服務(wù)、Istio服務(wù)條目和Istio VirtualServices中的主機(jī)名。基于導(dǎo)入的服務(wù)主機(jī)名,適當(dāng)?shù)哪繕?biāo)規(guī)則也會(huì)自動(dòng)從服務(wù)的命名空間導(dǎo)入。Sidecars在
egress.hosts
字段中聲明對(duì)其他命名空間的服務(wù)的依賴性。聲明對(duì)主機(jī)名的依賴(無論是否有通配符)將導(dǎo)致Pilot嘗試搜索所有存在上述主機(jī)的命名空間,并從所有匹配的命名空間導(dǎo)入。#示例一 egress: - hosts: - "_/_" #示例二 egress: - hosts: - foo.example.com - .fun.com
如果在多個(gè)命名空間中存在同一主機(jī)相沖突的服務(wù)條目,或者在多個(gè)命名空間中存在與同一主機(jī)相沖突的虛擬服務(wù)(例如有
exportTo: *
),則特定資源的選擇基于這些資源的創(chuàng)建順序。這種行為可能會(huì)在生產(chǎn)中造成未知的后果。Sidecars不支持繼承。如果一個(gè)命名空間聲明了一個(gè)Sidecar資源,命名空間的本地Sidecar會(huì)優(yōu)先于全局默認(rèn)的Sidecar。
當(dāng)多個(gè)Sidecars有重疊的工作負(fù)載選擇器時(shí),將隨機(jī)選擇一個(gè)Pod的Sidecar資源。因此,請(qǐng)確保在編寫帶有工作負(fù)載選擇器的Sidecars時(shí),每個(gè)Sidecar都針對(duì)其命名空間中的一組不同的Pod。
Telemetry
同一個(gè)Namespace下,不能配置兩個(gè)未定義workLoadSelector的Telemetry CR。如果定義了多個(gè),則無法確定哪個(gè)生效。
同一個(gè)Namespace下,若Telemetry CR包含workLoadSelector,不能存在兩個(gè)重疊的workLoadSelector CR。若發(fā)生重疊,則無法確定哪個(gè)生效。
服務(wù)治理
服務(wù)治理支持基于全局、命名空間、工作負(fù)載三個(gè)維度進(jìn)行配置。例如您可以在全局(istio-system命名空間)創(chuàng)建一個(gè)較為寬松的規(guī)則,然后在特定命名空間基于業(yè)務(wù)特點(diǎn)進(jìn)行更細(xì)化的配置用以覆蓋全局配置。若存在一些需要重點(diǎn)關(guān)注的應(yīng)用,您還可以使用工作負(fù)載級(jí)別的配置,對(duì)其進(jìn)行特定配置。
功能 | 說明 |
超時(shí)、重試 | 無需顯式配置。Istio默認(rèn)配置中下發(fā)了超時(shí)、重試規(guī)則,默認(rèn)會(huì)重試兩次,但未配置超時(shí)時(shí)間。您可以通過Envoy的config_dump接口查看默認(rèn)配置。 |
熔斷 | Istio社區(qū)提供基于異常值檢測的熔斷機(jī)制,可以通過DestinationRule下的TrafficPolicy進(jìn)行配置,但有一定的局限性。ASM對(duì)熔斷功能進(jìn)行了增強(qiáng),提供更細(xì)粒度的路由級(jí)熔斷功能。具體操作,請(qǐng)參見使用ASM路由級(jí)熔斷功能。 |
限流 | Istio的限流功能與提供原生API的VirtualService、Telemetry等功能不同,需要采用EnvoyFilter方式進(jìn)行配置。采用EnvoyFilter配置有一定的復(fù)雜度,還需考慮版本兼容性等問題,容易出錯(cuò)。ASM提供抽象程度更高的ASMLocalRateLimiter CRD,可以簡化配置。具體操作,請(qǐng)參見使用ASM本地限流功能。 |