Istio爲網格內的全部服務通訊生成詳細的遙測。這種遙測功能提供了服務行爲的可觀察性,使運維同窗能夠對應用程序進行故障排除,維護和優化,而不會給服務開發人員帶來任何額外負擔。經過Istio,能夠全面瞭解受監控的服務如何與其餘服務以及與Istio組件自己進行交互。後端
Istio生成如下遙測類型,以提供總體服務網格可觀察性:api
本文咱們主要講述metrcis。網絡
在大多數狀況下,指標是可觀察性的起點。它們的收集成本低,存儲成本低,便於快速分析,而且是衡量總體健康情況的好方法。
爲了監控服務行爲,Istio會爲Istio服務網格內,外全部服務流量生成指標。這些度量標準提供有關行爲的信息,例如總流量,流量中的錯誤率以及請求的響應時間。
除了監控網格內服務的行爲外,監控網格自己的行爲也很重要。 Istio組件根據本身的內部行爲導出度量標準,以提供有關網格控制平面的運行情況和功能的看法。app
下面咱們詳細講下如下:運維
代理級別指標tcp
Istio指標收集從Sidecar代理(Envoy)開始。每一個代理都會生成一組豐富的指標,用於衡量經過代理的全部流量(入站和出站)。代理還提供有關代理自己的管理功能的詳細統計信息,包括配置和運行情況信息。分佈式
Envoy生成的度量標準以Envoy資源(例如偵聽器和集羣)的粒度提供對網格的監視。所以,須要瞭解網狀服務和Envoy資源之間的鏈接才能監視Envoy指標。ide
Istio使咱們能夠選擇在每一個工做負載實例中生成和收集哪些Envoy指標。默認狀況下,Istio僅啓用Envoy生成的統計信息的一小部分,以免過多的度量標準後端並減小與度量標準收集相關的CPU開銷。可是,咱們能夠在須要時輕鬆擴展收集的代理指標集。這樣能夠針對性地調試網絡行爲,同時下降mesh監控的總成本。性能
Envoy官方文檔包括Envoy統計信息收集的詳細概述。 Envoy Statistics上的操做指南提供了有關控制代理級度量標準生成的更多信息。優化
代理級別指標示例:
envoy_cluster_internal_upstream_rq{response_code_class="2xx",cluster_name="xds-grpc"} 7163 envoy_cluster_upstream_rq_completed{cluster_name="xds-grpc"} 7164 envoy_cluster_ssl_connection_error{cluster_name="xds-grpc"} 0 envoy_cluster_lb_subsets_removed{cluster_name="xds-grpc"} 0 envoy_cluster_internal_upstream_rq{response_code="503",cluster_name="xds-grpc"} 1
服務級別指標
除了代理級別的度量標準以外,Istio還提供了一組面向服務的度量標準,用於監控服務通訊。這些指標涵蓋了四個基本的服務監視需求:延遲,流量,錯誤和飽和度。 Istio附帶了一組默認的儀表板,用於根據這些指標監視服務行爲。
默認狀況下,標準Istio指標會導出到Prometheus。
服務級別指標的使用徹底是可選的。運維同窗能夠選擇關閉這些指標的生成和收集,以知足他們的個性化需求。
服務級別指標示例:
istio_requests_total{ connection_security_policy="mutual_tls", destination_app="details", destination_canonical_service="details", destination_canonical_revision="v1", 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_canonical_service="productpage", source_canonical_revision="v1", source_principal="cluster.local/ns/default/sa/default", source_version="v1", source_workload="productpage-v1", source_workload_namespace="default" } 214
控制層指標
Istio控制平面還提供了一系列自我監控指標。這些度量標準容許監視Istio自己的行爲(與網格內服務的行爲不一樣)。
主要包括pilot,galley等組件指標。更多相關信息能夠參閱官方文檔。
所謂最佳實踐,只要包括如下兩個方面:
好比爲了聚合實例和容器之間的度量,使用如下recording rules更新默認的Prometheus配置:
groups: - name: "istio.recording-rules" interval: 5s rules: - record: "workload:istio_requests_total" expr: | sum without(instance, namespace, pod) (istio_requests_total) - record: "workload:istio_request_duration_milliseconds_count" expr: | sum without(instance, namespace, pod) (istio_request_duration_milliseconds_count) - record: "workload:istio_request_duration_milliseconds_sum" expr: | sum without(instance, namespace, pod) (istio_request_duration_milliseconds_sum) - record: "workload:istio_request_duration_milliseconds_bucket" expr: | sum without(instance, namespace, pod) (istio_request_duration_milliseconds_bucket) - record: "workload:istio_request_bytes_count" expr: | sum without(instance, namespace, pod) (istio_request_bytes_count) - record: "workload:istio_request_bytes_sum" expr: | sum without(instance, namespace, pod) (istio_request_bytes_sum) - record: "workload:istio_request_bytes_bucket" expr: | sum without(instance, namespace, pod) (istio_request_bytes_bucket) - record: "workload:istio_response_bytes_count" expr: | sum without(instance, namespace, pod) (istio_response_bytes_count) - record: "workload:istio_response_bytes_sum" expr: | sum without(instance, namespace, pod) (istio_response_bytes_sum) - record: "workload:istio_response_bytes_bucket" expr: | sum without(instance, namespace, pod) (istio_response_bytes_bucket) - record: "workload:istio_tcp_connections_opened_total" expr: | sum without(instance, namespace, pod) (istio_tcp_connections_opened_total) - record: "workload:istio_tcp_connections_closed_total" expr: | sum without(instance, namespace, pod) (istio_tcp_connections_opened_total) - record: "workload:istio_tcp_sent_bytes_total_count" expr: | sum without(instance, namespace, pod) (istio_tcp_sent_bytes_total_count) - record: "workload:istio_tcp_sent_bytes_total_sum" expr: | sum without(instance, namespace, pod) (istio_tcp_sent_bytes_total_sum) - record: "workload:istio_tcp_sent_bytes_total_bucket" expr: | sum without(instance, namespace, pod) (istio_tcp_sent_bytes_total_bucket) - record: "workload:istio_tcp_received_bytes_total_count" expr: | sum without(instance, namespace, pod) (istio_tcp_received_bytes_total_count) - record: "workload:istio_tcp_received_bytes_total_sum" expr: | sum without(instance, namespace, pod) (istio_tcp_received_bytes_total_sum) - record: "workload:istio_tcp_received_bytes_total_bucket" expr: | sum without(instance, namespace, pod) (istio_tcp_received_bytes_total_bucket)
暴露指標
默認條件下,istio經過爲控制平面和數據平面的Pod增長註解的方式,告訴Prometheus採集指標的端口和路徑。
好比控制層istiod組件:
apiVersion: v1 kind: Pod metadata: annotations: prometheus.io/port: "15014" prometheus.io/scrape: "true" sidecar.istio.io/inject: "false" labels: app: istiod
istiod 在端口15014暴露metrcis。
對於istio-ingressgateway :
apiVersion: v1 kind: Pod metadata: annotations: prometheus.io/path: /stats/prometheus prometheus.io/port: "15090" prometheus.io/scrape: "true" sidecar.istio.io/inject: "false" labels: app: istio-ingressgateway
istio-ingressgateway 在端口15090暴露metrcis。
對於數據平面的代理:
apiVersion: v1 kind: Pod metadata: annotations: prometheus.io/path: /stats/prometheus prometheus.io/port: "15020" prometheus.io/scrape: "true" labels: app: helloworld
proxy 在端口15020暴露metrcis。
因爲ingressgateway和代理均爲基於envoy實現,因此其metrcis路徑均爲/stats/prometheus。
Prometheus配置
此時咱們配置咱們的prometheus收集這些數據便可。實際上,就是典型的prometheus k8s 服務發現功能,具體就是對於pod的自動發現。
以下:
scrape_configs: - job_name: kubernetes-pods kubernetes_sd_configs: - role: pod relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scrape - action: replace regex: (.+) source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_path target_label: __metrics_path__ - action: replace regex: ([^:]+)(?::d+)?;(d+) replacement: $1:$2 source_labels: - __address__ - __meta_kubernetes_pod_annotation_prometheus_io_port target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: kubernetes_namespace - action: replace source_labels: - __meta_kubernetes_pod_name target_label: kubernetes_pod_name
至此指標已經收集到咱們的監控系統中了,接下來就是展現。
Grafana是一個開源監視解決方案,可用於爲Istio配置儀表板。您可使用Grafana監視Istio以及服務網格中應用程序的運行情況。
雖然您能夠構建本身的儀表板,但Istio提供了一組預配置的儀表板,用於網格和控制平面的全部最重要的指標。
好比控制層平面監控,具體效果以下: