Istio服務網格最流行和最強大的功能之一就是其先進的可觀察性。由於全部服務到服務的通訊都是經過Envoy代理路由的,而且Istio的控制平面可以從這些代理收集日誌和指標,因此服務網格能夠爲咱們提供有關網絡狀態和服務行爲的深入看法。這爲運營商提供了獨特的故障排除,管理和優化服務方式,而不會給應用程序開發人員帶來任何額外的負擔。api
所以,運營商能夠深刻了解受監控的服務如何在入站和出站方向上進行交互。這些指標提供了各類信息,包括總流量,錯誤率和請求響應時間。服務器
代理級指標是Envoy代理自己提供的有關全部直通流量的標準指標,以及有關代理管理功能的詳細統計信息,包括配置和運行情況信息。網絡
Envoy生成的度量標準存在於Envoy資源(例如偵聽器和集羣)的粒度級別上。app
# TYPE envoy_cluster_internal_upstream_rq_200 counter envoy_cluster_internal_upstream_rq_200{cluster_name="xds-grpc"} 2 # TYPE envoy_cluster_upstream_rq_200 counter envoy_cluster_upstream_rq_200{cluster_name="xds-grpc"} 2 # TYPE envoy_cluster_upstream_rq_completed counter envoy_cluster_upstream_rq_completed{cluster_name="xds-grpc"} 3 # TYPE envoy_cluster_internal_upstream_rq_503 counter envoy_cluster_internal_upstream_rq_503{cluster_name="xds-grpc"} 1 # TYPE envoy_cluster_upstream_cx_rx_bytes_total counter envoy_cluster_upstream_cx_rx_bytes_total{cluster_name="xds-grpc"} 2056154 # TYPE envoy_server_memory_allocated gauge envoy_server_memory_allocated{} 15853480
除了代理級別的度量標準以外,Istio還提供了一組面向服務的度量標準,用於監控服務通訊。這些指標涵蓋了四個基本的服務監視需求:延遲,流量,錯誤和飽和。 less
Istio附帶了一組默認的儀表板,用於根據這些指標監視服務行爲。tcp
# TYPE istio_requests_total counter istio_requests_total{ connection_security_policy="mutual_tls", destination_app="analytics", destination_principal="cluster.local/ns/backyards-demo/sa/default", destination_service="analytics.backyards-demo.svc.cluster.local", destination_service_name="analytics", destination_service_namespace="backyards-demo", destination_version="v1", destination_workload="analytics-v1", destination_workload_namespace="backyards-demo", permissive_response_code="none", permissive_response_policyid="none", reporter="destination", request_protocol="http", response_code="200", response_flags="-", source_app="bookings", source_principal="cluster.local/ns/backyards-demo/sa/default", source_version="v1", source_workload="bookings-v1", source_workload_namespace="backyards-demo" } 1855
直到Istio 1.4爲止,Istio的服務級別指標都是由稱爲Mixer的中央組件提供的。ide
在每次報告遙測請求後,Envoy Sidecar都會調用Mixer,而Mixer提供了Prometheus指標終結點以公開收集的指標,從而使它們可用於抓取。代理將有關請求的源端和目標端的數據發送到每一個報告中的Mixer,最重要的是源和目標工做負載的惟一ID(在K8s環境中基本上是惟一的Pod ID),這是Mixer的責任從K8中獲取其餘元數據,並將指標顯示在特定端點上以供Prometheus抓取。性能
儘管Envoy Sidecar能夠緩衝傳出的遙測請求,但該體系結構在較大的環境中會產生大量的資源消耗。每一個代理和Mixer之間必須創建活動鏈接。顯然,這會致使代理中更高的CPU和內存消耗,隨後還會致使更高的延遲。優化
爲了減小代理的資源消耗並(一樣重要的是)下降增長的延遲,遙測功能從頭開始從新構造。它以較小的CPU佔用空間從主動收集轉向被動收集。spa
較舊的Envoy版本不容易擴展,向Envoy添加擴展須要一個總體的構建過程,而且擴展必須使用C++編寫。須要部署二進制文件,須要滾動更新等,而且整個過程難以管理。儘管如此,仍經過定製的Envoy支持基於Mixer的實現,該Envoy具備全部必需的功能。
因爲Istio Telemetry V2缺乏可訪問K8s元數據的中央組件(Mixer),所以代理服務器自己須要提供豐富指標所需的元數據。此外,必須將Enmixer提供的功能添加到Mixer中,以替代基於Mixer的遙測技術。 Istio Telemetry V2使用兩個自定義的Envoy插件來實現這一目標。
根據Istio文檔,新的遙測系統將等待時間減小了一半-90%的等待時間已從7毫秒減小到3.3毫秒。不只如此,消除Mixer還使總CPU消耗減小了50%,降至每秒每1,000個請求0.55個vCPU。
WebAssembly(一般縮寫爲WASM)是一個開放標準,爲可執行程序定義了一種可移植的二進制代碼格式,以及一種相應的文本彙編語言,以及有助於程序與其主機環境之間進行交互的接口。
WebAssembly的主要目標是在網頁上啓用高性能應用程序,可是該格式還旨在在其餘環境中執行和集成。它提供了一個基於精益堆棧的虛擬機,它經過利用快速加載的二進制格式(能夠將其轉換爲文本格式進行調試)來使Web應用程序以接近本機的速度運行。並且,儘管WebAssembly最初是做爲客戶端技術而誕生的,但在服務器端使用它具備許多優勢。
Istio社區一直在領導Envoy的WebAssembly(WASM)運行時的實現。該實現使用基於Google高性能V8引擎構建的WebAssembly運行時。
使用Envoy的WebAssembly插件,開發人員能夠編寫其自定義代碼,將其編譯爲WebAssembly插件,並配置Envoy來執行它。這些插件能夠包含任意邏輯(這是簡單的代碼!),所以它們對於各類消息集成和變異頗有用。
Telemetry V2中的代理內服務級別指標由兩個自定義插件提供,即元數據交換
和統計信息
。
默認狀況下,在Istio 1.5中,啓用遙測V2是在Istio代理過濾器中編譯的,主要是出於性能方面的考慮。相同的Filter也將編譯爲WebAssembly(WASM)模塊,並隨Istio代理一塊兒提供。在即將發佈的版本中,性能將不斷提升。
必須解決的第一個問題是如何在代理中提供有關鏈接兩側的客戶端/服務器元數據。
對於基於HTTP的流量,這是經過包含對方的元數據屬性的請求/響應中的自定義HTTP標頭(envoy.wasm.metadata_exchange.upstream,envoy.wasm.metadata_exchange.downstream)完成的。
對於通常的TCP通訊,元數據交換使用基於ALPN的隧道和基於前綴的協議。定義了一個新的協議istio-peer-exchange,該協議由網狀網絡中的客戶端和服務器Sidecar通告並肯定優先級。對於啓用Istio的代理之間的鏈接,但不是啓用Istio的代理與任何客戶端之間的鏈接,ALPN協商將協議解析爲istio-peer-exchange。
stats插件將傳入和傳出的流量指標記錄到Envoy統計子系統中,並使它們可供Prometheus抓取。
如下是默認狀況下導出的標準服務級別指標。
對於HTTP,HTTP/2和GRPC流量,代理將生成如下指標:
Name | Description |
---|---|
istio_requests_total | This is a COUNTER incremented for every request handled by an Istio proxy. |
istio_request_duration_milliseconds | This is a DISTRIBUTION which measures the duration of requests. |
istio_request_bytes | This is a DISTRIBUTION which measures HTTP request body sizes. |
istio_response_bytes | This is a DISTRIBUTION which measures HTTP response body sizes. |
對於TCP流量,代理會生成如下指標:
Name | Description |
---|---|
istio_tcp_sent_bytes_total | This is a COUNTER which measures the size of total bytes sent during response in case of a TCP connection. |
istio_tcp_received_bytes_total | This is a COUNTER which measures the size of total bytes received during request in case of a TCP connection. |
istio_tcp_connections_opened_total | This is a COUNTER incremented for every opened connection. |
istio_tcp_connections_closed_total | This is a COUNTER incremented for every closed connection. |
如下是服務級別指標上的默認標籤:
reporter: conditional((context.reporter.kind | "inbound") == "outbound", "source", "destination") source_workload: source.workload.name | "unknown" source_workload_namespace: source.workload.namespace | "unknown" source_principal: source.principal | "unknown" source_app: source.labels["app"] | "unknown" source_version: source.labels["version"] | "unknown" destination_workload: destination.workload.name | "unknown" destination_workload_namespace: destination.workload.namespace | "unknown" destination_principal: destination.principal | "unknown" destination_app: destination.labels["app"] | "unknown" destination_version: destination.labels["version"] | "unknown" destination_service: destination.service.host | "unknown" destination_service_name: destination.service.name | "unknown" destination_service_namespace: destination.service.namespace | "unknown" request_protocol: api.protocol | context.protocol | "unknown" response_code: response.code | 200 connection_security_policy: conditional((context.reporter.kind | "inbound") == "outbound", "unknown", conditional(connection.mtls | false, "mutual_tls", "none")) response_flags: context.proxy_error_code | "-" source_canonical_service source_canonical_revision destination_canonical_service destination_canonical_revision
Istio 1.5中的stats插件不只包含標準指標,並且還提供了對它們進行修改的實驗性支持。請注意,因爲新的擴展API設計,在Istio 1.6中將更改用於配置指標的API。
雖然1.5版不推薦使用Mixer;它是一個高度可配置的組件,並提供許多功能。 Mixer提供的遙測功能與V2提供的功能之間存在很大的功能差異。