如何通过Istio将分布式追踪与指标导出到Elastic Stack(ELK)实现可观测性
Istio对接Elastic Stack导出可观测性数据实现方案
整体高层架构
整个链路没有冗余的中间采集组件,数据流分层如下:
- 数据生产层:Istio注入的Sidecar(Envoy代理)自动生成全链路追踪Span、服务调用黄金指标(延迟、吞吐量、错误率)、连接状态等可观测性数据
- 数据导出层:通过Istio原生的OTLP导出能力/端点暴露能力,直接将数据输出到Elastic Stack的采集入口
- 数据存储层:Elasticsearch负责存储结构化的追踪、指标数据,支持按时间分片管理降低存储成本
- 数据应用层:Kibana提供链路查询、指标仪表盘、异常告警、根因分析等功能
分布式追踪数据导出配置
Elastic Stack从7.14版本开始原生支持OTLP协议摄入,无需通过Jaeger中转,直接对接Istio即可:
- 修改Istio安装配置,指定追踪数据导出目标为Elastic APM Server的OTLP gRPC端点,参考IstioOperator配置片段:
apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: meshConfig: defaultConfig: tracing: open_telemetry: address: "elastic-apm-server.elastic-system.svc:4317" timeout: 10s enableTracing: true sampling: 0.05 # 采样率按需调整,生产环境建议默认设置为5%以下避免数据量过大
- 确认Elastic APM Server已开启OTLP监听:默认APM Server会开放4317(gRPC)、4318(HTTP)端口作为OTLP入口,无需额外修改配置,仅需通过K8s网络策略放行Istio Sidecar到APM Server的访问权限即可
- 验证:产生业务流量后,可直接在Kibana的APM模块查看服务调用拓扑、全链路追踪详情、Span耗时分布等数据
指标数据导出配置
有两种成熟的实现方案,可根据你的Istio版本选择:
方案1:Sidecar指标暴露+Filebeat采集(兼容所有Istio版本)
- Istio Sidecar默认在15090端口暴露
/stats/prometheus端点,输出全量Envoy运行指标 - 部署Filebeat作为采集代理,配置Prometheus采集模块拉取所有带Istio注入标签的Pod的指标,处理后直接推送到Elasticsearch,参考配置片段:
filebeat.inputs: - type: prometheus hosts: ["${POD_IP}:15090"] metrics_path: /stats/prometheus processors: - add_fields: fields: service_mesh: istio pod_namespace: ${POD_NAMESPACE} pod_name: ${POD_NAME} output.elasticsearch: hosts: ["elasticsearch.elastic-system.svc:9200"] username: "${ES_AUTH_USER}" password: "${ES_AUTH_PWD}"
- 优势:无需修改Istio默认配置,适配性强,可灵活做指标过滤、字段格式化处理
方案2:OTLP直接推送(适配Istio 1.18及以上版本)
- 直接创建Istio的Telemetry自定义资源,配置指标导出规则,将指定的Istio标准指标直接推送到APM Server的OTLP端点,无需额外部署采集组件
- 可通过Telemetry资源灵活配置需要导出的指标维度、聚合规则,减少无效数据传输
注意事项
- 可配置Elastic Ingest Pipeline对收到的追踪、指标数据做二次处理,丢弃无用字段、补充业务标签,进一步降低存储成本
- 生产环境建议配置分层采样规则:错误请求全采样,正常请求低比例采样,兼顾排障需求和资源成本
- 所有Elastic Stack组件建议和Istio部署在同一K8s集群内,避免跨集群传输带来的延迟和安全风险
内容的提问来源于stack exchange,提问作者KDS
相关产品推荐
相关产品推荐

