Istio服務(wù)網(wǎng)格:為忙碌人士而生
我最近為Istio做出了一個小貢獻(xiàn),Istio 是一個開源服務(wù)網(wǎng)格項目。我的貢獻(xiàn)包括為 Istio CLI 的一個命令添加了一些測試。如果你想查看詳細(xì)信息,可以在此處找到 pull 請求。這不是一個巨大的改變,但它是一個很棒的學(xué)習(xí)體驗。在 Istio 上工作幫助我更深入地理解了服務(wù)網(wǎng)格。我很高興能做出更多貢獻(xiàn)。在這篇文章中,我將解釋什么是 Istio,它為什么有用以及它是如何工作的。
譯自The Istio Service Mesh for People Who Have Stuff to Do | Blog,作者 Luca Cavallin。
從本質(zhì)上講,Istio 是一個服務(wù)網(wǎng)格。服務(wù)網(wǎng)格管理微服務(wù)之間的通信,負(fù)責(zé)處理諸如路由流量、保護(hù)通信和提供可觀測性等事項。隨著微服務(wù)數(shù)量的增長,管理這些交互會變得很復(fù)雜。Istio 自動執(zhí)行許多這些任務(wù),因此你可以專注于構(gòu)建應(yīng)用程序,而不是管理服務(wù)之間的通信。
為什么要使用 Istio?
隨著架構(gòu)變得越來越復(fù)雜,你將面臨新的挑戰(zhàn)。服務(wù)需要以可靠、安全和高效的方式進(jìn)行通信。Istio 幫助你在三個關(guān)鍵領(lǐng)域做到這一點:
- 管理流量: Istio 使你能夠控制流量在服務(wù)之間如何流動。你可以將流量拆分到服務(wù)的不同版本之間,在部署期間重新路由請求,或者設(shè)置重試和超時策略。保護(hù)通信: Istio 使啟用
- 雙向 TLS (mTLS)變得容易。這確保了服務(wù)之間所有通信都是加密和經(jīng)過身份驗證的,從而阻止未經(jīng)授權(quán)的服務(wù)。
- 可觀測性: Istio 自動收集指標(biāo)、日志和跟蹤,使你能夠?qū)崟r了解你的服務(wù)。這有助于監(jiān)控、故障排除和性能調(diào)整。
這三個領(lǐng)域——流量管理、安全性和可觀測性——是運(yùn)行健康微服務(wù)架構(gòu)的關(guān)鍵,Istio 可以輕松地處理它們。
使用 Istio 管理流量
Istio 的主要功能之一是管理服務(wù)之間的流量。在微服務(wù)設(shè)置中,你可能有多個版本的同一個服務(wù)同時運(yùn)行。例如,你可能正在測試支付服務(wù)的最新版本,并希望將大部分流量發(fā)送到版本 1,但將一些流量路由到版本 2。
以下是如何使用 Istio 將流量拆分到服務(wù)的兩個版本之間的示例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: payments
spec:
hosts:
- payments.myapp.com
http:
- route:
- destination:
host: payments
subset: v1
weight: 90
- destination:
host: payments
subset: v2
weight: 10
在這個例子中:
- 90% 的流量被發(fā)送到payments服務(wù)的版本 1,而10%被發(fā)送到版本 2。
- hosts字段指定虛擬服務(wù)適用的域——在本例中為payments.myapp.com。
- route塊定義了流量如何在服務(wù)的兩個子集中進(jìn)行拆分:v1(版本 1)和v2(版本 2)。weight字段控制流量分配。
這對于金絲雀部署非常有用,在金絲雀部署中,你可以使用一小部分用戶測試新功能,然后再完全推出。
Envoy 代理和 Sidecar 容器
Istio 的數(shù)據(jù)平面依賴于Envoy 代理,Envoy 代理是一個第 7 層代理,它管理服務(wù)之間所有流量。網(wǎng)格中的每個服務(wù)都有自己的Sidecar 代理,它位于服務(wù)旁邊,并管理其所有入站和出站流量。
Envoy 允許你應(yīng)用流量策略,例如重試、超時和斷路器,所有這些都無需更改應(yīng)用程序代碼。它還收集有關(guān)流量流的詳細(xì)指標(biāo),有助于監(jiān)控和調(diào)試。
由于 Envoy 作為Sidecar 容器運(yùn)行,因此它可以在不干擾應(yīng)用程序邏輯的情況下執(zhí)行這些規(guī)則并收集數(shù)據(jù)。簡而言之,Envoy 充當(dāng)服務(wù)網(wǎng)格中所有通信的“交通警察”。
可觀測性:了解系統(tǒng)中發(fā)生的事情
運(yùn)行一個包含許多微服務(wù)的系統(tǒng)可能會讓你難以了解正在發(fā)生的事情。Istio 的內(nèi)置可觀測性功能可以幫助你跟蹤服務(wù)之間所有通信的指標(biāo)、日志和跟蹤。這對于監(jiān)控系統(tǒng)的運(yùn)行狀況、發(fā)現(xiàn)性能問題和修復(fù)錯誤至關(guān)重要。
Istio 的可觀測性工具可以讓你清楚地了解系統(tǒng)的工作方式。你可以及早發(fā)現(xiàn)問題,并使你的服務(wù)運(yùn)行得更加順暢。
安全:啟用 mTLS 和訪問控制
安全是管理微服務(wù)時的一大問題。Istio 使實施雙向 TLS (mTLS)變得容易,雙向 TLS (mTLS) 會加密服務(wù)之間的所有通信,并確保服務(wù)在交換數(shù)據(jù)之前相互驗證身份。
Istio 還允許您設(shè)置訪問控制策略,以指定哪些服務(wù)可以進(jìn)行通信。這有助于限制哪些服務(wù)可以交互,從而減少系統(tǒng)的攻擊面。
以下是一個 Istio 策略示例,該策略僅允許billing服務(wù)與payments服務(wù)通信:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: payments-to-billing
spec:
selector:
matchLabels:
app: payments
rules:
- from:
- source:
principals: ["billing.myapp.com"]
在此策略中:
- selector指定此規(guī)則適用于payments服務(wù),使用標(biāo)簽app: payments。
- rules塊僅允許billing服務(wù)(由主體"billing.myapp.com"標(biāo)識)與payments服務(wù)通信。任何其他服務(wù)都不允許向payments服務(wù)發(fā)送流量。
此策略限制除billing服務(wù)之外的所有服務(wù)訪問payments服務(wù),從而加強(qiáng)了微服務(wù)的安全性。
什么是 SPIFFE?
Istio 使用SPIFFE(安全生產(chǎn)身份框架,面向所有人)來管理服務(wù)身份。SPIFFE 提供了一種為服務(wù)分配安全、可驗證身份的方法。網(wǎng)格中的每個服務(wù)都會獲得一個SPIFFE 可驗證身份文檔 (SVID),該文檔與 mTLS 一起使用以確保安全通信。此身份系統(tǒng)是 Istio 安全模型的基礎(chǔ)。
Istio 中的網(wǎng)絡(luò)
微服務(wù)中的網(wǎng)絡(luò)可能很困難,尤其是在控制網(wǎng)格內(nèi)部和外部的流量時。Istio 提供了幾種管理網(wǎng)絡(luò)流量的工具:
- 服務(wù)條目: 允許外部服務(wù)與網(wǎng)格內(nèi)部的服務(wù)進(jìn)行通信,反之亦然。
- 虛擬服務(wù): 定義流量如何在網(wǎng)格內(nèi)部路由。
- 目標(biāo)規(guī)則: 將流量策略(如負(fù)載均衡或 mTLS)應(yīng)用于服務(wù)。
- 網(wǎng)關(guān): 管理進(jìn)出網(wǎng)格的流量。
配置示例:網(wǎng)關(guān)、服務(wù)條目、虛擬服務(wù)和目標(biāo)規(guī)則
假設(shè)您在網(wǎng)格中有一個 API 服務(wù)器,它通過負(fù)載均衡器接收來自互聯(lián)網(wǎng)的流量。以下是如何配置網(wǎng)關(guān)、服務(wù)條目、虛擬服務(wù)和目標(biāo)規(guī)則來處理此流量。
網(wǎng)關(guān)配置
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: api-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "api.myapp.com"
這里發(fā)生了什么?網(wǎng)關(guān)在端口 80上監(jiān)聽來自域api.myapp.com的 HTTP 流量。selector字段將此網(wǎng)關(guān)連接到Istio 入口網(wǎng)關(guān),該網(wǎng)關(guān)處理進(jìn)入網(wǎng)格的流量。
服務(wù)條目配置
假設(shè)您的 API 服務(wù)器需要調(diào)用外部身份驗證服務(wù)。以下是如何配置服務(wù)條目:
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: auth-service-entry
spec:
hosts:
- "auth.external-service.com"
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: HTTPS
resolution: DNS
endpoints:
- address: 203.0.113.1
這里發(fā)生了什么?服務(wù)條目告訴 Istio 如何將流量路由到外部服務(wù) (auth.external-service.com),該服務(wù)在端口 443(HTTPS)上運(yùn)行。location: MESH_EXTERNAL指示此服務(wù)存在于 Istio 服務(wù)網(wǎng)格之外。endpoints字段包含外部服務(wù)的 IP 地址,允許網(wǎng)格內(nèi)的 API 服務(wù)器發(fā)送請求。
虛擬服務(wù)配置
以下是如何在網(wǎng)格內(nèi)路由流量:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: api-virtualservice
spec:
hosts:
- "api.myapp.com"
gateways:
- api-gateway
http:
- match:
- uri:
prefix: "/v1"
route:
- destination:
host: api-service
subset: stable
這里發(fā)生了什么?虛擬服務(wù)定義了流量路由規(guī)則。在這種情況下,通過api-gateway到達(dá)api.myapp.com/v1的流量將路由到網(wǎng)格中的api-service。subset: stable指的是api-service的特定版本(您可以擁有同一服務(wù)的多個版本)。
目標(biāo)規(guī)則配置
最后,以下是一個目標(biāo)規(guī)則,用于應(yīng)用負(fù)載均衡和 mTLS:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: api-destination-rule
spec:
host: api-service
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
tls:
mode: ISTIO_MUTUAL
這里發(fā)生了什么?目標(biāo)規(guī)則將策略應(yīng)用于路由到api-service的流量。它使用輪詢負(fù)載均衡將請求均勻地分布到實例中。mTLS通過tls.mode: ISTIO_MUTUAL啟用,確保服務(wù)之間加密通信。
彈性:使用重試、超時和斷路器處理故障
在分布式系統(tǒng)中,故障是不可避免的。服務(wù)可能會宕機(jī),網(wǎng)絡(luò)可能會變慢,或者用戶可能會遇到延遲。Istio 可以幫助您使用重試、超時和斷路器來處理這些問題。
- 重試: 自動重試失敗的請求,以處理臨時故障,而不會影響用戶體驗。
- 超時: 定義服務(wù)在放棄并繼續(xù)執(zhí)行之前應(yīng)等待響應(yīng)的時間。
- 斷路器: 如果服務(wù)出現(xiàn)故障,Istio 可以停止向其發(fā)送流量,從而防止可能導(dǎo)致系統(tǒng)其他部分崩潰的級聯(lián)故障。
以下是如何在 Istio 中配置重試和超時的示例:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-service
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
retries:
attempts: 3
perTryTimeout: 2s
timeout: 5s
這里發(fā)生了什么?如果對my-service的請求失敗,Istio 將最多重試該請求3 次。每次重試嘗試都有2 秒的限制。請求的總允許時間為5 秒。在此之后,Istio 將停止等待響應(yīng)。
對于斷路,您可以使用類似這樣的目標(biāo)規(guī)則:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: my-service
spec:
host: my-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 50
outlierDetection:
consecutive5xxErrors: 2
interval: 10s
baseEjectionTime: 30s
maxEjectionPercent: 50
這里發(fā)生了什么?如果my-service在10 秒內(nèi)返回兩個連續(xù)的 5xx 錯誤,Istio 將停止向其發(fā)送流量。該服務(wù)將從負(fù)載均衡池中剔除30 秒,然后重新考慮。
總結(jié)
Istio 是一個強(qiáng)大的工具,它簡化了微服務(wù)的流量管理、安全性和可觀測性。為 Istio 做貢獻(xiàn)讓我了解了它如何幫助解決運(yùn)行分布式系統(tǒng)時遇到的一些復(fù)雜挑戰(zhàn)。
如果您正在運(yùn)行微服務(wù)架構(gòu)或計劃進(jìn)行擴(kuò)展,Istio 可以幫助您使系統(tǒng)更具彈性和更易于管理。如果您有任何問題或想了解更多關(guān)于 Istio 的信息,請隨時聯(lián)系我,我很樂意分享我的經(jīng)驗。