太強(qiáng)了,Istio竟然有這么多功能!
1 簡(jiǎn)介
Istio,希臘語(yǔ),意揚(yáng)帆起航。
一個(gè)完全開(kāi)源的服務(wù)網(wǎng)格產(chǎn)品,對(duì)分布式應(yīng)用是透明的。Istio 管理服務(wù)之間的流量,實(shí)施訪問(wèn)政策并匯總遙測(cè)數(shù)據(jù),而不需要更改應(yīng)用代碼。Istio 以透明的方式對(duì)現(xiàn)有分布式應(yīng)用進(jìn)行分層,從而簡(jiǎn)化了部署復(fù)雜性。
也是一個(gè)平臺(tái),可與任何日志、遙測(cè)和策略系統(tǒng)集成。服務(wù)于微服務(wù)架構(gòu),并提供保護(hù)、連接和監(jiān)控微服務(wù)的統(tǒng)一方法。
在原有的數(shù)據(jù)平面的基礎(chǔ)上,增加了控制平面。
為什么會(huì)火
- 發(fā)布及時(shí)(2017年5月發(fā)布0.1版本)
- 巨頭廠商buff 加持
- 第二代Service Mesh
- Envoy的加入讓Istio如虎添翼
- 功能強(qiáng)大
優(yōu)點(diǎn)
- 輕松構(gòu)建服務(wù)網(wǎng)格
- 應(yīng)用代碼無(wú)需更改
- 功能強(qiáng)大
2 核心功能
2.1 流量控制
路由、流量轉(zhuǎn)移 流量進(jìn)出 網(wǎng)絡(luò)彈性能力 測(cè)試相關(guān)
2.1.1 核心資源(CRD)
虛擬服務(wù)(Virtual Service) 和目標(biāo)規(guī)則(Destination Rule) 是 Istio 流量路由功能的關(guān)鍵拼圖。
2.1.1.1 虛擬服務(wù)( Virtual Service )
虛擬服務(wù)讓你配置如何在服務(wù)網(wǎng)格內(nèi)將請(qǐng)求路由到服務(wù),這基于 Istio 和平臺(tái)提供的基本的連通性和服務(wù)發(fā)現(xiàn)能力。每個(gè)虛擬服務(wù)包含一組路由規(guī)則,Istio 按順序評(píng)估它們,Istio 將每個(gè)給定的請(qǐng)求匹配到虛擬服務(wù)指定的實(shí)際目標(biāo)地址。您的網(wǎng)格可以有多個(gè)虛擬服務(wù),也可以沒(méi)有,取決于使用場(chǎng)景。
- 將流量路由到給定目標(biāo)地址
- 請(qǐng)求地址與真實(shí)的工作負(fù)載解耦
- 包含一組路由規(guī)則
- 通常和目標(biāo)規(guī)則( Destination Rule)成對(duì)出現(xiàn)
- 豐富的路由匹配規(guī)則
2.1.1.2 目標(biāo)規(guī)則( Destination Rule)
定義虛擬服務(wù)路由目標(biāo)地址的真實(shí)地址,即子集。設(shè)置負(fù)載均衡的方式
- 隨機(jī)
- 權(quán)重
- 最少請(qǐng)求數(shù)
2.1.1.3 網(wǎng)關(guān)(Gateway)
Egress 不一定使用。
服務(wù)入口 (Service Entry)
- 使用服務(wù)入口(Service Entry) 來(lái)添加一個(gè)入口到 Istio 內(nèi)部維護(hù)的服務(wù)注冊(cè)中心,即把外部服務(wù)注冊(cè)到網(wǎng)格中。
添加了服務(wù)入口后,Envoy 代理可以向服務(wù)發(fā)送流量,就好像它是網(wǎng)格內(nèi)部的服務(wù)一樣。
配置服務(wù)入口允許您管理運(yùn)行在網(wǎng)格外的服務(wù)的流量,它包括以下幾種能力:
- 為外部目標(biāo) redirect 和轉(zhuǎn)發(fā)請(qǐng)求,例如來(lái)自 web 端的 API 調(diào)用,或者流向遺留老系統(tǒng)的服務(wù)。
- 為外部目標(biāo)定義重試、超時(shí)和故障注入策略。
- 添加一個(gè)運(yùn)行在虛擬機(jī)的服務(wù)來(lái)擴(kuò)展您的網(wǎng)格。
- 從邏輯上添加來(lái)自不同集群的服務(wù)到網(wǎng)格,在 Kubernetes 上實(shí)現(xiàn)一個(gè)多集群 Istio 網(wǎng)格。
你不需要為網(wǎng)格服務(wù)要使用的每個(gè)外部服務(wù)都添加服務(wù)入口。默認(rèn)情況下,Istio 配置 Envoy 代理將請(qǐng)求傳遞給未知服務(wù)。但是,您不能使用 Istio 的特性來(lái)控制沒(méi)有在網(wǎng)格中注冊(cè)的目標(biāo)流量。
Sidecar
默認(rèn)情況下,Istio 讓每個(gè) Envoy 代理都可以訪問(wèn)來(lái)自和它關(guān)聯(lián)的工作負(fù)載的所有端口的請(qǐng)求,然后轉(zhuǎn)發(fā)到對(duì)應(yīng)的工作負(fù)載。您可以使用 sidecar 配置去做下面的事情:
- 微調(diào) Envoy 代理接受的端口和協(xié)議集。
- 限制 Envoy 代理可以訪問(wèn)的服務(wù)集合。
你可能希望在較龐大的應(yīng)用程序中限制這樣的 sidecar 可達(dá)性,配置每個(gè)代理能訪問(wèn)網(wǎng)格中的任意服務(wù)可能會(huì)因?yàn)楦邇?nèi)存使用量而影響網(wǎng)格的性能。
您可以指定將 sidecar 配置應(yīng)用于特定命名空間中的所有工作負(fù)載,或者使用 workloadSelector 選擇特定的工作負(fù)載。
2.1.2 網(wǎng)絡(luò)彈性和測(cè)試
除了為你的網(wǎng)格導(dǎo)流,Istio 還提供了可選的故障恢復(fù)和故障注入功能,使你可以在運(yùn)行時(shí)動(dòng)態(tài)配置這些功能。使用這些特性可以讓?xiě)?yīng)用程序運(yùn)行穩(wěn)定,確保服務(wù)網(wǎng)格能夠容忍故障節(jié)點(diǎn),并防止局部故障級(jí)聯(lián)影響到其他節(jié)點(diǎn)。
超時(shí)
超時(shí)是 Envoy 代理等待來(lái)自給定服務(wù)的答復(fù)的時(shí)間量,以確保服務(wù)不會(huì)因?yàn)榈却饛?fù)而無(wú)限期的掛起,并在可預(yù)測(cè)的時(shí)間范圍內(nèi)調(diào)用成功或失敗。HTTP 請(qǐng)求的默認(rèn)超時(shí)時(shí)間是 15 秒,這意味著如果服務(wù)在 15 秒內(nèi)沒(méi)有響應(yīng),調(diào)用將失敗。
對(duì)于某些應(yīng)用程序和服務(wù),Istio 的缺省超時(shí)可能不合適。例如,超時(shí)太長(zhǎng)可能會(huì)由于等待失敗服務(wù)的回復(fù)而導(dǎo)致過(guò)度的延遲;而超時(shí)過(guò)短則可能在等待涉及多個(gè)服務(wù)返回的操作時(shí)觸發(fā)不必要地失敗。為了找到并使用最佳超時(shí)設(shè)置,Istio 允許您使用虛擬服務(wù)按服務(wù)輕松地動(dòng)態(tài)調(diào)整超時(shí),而不必修改業(yè)務(wù)代碼。
重試
重試設(shè)置指定如果初始調(diào)用失敗,Envoy 代理嘗試連接服務(wù)的最大次數(shù)。通過(guò)確保調(diào)用不會(huì)因?yàn)榕R時(shí)過(guò)載的服務(wù)或網(wǎng)絡(luò)等問(wèn)題而永久失敗,重試可以提高服務(wù)可用性和應(yīng)用程序的性能。重試之間的間隔(25ms+)是可變的,并由 Istio 自動(dòng)確定,從而防止被調(diào)用服務(wù)被請(qǐng)求淹沒(méi)。HTTP 請(qǐng)求的默認(rèn)重試行為是在返回錯(cuò)誤之前重試兩次。
與超時(shí)一樣,Istio 默認(rèn)的重試行為在延遲方面可能不適合您的應(yīng)用程序需求(對(duì)失敗的服務(wù)進(jìn)行過(guò)多的重試會(huì)降低速度)或可用性。您可以在虛擬服務(wù)中按服務(wù)調(diào)整重試設(shè)置,而不必修改業(yè)務(wù)代碼。您還可以通過(guò)添加每次重試的超時(shí)來(lái)進(jìn)一步細(xì)化重試行為,并指定每次重試都試圖成功連接到服務(wù)所等待的時(shí)間量。
熔斷器
熔斷器是 Istio 為創(chuàng)建具有彈性的微服務(wù)應(yīng)用提供的另一個(gè)有用的機(jī)制。在熔斷器中,設(shè)置一個(gè)對(duì)服務(wù)中的單個(gè)主機(jī)調(diào)用的限制,例如并發(fā)連接的數(shù)量或?qū)υ撝鳈C(jī)調(diào)用失敗的次數(shù)。一旦限制被觸發(fā),熔斷器就會(huì)“跳閘”并停止連接到該主機(jī)。使用熔斷模式可以快速失敗而不必讓客戶端嘗試連接到過(guò)載或有故障的主機(jī)。
熔斷適用于在負(fù)載均衡池中的“真實(shí)”網(wǎng)格目標(biāo)地址,您可以在目標(biāo)規(guī)則中配置熔斷器閾值,讓配置適用于服務(wù)中的每個(gè)主機(jī)
故障注入
在配置了網(wǎng)絡(luò),包括故障恢復(fù)策略之后,可使用 Istio 的故障注入機(jī)制來(lái)為整個(gè)應(yīng)用程序測(cè)試故障恢復(fù)能力。故障注入是一種將錯(cuò)誤引入系統(tǒng)以確保系統(tǒng)能夠承受并從錯(cuò)誤條件中恢復(fù)的測(cè)試方法。使用故障注入特別有用,能確保故障恢復(fù)策略不至于不兼容或者太嚴(yán)格,這會(huì)導(dǎo)致關(guān)鍵服務(wù)不可用。
與其他錯(cuò)誤注入機(jī)制(如延遲數(shù)據(jù)包或在網(wǎng)絡(luò)層殺掉 Pod)不同,Istio 允許在應(yīng)用層注入錯(cuò)誤。這使您可以注入更多相關(guān)的故障,例如 HTTP 錯(cuò)誤碼,以獲得更多相關(guān)的結(jié)果。
可以注入兩種故障,它們都使用虛擬服務(wù)配置:
- 延遲
延遲是時(shí)間故障。它們模擬增加的網(wǎng)絡(luò)延遲或一個(gè)超載的上游服務(wù)。
- 終止
終止是崩潰失敗。他們模仿上游服務(wù)的失敗。終止通常以 HTTP 錯(cuò)誤碼或 TCP 連接失敗的形式出現(xiàn)。
流量鏡像
流量鏡像,也稱為影子流量,是一個(gè)以盡可能低的風(fēng)險(xiǎn)為生產(chǎn)帶來(lái)變化的強(qiáng)大的功能。鏡像會(huì)將實(shí)時(shí)流量的副本發(fā)送到鏡像服務(wù)。鏡像流量發(fā)生在主服務(wù)的關(guān)鍵請(qǐng)求路徑之外。
在此任務(wù)中,首先把流量全部路由到 v1 版本的測(cè)試服務(wù)。然后,執(zhí)行規(guī)則將一部分流量鏡像到 v2 版本。
2.2 可觀察性
可觀察性≠監(jiān)控
監(jiān)控是指從運(yùn)維角度,被動(dòng)地審視系統(tǒng)行為和狀態(tài),是在系統(tǒng)之外探查系統(tǒng)的運(yùn)行時(shí)狀態(tài)。而可觀察性是從開(kāi)發(fā)者的角度主動(dòng)地探究系統(tǒng)的狀態(tài),開(kāi)發(fā)過(guò)程中去考慮把哪些系統(tǒng)指標(biāo)暴露出去。而在原始時(shí)期的我們都是通過(guò)日志查看系統(tǒng)運(yùn)行時(shí)狀態(tài),所以這也是一種理念創(chuàng)新。
組成
指標(biāo)(Metrics)
通過(guò)聚合的數(shù)據(jù)來(lái)監(jiān)測(cè)你的應(yīng)用運(yùn)行情況。為了監(jiān)控服務(wù)行為,Istio 為服務(wù)網(wǎng)格中所有出入的服務(wù)流量都生成了指標(biāo)。這些指標(biāo)提供了關(guān)于行為的信息,例如總流量數(shù)、錯(cuò)誤率和請(qǐng)求響應(yīng)時(shí)間。
除了監(jiān)控網(wǎng)格中服務(wù)的行為外,監(jiān)控網(wǎng)格本身的行為也很重要。Istio 組件可以導(dǎo)出自身內(nèi)部行為的指標(biāo),以提供對(duì)網(wǎng)格控制平面的功能和健康情況的洞察能力。
Istio 指標(biāo)收集由運(yùn)維人員配置來(lái)驅(qū)動(dòng)。運(yùn)維人員決定如何以及何時(shí)收集指標(biāo),以及指標(biāo)本身的詳細(xì)程度。這使得它能夠靈活地調(diào)整指標(biāo)收集來(lái)滿足個(gè)性化需求。Istio中的指標(biāo)分類(lèi):
代理級(jí)別的指標(biāo)( Proxy-level)
Istio 指標(biāo)收集從 sidecar 代理(Envoy) 開(kāi)始。每個(gè)代理為通過(guò)它的所有流量(入站和出站)生成一組豐富的指標(biāo)。代理還提供關(guān)于它本身管理功能的詳細(xì)統(tǒng)計(jì)信息,包括配置信息和健康信息。
Envoy 生成的指標(biāo)提供了資源(例如監(jiān)聽(tīng)器和集群)粒度上的網(wǎng)格監(jiān)控。因此,為了監(jiān)控 Envoy 指標(biāo),需要了解網(wǎng)格服務(wù)和 Envoy 資源之間的連接。
Istio 允許運(yùn)維在每個(gè)工作負(fù)載實(shí)例上選擇生成和收集哪個(gè) Envoy 指標(biāo)。默認(rèn)情況下,Istio 只支持 Envoy 生成的統(tǒng)計(jì)數(shù)據(jù)的一小部分,以避免依賴過(guò)多的后端服務(wù),還可以減少與指標(biāo)收集相關(guān)的 CPU 開(kāi)銷(xiāo)。然而,運(yùn)維可以在需要時(shí)輕松地?cái)U(kuò)展收集到的代理指標(biāo)集。這支持有針對(duì)性地調(diào)試網(wǎng)絡(luò)行為,同時(shí)降低了跨網(wǎng)格監(jiān)控的總體成本。
Envoy 文檔包括了 Envoy 統(tǒng)計(jì)信息收集的詳細(xì)說(shuō)明。Envoy 統(tǒng)計(jì)里的操作手冊(cè)提供了有關(guān)控制代理級(jí)別指標(biāo)生成的更多信息。
代理級(jí)別指標(biāo)的例子:
- # 當(dāng)前集群中來(lái)自于上游服務(wù)的總的請(qǐng)求數(shù)
- envoy_cluster_internal_upstream_rq{response_code_class="2xx",
- cluster_name="xds-grpc"} 7163
- # 上游服務(wù)完成的請(qǐng)求數(shù)量
- envoy_cluster_upstream_rq_completed{cluster_name="xds-grpc"} 7164
- # 是SSL連接出錯(cuò)的數(shù)量
- envoy_cluster_ssl_connection_error{cluster_name="xds-grpc"} 0
服務(wù)級(jí)別的指標(biāo)( Service-level)
監(jiān)控服務(wù)通信的面向服務(wù)的指標(biāo)。
- 四個(gè)基本的服務(wù)監(jiān)控需求:延遲、流量、錯(cuò)誤和飽和情況。Istio 帶有一組默認(rèn)的儀表板,用于監(jiān)控基于這些指標(biāo)的服務(wù)行為。
- 默認(rèn)的 Istio 指標(biāo)由 Istio 提供的配置集定義并默認(rèn)導(dǎo)出到 Prometheus。運(yùn)維人員可以自由地修改這些指標(biāo)的形態(tài)和內(nèi)容,更改它們的收集機(jī)制,以滿足各自的監(jiān)控需求。
收集指標(biāo)任務(wù)為定制 Istio 指標(biāo)生成提供了更詳細(xì)的信息。
- 服務(wù)級(jí)別指標(biāo)的使用完全是可選的。運(yùn)維人員可以選擇關(guān)閉指標(biāo)的生成和收集來(lái)滿足自身需要。
服務(wù)級(jí)別指標(biāo)的例子
- istio_requests_total{
- connection_security_policy="mutual_tls",
- destination_app="details",
- destination_principal="cluster.local/ns/default/sa/default",
- destination_service="details.default.svc.cluster.local",
- destination_service_name="details",
- destination_service_namespace="default",
- destination_version="v1",
- destination_workload="details-v1",
- destination_workload_namespace="default",
- reporter="destination",
- request_protocol="http",
- response_code="200",
- response_flags="-",
- source_app="productpage",
- source_principal="cluster.local/ns/default/sa/default",
- source_version="v1",
- source_workload="productpage-v1",
- source_workload_namespace="default"
- } 214
控制平面指標(biāo)(Control plane )
每一個(gè) Istio 的組件(Pilot、Galley、Mixer)都提供了對(duì)自身監(jiān)控指標(biāo)的集合。這些指標(biāo)容許監(jiān)控 Istio 自己的行為(這與網(wǎng)格內(nèi)的服務(wù)有所不同)。
訪問(wèn)日志
通過(guò)應(yīng)用產(chǎn)生的事件來(lái)監(jiān)控你的應(yīng)用。訪問(wèn)日志提供了一種從單個(gè)工作負(fù)載實(shí)例的角度監(jiān)控和理解行為的方法。Istio 可以從一組可配置的格式集生成服務(wù)流量的訪問(wèn)日志,為運(yùn)維人員提供日志記錄的方式、內(nèi)容、時(shí)間和位置的完全控制。Istio 向訪問(wèn)日志機(jī)制暴露了完整的源和目標(biāo)元數(shù)據(jù),允許對(duì)網(wǎng)絡(luò)通信進(jìn)行詳細(xì)的審查。
- 生成位置可選
訪問(wèn)日志可以在本地生成,或者導(dǎo)出到自定義的后端基礎(chǔ)設(shè)施,包括 Fluentd。
- 日志內(nèi)容
應(yīng)用日志 Envoy 服務(wù)日志:kubectl logs -l app=demo -C istio-proxy
- {
- "level": "info",
- "time": "2019-06-11T20:57:35.424310Z",
- "instance": "accesslog.instance.istio-control",
- "connection_security_policy": "mutual_tls",
- "destinationApp": "productpage",
- "destinationIp": "10.44.2.15",
- "destinationName": "productpage-v1-6db7564db8-pvsnd",
- "destinationNamespace": "default",
- "destinationOwner": "kubernetes://apis/apps/v1/namespaces/default/deployments/productpage-v1",
- "destinationPrincipal": "cluster.local/ns/default/sa/default",
- "destinationServiceHost": "productpage.default.svc.cluster.local",
- "destinationWorkload": "productpage-v1",
- "httpAuthority": "35.202.6.119",
- "latency": "35.076236ms",
- "method": "GET",
- "protocol": "http",
- "receivedBytes": 917,
- "referer": "",
- "reporter": "destination",
- "requestId": "e3f7cffb-5642-434d-ae75-233a05b06158",
- "requestSize": 0,
- "requestedServerName": "outbound_.9080_._.productpage.default.svc.cluster.local",
- "responseCode": 200,
- "responseFlags": "-",
- "responseSize": 4183,
- "responseTimestamp": "2019-06-11T20:57:35.459150Z",
- "sentBytes": 4328,
- "sourceApp": "istio-ingressgateway",
- "sourceIp": "10.44.0.8",
- "sourceName": "ingressgateway-7748774cbf-bvf4j",
- "sourceNamespace": "istio-control",
- "sourceOwner": "kubernetes://apis/apps/v1/namespaces/istio-control/deployments/ingressgateway",
- "sourcePrincipal": "cluster.local/ns/istio-control/sa/default",
- "sourceWorkload": "ingressgateway",
- "url": "/productpage",
- "userAgent": "curl/7.54.0",
- "xForwardedFor": "10.128.0.35"
- }
分布式追蹤
通過(guò)追蹤請(qǐng)求來(lái)了解服務(wù)之間的調(diào)用關(guān)系,用于問(wèn)題的排查以及性能分析。分布式追蹤通過(guò)監(jiān)控流經(jīng)網(wǎng)格的單個(gè)請(qǐng)求,提供了一種監(jiān)控和理解行為的方法。追蹤使網(wǎng)格的運(yùn)維人員能夠理解服務(wù)的依賴關(guān)系以及在服務(wù)網(wǎng)格中的延遲源。
Istio 支持通過(guò) Envoy 代理進(jìn)行分布式追蹤。代理自動(dòng)為其應(yīng)用程序生成追蹤 span,只需要應(yīng)用程序轉(zhuǎn)發(fā)適當(dāng)?shù)恼?qǐng)求上下文即可。
Istio 支持很多追蹤系統(tǒng),包括 Zipkin、Jaeger、LightStep、Datadog。運(yùn)維人員控制生成追蹤的采樣率(每個(gè)請(qǐng)求生成跟蹤數(shù)據(jù)的速率)。這允許運(yùn)維人員控制網(wǎng)格生成追蹤數(shù)據(jù)的數(shù)量和速率。
更多關(guān)于 Istio 分布式追蹤的信息可以在分布式追蹤 FAQ 中找到。
Istio 為一個(gè)請(qǐng)求生成的分布式追蹤數(shù)據(jù):
本文轉(zhuǎn)載自微信公眾號(hào)「JavaEdge」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系JavaEdge公眾號(hào)。