WEBKT

Istio 可观测性实战:指标、日志、追踪,打造高性能微服务

37 0 0 0

为什么我们需要 Istio 的可观测性?

Istio 可观测性配置实战

1. 指标收集与展示:Prometheus + Grafana

1.1 安装 Prometheus 和 Grafana

1.2 配置 Prometheus 抓取 Istio 指标

1.3 配置 Grafana 数据源和仪表盘

2. 日志收集与分析:Fluentd/Fluent Bit + Elasticsearch + Kibana

2.1 安装 Fluentd/Fluent Bit、Elasticsearch 和 Kibana

2.2 配置 Fluent Bit 收集 Istio 日志

2.3 配置 Kibana 查看日志

3. 分布式追踪:Jaeger

3.1 安装 Jaeger

3.2 配置 Istio 启用追踪

3.3 查看追踪数据

Istio 可观测性进阶:自定义指标和追踪

1. 自定义指标

2. 自定义追踪

总结

Istio 的强大之处,除了流量管理、安全加固,还在于其卓越的可观测性。作为一名对服务性能有极致追求的开发者,你一定深知,只有全面、深入地了解系统的运行状态,才能精准定位瓶颈、优化性能。今天,咱们就来聊聊 Istio 的可观测性三剑客:指标(Metrics)、日志(Logs)和追踪(Tracing),手把手教你如何配置和使用,让你的微服务性能尽在掌握。

为什么我们需要 Istio 的可观测性?

在传统的单体应用架构下,调试和监控相对简单。但当我们转向微服务架构,应用被拆分成多个独立的服务,相互之间通过网络调用,问题排查的难度陡增。一个请求可能跨越多个服务,任何一个环节的延迟或错误都可能导致整个请求失败。如果没有完善的可观测性机制,我们将陷入“盲人摸象”的困境。

Istio 的可观测性,正是为了解决这个问题而生。它像一个全方位的监控系统,为我们提供了以下能力:

  • 指标监控:实时了解服务的 CPU、内存、请求量、错误率等关键指标,洞察系统整体健康状况。
  • 日志分析:记录服务运行过程中的详细信息,方便我们回溯问题、分析原因。
  • 分布式追踪:还原请求在微服务中的完整调用链,精准定位性能瓶颈和故障点。

通过这三者的结合,我们可以构建一个全方位、立体化的监控体系,实现对微服务性能的全面掌控。

Istio 可观测性配置实战

接下来,我们将深入 Istio 可观测性的配置细节,一步步教你如何搭建自己的监控系统。我们将以 Prometheus、Grafana 和 Jaeger 为例,演示如何收集、展示和分析 Istio 的监控数据。

1. 指标收集与展示:Prometheus + Grafana

Istio 默认集成了 Prometheus,可以自动收集 Envoy 代理产生的各种指标。我们只需要简单配置,即可将这些指标接入 Prometheus,并通过 Grafana 进行可视化展示。

1.1 安装 Prometheus 和 Grafana

你可以使用 Helm 或 Kubernetes 的 YAML 文件来安装 Prometheus 和 Grafana。这里以 Helm 为例:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack
helm install grafana grafana/grafana

1.2 配置 Prometheus 抓取 Istio 指标

Istio 默认会暴露一个 /stats/prometheus 端点,Prometheus 可以通过这个端点抓取指标。我们需要在 Prometheus 的配置文件中添加相应的抓取配置。

如果你使用 Helm 安装的 kube-prometheus-stack,它会自动发现 Istio 的指标,通常不需要额外配置。你可以通过 kubectl get servicemonitor -n monitoring 查看是否已经创建了 Istio 相关的 ServiceMonitor。

1.3 配置 Grafana 数据源和仪表盘

安装完成后,我们可以通过 kubectl port-forward 将 Grafana 的端口映射到本地:

kubectl port-forward -n monitoring svc/grafana 3000:80

然后,在浏览器中访问 http://localhost:3000,使用默认的用户名和密码(admin/admin)登录 Grafana。

接下来,我们需要添加 Prometheus 作为数据源:

  1. 点击左侧导航栏的“Configuration” -> “Data Sources”。
  2. 点击“Add data source”。
  3. 选择“Prometheus”。
  4. 在“HTTP” -> “URL”中填写 Prometheus 的服务地址(例如 http://prometheus-server.monitoring.svc.cluster.local)。
  5. 点击“Save & Test”。

添加数据源后,我们可以导入 Istio 官方提供的 Grafana 仪表盘:

  1. 点击左侧导航栏的“Create” -> “Import”。
  2. 输入 Istio 仪表盘的 ID(例如 7639)或 URL,或者上传仪表盘的 JSON 文件。
  3. 选择 Prometheus 数据源。
  4. 点击“Import”。

现在,你就可以在 Grafana 中看到 Istio 的各种指标了,包括请求量、错误率、延迟等。

2. 日志收集与分析:Fluentd/Fluent Bit + Elasticsearch + Kibana

Istio 默认会将 Envoy 的访问日志输出到标准输出。我们可以使用 Fluentd 或 Fluent Bit 将这些日志收集到 Elasticsearch,并通过 Kibana 进行查询和分析。

2.1 安装 Fluentd/Fluent Bit、Elasticsearch 和 Kibana

你可以根据自己的需求选择 Fluentd 或 Fluent Bit。这里以 Fluent Bit 为例,并使用 Helm 安装 Elasticsearch 和 Kibana:

helm repo add elastic https://helm.elastic.co
helm repo update
helm install elasticsearch elastic/elasticsearch
helm install kibana elastic/kibana

安装 Fluent Bit:

kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-service-account.yaml
kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role.yaml
kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role-binding.yaml
kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/elasticsearch/fluent-bit-configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-ds.yaml

2.2 配置 Fluent Bit 收集 Istio 日志

上述 Fluent Bit 的配置会收集所有 Pod 的标准输出日志,并将其发送到 Elasticsearch。你可以根据需要修改 ConfigMap 中的配置,例如添加过滤规则、解析日志格式等。

2.3 配置 Kibana 查看日志

通过 kubectl port-forward 将 Kibana 的端口映射到本地:

kubectl port-forward -n default svc/kibana-kibana 5601:5601

在浏览器中访问 http://localhost:5601,进入 Kibana。

接下来,我们需要创建索引模式:

  1. 点击左侧导航栏的“Stack Management” -> “Index Patterns”。
  2. 点击“Create index pattern”。
  3. 输入索引模式名称(例如 fluent-bit-*)。
  4. 选择时间戳字段(例如 @timestamp)。
  5. 点击“Create index pattern”。

现在,你就可以在 Kibana 的“Discover”页面中查询和分析 Istio 的访问日志了。

3. 分布式追踪:Jaeger

Istio 默认集成了 Jaeger,可以自动收集 Envoy 代理产生的追踪数据。我们只需要简单配置,即可将这些数据发送到 Jaeger,并通过 Jaeger UI 进行可视化展示。

3.1 安装 Jaeger

你可以使用 Helm 或 Kubernetes 的 YAML 文件来安装 Jaeger。这里以 Helm 为例:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm repo update
helm install jaeger jaegertracing/jaeger

3.2 配置 Istio 启用追踪

Istio 默认禁用了追踪。我们需要修改 Istio 的配置,启用追踪并设置采样率:

istioctl install --set values.global.tracer.zipkin.address=$(kubectl -n istio-system get svc zipkin -o jsonpath='{.spec.clusterIP}')

这里假设你已经安装了 Istio,并且 Jaeger 的服务名为 zipkin。你可以根据实际情况修改 zipkin.address

3.3 查看追踪数据

通过 kubectl port-forward 将 Jaeger UI 的端口映射到本地:

kubectl port-forward -n istio-system svc/jaeger-query 16686:16686

在浏览器中访问 http://localhost:16686,进入 Jaeger UI。

现在,你就可以在 Jaeger UI 中查看请求的完整调用链,包括每个服务的耗时、调用的方法等。

Istio 可观测性进阶:自定义指标和追踪

除了 Istio 默认提供的指标和追踪,我们还可以根据自己的需求,自定义指标和追踪。

1. 自定义指标

Istio 允许我们通过 EnvoyFilter 自定义指标。我们可以使用 Envoy 的 stats 过滤器,添加自定义的指标,并将其暴露给 Prometheus。

例如,我们可以添加一个自定义指标,统计某个服务的请求处理时间:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-metrics
namespace: istio-system
spec:
workloadSelector:
labels:
app: your-app
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.filters.http.router"
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.wasm
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
config:
name: "custom_metrics"
root_id: "custom_metrics"
vm_config:
vm_id: custom_metrics_vm
runtime: envoy.wasm.runtime.v8
code:
local:
filename: /var/local/lib/wasm-filters/custom_metrics.wasm
allow_precompiled: true

这段配置会在 your-app 的 Sidecar 中插入一个 WASM 过滤器,该过滤器会读取 custom_metrics.wasm 文件中的代码,执行自定义的指标逻辑。你需要自行编写 custom_metrics.wasm 文件,实现指标的计算和上报。

2. 自定义追踪

Istio 允许我们在应用代码中添加自定义的追踪 Span,以便更精细地分析请求的处理过程。

你可以使用 OpenTracing 或 OpenCensus 等追踪库,在代码中创建 Span,并将其与 Istio 的追踪上下文关联起来。Istio 会自动将这些 Span 整合到完整的追踪链中。

例如,使用 OpenTracing 的 Java 客户端:

import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
// ...
Tracer tracer = GlobalTracer.get();
Span span = tracer.buildSpan("my-operation").start();
// ... 执行你的业务逻辑 ...
span.finish();

这段代码会在当前请求的追踪链中创建一个名为 my-operation 的 Span,记录你的业务逻辑的执行时间。

总结

Istio 的可观测性为我们提供了强大的监控和诊断工具,帮助我们深入了解微服务的运行状态,精准定位性能瓶颈,优化服务性能。通过本文的介绍,相信你已经掌握了 Istio 可观测性的基本配置和使用方法。希望这些知识能够帮助你构建更加稳定、高效的微服务应用。记住,可观测性不是一蹴而就的,需要我们在实践中不断探索和完善,才能发挥其最大的价值。

如果你在使用过程中遇到任何问题,或者有任何想法和建议,欢迎留言交流,让我们一起进步!

赛博格老司机 Istio可观测性微服务

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8189