太強(qiáng)了,Istio竟然有這么多功能!
? 點(diǎn)擊上方“JavaEdge”,關(guān)注公眾號

1 簡介

Istio,希臘語,意揚(yáng)帆起航。
?
一個完全開源的服務(wù)網(wǎng)格產(chǎn)品,對分布式應(yīng)用是透明的。Istio 管理服務(wù)之間的流量,實(shí)施訪問政策并匯總遙測數(shù)據(jù),而不需要更改應(yīng)用代碼。Istio 以透明的方式對現(xiàn)有分布式應(yīng)用進(jìn)行分層,從而簡化了部署復(fù)雜性。
也是一個平臺,可與任何日志、遙測和策略系統(tǒng)集成。服務(wù)于微服務(wù)架構(gòu),并提供保護(hù)、連接和監(jiān)控微服務(wù)的統(tǒng)一方法。
在原有的數(shù)據(jù)平面的基礎(chǔ)上,增加了控制平面。
為什么會火

發(fā)布及時(2017年5月發(fā)布0.1版本)
巨頭廠商buff 加持
第二代Service Mesh
Envoy的加入讓Istio如虎添翼
功能強(qiáng)大
優(yōu)點(diǎn)

輕松構(gòu)建服務(wù)網(wǎng)格
應(yīng)用代碼無需更改
功能強(qiáng)大

2 核心功能

2.1 流量控制

路由、流量轉(zhuǎn)移 流量進(jìn)出 網(wǎng)絡(luò)彈性能力 測試相關(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)將請求路由到服務(wù),這基于 Istio 和平臺提供的基本的連通性和服務(wù)發(fā)現(xiàn)能力。每個虛擬服務(wù)包含一組路由規(guī)則,Istio 按順序評估它們,Istio 將每個給定的請求匹配到虛擬服務(wù)指定的實(shí)際目標(biāo)地址。您的網(wǎng)格可以有多個虛擬服務(wù),也可以沒有,取決于使用場景。
將流量路由到給定目標(biāo)地址
請求地址與真實(shí)的工作負(fù)載解耦
包含一組路由規(guī)則
通常和目標(biāo)規(guī)則( Destination Rule)成對出現(xiàn)
豐富的路由匹配規(guī)則
2.1.1.2 目標(biāo)規(guī)則( Destination Rule)
定義虛擬服務(wù)路由目標(biāo)地址的真實(shí)地址,即子集。設(shè)置負(fù)載均衡的方式
隨機(jī)
權(quán)重
最少請求數(shù)
2.1.1.3 網(wǎng)關(guān)(Gateway)

Egress 不一定使用。
服務(wù)入口 (Service Entry)
使用服務(wù)入口(Service Entry) 來添加一個入口到 Istio 內(nèi)部維護(hù)的服務(wù)注冊中心,即把外部服務(wù)注冊到網(wǎng)格中。
?添加了服務(wù)入口后,Envoy 代理可以向服務(wù)發(fā)送流量,就好像它是網(wǎng)格內(nèi)部的服務(wù)一樣。
配置服務(wù)入口允許您管理運(yùn)行在網(wǎng)格外的服務(wù)的流量,它包括以下幾種能力:
為外部目標(biāo) redirect 和轉(zhuǎn)發(fā)請求,例如來自 web 端的 API 調(diào)用,或者流向遺留老系統(tǒng)的服務(wù)。
為外部目標(biāo)定義重試、超時和故障注入策略。
添加一個運(yùn)行在虛擬機(jī)的服務(wù)來擴(kuò)展您的網(wǎng)格。
從邏輯上添加來自不同集群的服務(wù)到網(wǎng)格,在 Kubernetes 上實(shí)現(xiàn)一個多集群 Istio 網(wǎng)格。
你不需要為網(wǎng)格服務(wù)要使用的每個外部服務(wù)都添加服務(wù)入口。默認(rèn)情況下,Istio 配置 Envoy 代理將請求傳遞給未知服務(wù)。但是,您不能使用 Istio 的特性來控制沒有在網(wǎng)格中注冊的目標(biāo)流量。
Sidecar
?默認(rèn)情況下,Istio 讓每個 Envoy 代理都可以訪問來自和它關(guān)聯(lián)的工作負(fù)載的所有端口的請求,然后轉(zhuǎn)發(fā)到對應(yīng)的工作負(fù)載。您可以使用 sidecar 配置去做下面的事情:
微調(diào) Envoy 代理接受的端口和協(xié)議集。
限制 Envoy 代理可以訪問的服務(wù)集合。
你可能希望在較龐大的應(yīng)用程序中限制這樣的 sidecar 可達(dá)性,配置每個代理能訪問網(wǎng)格中的任意服務(wù)可能會因?yàn)楦邇?nèi)存使用量而影響網(wǎng)格的性能。
您可以指定將 sidecar 配置應(yīng)用于特定命名空間中的所有工作負(fù)載,或者使用 workloadSelector 選擇特定的工作負(fù)載。
2.1.2 網(wǎng)絡(luò)彈性和測試
除了為你的網(wǎng)格導(dǎo)流,Istio 還提供了可選的故障恢復(fù)和故障注入功能,使你可以在運(yùn)行時動態(tài)配置這些功能。使用這些特性可以讓應(yīng)用程序運(yùn)行穩(wěn)定,確保服務(wù)網(wǎng)格能夠容忍故障節(jié)點(diǎn),并防止局部故障級聯(lián)影響到其他節(jié)點(diǎn)。
超時
超時是 Envoy 代理等待來自給定服務(wù)的答復(fù)的時間量,以確保服務(wù)不會因?yàn)榈却饛?fù)而無限期的掛起,并在可預(yù)測的時間范圍內(nèi)調(diào)用成功或失敗。HTTP 請求的默認(rèn)超時時間是 15 秒,這意味著如果服務(wù)在 15 秒內(nèi)沒有響應(yīng),調(diào)用將失敗。
對于某些應(yīng)用程序和服務(wù),Istio 的缺省超時可能不合適。例如,超時太長可能會由于等待失敗服務(wù)的回復(fù)而導(dǎo)致過度的延遲;而超時過短則可能在等待涉及多個服務(wù)返回的操作時觸發(fā)不必要地失敗。為了找到并使用最佳超時設(shè)置,Istio 允許您使用虛擬服務(wù)按服務(wù)輕松地動態(tài)調(diào)整超時,而不必修改業(yè)務(wù)代碼。
重試
重試設(shè)置指定如果初始調(diào)用失敗,Envoy 代理嘗試連接服務(wù)的最大次數(shù)。通過確保調(diào)用不會因?yàn)榕R時過載的服務(wù)或網(wǎng)絡(luò)等問題而永久失敗,重試可以提高服務(wù)可用性和應(yīng)用程序的性能。重試之間的間隔(25ms+)是可變的,并由 Istio 自動確定,從而防止被調(diào)用服務(wù)被請求淹沒。HTTP 請求的默認(rèn)重試行為是在返回錯誤之前重試兩次。
與超時一樣,Istio 默認(rèn)的重試行為在延遲方面可能不適合您的應(yīng)用程序需求(對失敗的服務(wù)進(jìn)行過多的重試會降低速度)或可用性。您可以在虛擬服務(wù)中按服務(wù)調(diào)整重試設(shè)置,而不必修改業(yè)務(wù)代碼。您還可以通過添加每次重試的超時來進(jìn)一步細(xì)化重試行為,并指定每次重試都試圖成功連接到服務(wù)所等待的時間量。
熔斷器
熔斷器是 Istio 為創(chuàng)建具有彈性的微服務(wù)應(yīng)用提供的另一個有用的機(jī)制。在熔斷器中,設(shè)置一個對服務(wù)中的單個主機(jī)調(diào)用的限制,例如并發(fā)連接的數(shù)量或?qū)υ撝鳈C(jī)調(diào)用失敗的次數(shù)。一旦限制被觸發(fā),熔斷器就會“跳閘”并停止連接到該主機(jī)。使用熔斷模式可以快速失敗而不必讓客戶端嘗試連接到過載或有故障的主機(jī)。
熔斷適用于在負(fù)載均衡池中的“真實(shí)”網(wǎng)格目標(biāo)地址,您可以在目標(biāo)規(guī)則中配置熔斷器閾值,讓配置適用于服務(wù)中的每個主機(jī)
故障注入
在配置了網(wǎng)絡(luò),包括故障恢復(fù)策略之后,可使用 Istio 的故障注入機(jī)制來為整個應(yīng)用程序測試故障恢復(fù)能力。故障注入是一種將錯誤引入系統(tǒng)以確保系統(tǒng)能夠承受并從錯誤條件中恢復(fù)的測試方法。使用故障注入特別有用,能確保故障恢復(fù)策略不至于不兼容或者太嚴(yán)格,這會導(dǎo)致關(guān)鍵服務(wù)不可用。
與其他錯誤注入機(jī)制(如延遲數(shù)據(jù)包或在網(wǎng)絡(luò)層殺掉 Pod)不同,Istio 允許在應(yīng)用層注入錯誤。這使您可以注入更多相關(guān)的故障,例如 HTTP 錯誤碼,以獲得更多相關(guān)的結(jié)果。
可以注入兩種故障,它們都使用虛擬服務(wù)配置:
延遲
延遲是時間故障。它們模擬增加的網(wǎng)絡(luò)延遲或一個超載的上游服務(wù)。
終止
終止是崩潰失敗。他們模仿上游服務(wù)的失敗。終止通常以 HTTP 錯誤碼或 TCP 連接失敗的形式出現(xiàn)。
流量鏡像
流量鏡像,也稱為影子流量,是一個以盡可能低的風(fēng)險為生產(chǎn)帶來變化的強(qiáng)大的功能。鏡像會將實(shí)時流量的副本發(fā)送到鏡像服務(wù)。鏡像流量發(fā)生在主服務(wù)的關(guān)鍵請求路徑之外。
在此任務(wù)中,首先把流量全部路由到 v1 版本的測試服務(wù)。然后,執(zhí)行規(guī)則將一部分流量鏡像到 v2 版本。
2.2 可觀察性

可觀察性≠監(jiān)控
監(jiān)控是指從運(yùn)維角度,被動地審視系統(tǒng)行為和狀態(tài),是在系統(tǒng)之外探查系統(tǒng)的運(yùn)行時狀態(tài)。而可觀察性是從開發(fā)者的角度主動地探究系統(tǒng)的狀態(tài),開發(fā)過程中去考慮把哪些系統(tǒng)指標(biāo)暴露出去。而在原始時期的我們都是通過日志查看系統(tǒng)運(yùn)行時狀態(tài),所以這也是一種理念創(chuàng)新。
組成
指標(biāo)(Metrics)
通過聚合的數(shù)據(jù)來監(jiān)測你的應(yīng)用運(yùn)行情況。為了監(jiān)控服務(wù)行為,Istio 為服務(wù)網(wǎng)格中所有出入的服務(wù)流量都生成了指標(biāo)。這些指標(biāo)提供了關(guān)于行為的信息,例如總流量數(shù)、錯誤率和請求響應(yīng)時間。
除了監(jiān)控網(wǎng)格中服務(wù)的行為外,監(jiān)控網(wǎng)格本身的行為也很重要。Istio 組件可以導(dǎo)出自身內(nèi)部行為的指標(biāo),以提供對網(wǎng)格控制平面的功能和健康情況的洞察能力。
Istio 指標(biāo)收集由運(yùn)維人員配置來驅(qū)動。運(yùn)維人員決定如何以及何時收集指標(biāo),以及指標(biāo)本身的詳細(xì)程度。這使得它能夠靈活地調(diào)整指標(biāo)收集來滿足個性化需求。Istio中的指標(biāo)分類:


Istio 指標(biāo)收集從?sidecar 代理(Envoy)?開始。每個代理為通過它的所有流量(入站和出站)生成一組豐富的指標(biāo)。代理還提供關(guān)于它本身管理功能的詳細(xì)統(tǒng)計(jì)信息,包括配置信息和健康信息。
Envoy 生成的指標(biāo)提供了資源(例如監(jiān)聽器和集群)粒度上的網(wǎng)格監(jiān)控。因此,為了監(jiān)控 Envoy 指標(biāo),需要了解網(wǎng)格服務(wù)和 Envoy 資源之間的連接。
Istio 允許運(yùn)維在每個工作負(fù)載實(shí)例上選擇生成和收集哪個 Envoy 指標(biāo)。默認(rèn)情況下,Istio 只支持 Envoy 生成的統(tǒng)計(jì)數(shù)據(jù)的一小部分,以避免依賴過多的后端服務(wù),還可以減少與指標(biāo)收集相關(guān)的 CPU 開銷。然而,運(yùn)維可以在需要時輕松地擴(kuò)展收集到的代理指標(biāo)集。這支持有針對性地調(diào)試網(wǎng)絡(luò)行為,同時降低了跨網(wǎng)格監(jiān)控的總體成本。
Envoy 文檔包括了 Envoy 統(tǒng)計(jì)信息收集的詳細(xì)說明。Envoy 統(tǒng)計(jì)里的操作手冊提供了有關(guān)控制代理級別指標(biāo)生成的更多信息。
代理級別指標(biāo)的例子:
# 當(dāng)前集群中來自于上游服務(wù)的總的請求數(shù)
envoy_cluster_internal_upstream_rq{response_code_class="2xx",
cluster_name="xds-grpc"} 7163
# 上游服務(wù)完成的請求數(shù)量
envoy_cluster_upstream_rq_completed{cluster_name="xds-grpc"} 7164
# 是SSL連接出錯的數(shù)量
envoy_cluster_ssl_connection_error{cluster_name="xds-grpc"} 0

監(jiān)控服務(wù)通信的面向服務(wù)的指標(biāo)。
四個基本的服務(wù)監(jiān)控需求:延遲、流量、錯誤和飽和情況。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ù)級別指標(biāo)的使用完全是可選的。運(yùn)維人員可以選擇關(guān)閉指標(biāo)的生成和收集來滿足自身需要。
服務(wù)級別指標(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

每一個 Istio 的組件(Pilot、Galley、Mixer)都提供了對自身監(jiān)控指標(biāo)的集合。這些指標(biāo)容許監(jiān)控 Istio 自己的行為(這與網(wǎng)格內(nèi)的服務(wù)有所不同)。
訪問日志
通過應(yīng)用產(chǎn)生的事件來監(jiān)控你的應(yīng)用。訪問日志提供了一種從單個工作負(fù)載實(shí)例的角度監(jiān)控和理解行為的方法。Istio 可以從一組可配置的格式集生成服務(wù)流量的訪問日志,為運(yùn)維人員提供日志記錄的方式、內(nèi)容、時間和位置的完全控制。Istio 向訪問日志機(jī)制暴露了完整的源和目標(biāo)元數(shù)據(jù),允許對網(wǎng)絡(luò)通信進(jìn)行詳細(xì)的審查。
生成位置可選
訪問日志可以在本地生成,或者導(dǎo)出到自定義的后端基礎(chǔ)設(shè)施,包括 Fluentd。
日志內(nèi)容
應(yīng)用日志 Envoy 服務(wù)日志:kubectl logs -l app=demo -C istio-proxy
Istio 訪問日志例子(JSON 格式):
{
"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"
}分布式追蹤
通過追蹤請求來了解服務(wù)之間的調(diào)用關(guān)系,用于問題的排查以及性能分析。分布式追蹤通過監(jiān)控流經(jīng)網(wǎng)格的單個請求,提供了一種監(jiān)控和理解行為的方法。追蹤使網(wǎng)格的運(yùn)維人員能夠理解服務(wù)的依賴關(guān)系以及在服務(wù)網(wǎng)格中的延遲源。
Istio 支持通過 Envoy 代理進(jìn)行分布式追蹤。代理自動為其應(yīng)用程序生成追蹤 span,只需要應(yīng)用程序轉(zhuǎn)發(fā)適當(dāng)?shù)恼埱笊舷挛募纯伞?/span>
Istio 支持很多追蹤系統(tǒng),包括 Zipkin、Jaeger、LightStep、Datadog。運(yùn)維人員控制生成追蹤的采樣率(每個請求生成跟蹤數(shù)據(jù)的速率)。這允許運(yùn)維人員控制網(wǎng)格生成追蹤數(shù)據(jù)的數(shù)量和速率。
更多關(guān)于 Istio 分布式追蹤的信息可以在分布式追蹤 FAQ 中找到。
Istio 為一個請求生成的分布式追蹤數(shù)據(jù):?
往期推薦

目前交流群已有?800+人,旨在促進(jìn)技術(shù)交流,可關(guān)注公眾號添加筆者微信邀請進(jìn)群
喜歡文章,點(diǎn)個“在看、點(diǎn)贊、分享”素質(zhì)三連支持一下~
