Apache SkyWalking 集成 Istio 服务网格监控:基于 OpenTelemetry Collector 传输控制面指标
2026/9/20 19:33:23 网站建设 项目流程
  • 可观测性
  • 后端
  • 微服务
  • 云原生

【免费下载链接】skywalking

APM, Application Performance Monitoring System

项目地址:https://gitcode.com/gh_mirrors/sky/skywalking
点击查看免费下载

导读

本文基于 Apache SkyWalking 官方文档 Working with Istio 展开,讲解如何将 Istio 服务网格的自监控指标(控制面 istiod 指标)通过 OpenTelemetry Collector 采集、转换并传输到 SkyWalking OAP 服务器,最终在 SkyWalking UI 中以Dashboard -> Istio控制面板呈现。读完本文,你将掌握一条完整的可落地方案:在 Kubernetes 中部署 OAP 并激活 OpenTelemetry receiver、配置 OpenTelemetry Collector 抓取 istiod 的 Prometheus 指标并通过 OTLP 协议上报、理解 OAP 侧otel-rules/istio-controlplane.yaml指标解析规则,以及如何在 UI、CLI 与告警层面消费这些指标。

方案总体架构与数据链路

Istio 集成监控的核心思路不是让 SkyWalking 直接对接 Istio,而是借助 OpenTelemetry Collector 作为中转与适配层。整体数据流如下:

Istio Control Plane (istiod, Prometheus 指标端点) │ prometheus receiver (kubernetes_sd_configs 发现并抓取) ▼ OpenTelemetry Collector │ otlp exporter (gRPC, 11800 端口) ▼ SkyWalking OAP Server (receiver-otel / otlp handler) │ otel-rules/istio-controlplane.yaml (MAL 规则) ▼ MeterSystem → 指标存储 → SkyWalking UI / swctl / 告警

其中 Collector 承担「从 Istio 抓取指标」和「把指标推送给 OAP」两个职责;OAP 侧由 OpenTelemetry receiver(receiver-otel模块)接收 OTLP 数据,再依据 MAL(Meter Analysis Language,见 mal.md)规则把 Prometheus 风格的原始指标换算为 SkyWalking 的度量模型。

需要说明的是,本方案观察的是Istio 控制面(Control Plane)自身的健康与行为;如果需要观察 Istio 托管业务服务(Service Mesh 数据面的服务拓扑与调用关系),应使用 ALS 方案,详见本文末尾。

前置条件

在开始之前,需要确认以下环境就绪:

  1. Kubernetes 集群:Istio 应已安装到集群中。可参照 Istio 官方提供的 Getting Started 指引完成安装(本文不展开 Istio 安装细节)。
  2. SkyWalking OAP 后端:部署于同一 Kubernetes 集群内,且已激活 OpenTelemetry receiver(下文详述)。
  3. OpenTelemetry Collector:作为指标采集与转发组件独立部署。

部署 SkyWalking 后端并激活 OpenTelemetry Receiver

OAP 服务器可按 backend-k8s.md 中的步骤部署到 Kubernetes 集群。关键在于激活并正确配置 OpenTelemetry receiver,使其能够接收 Collector 推送的指标。

激活 receiver-otel 模块

OpenTelemetry receiver 在 OAP 中以receiver-otel模块存在,需要显式开启。可通过系统环境变量SW_OTEL_RECEIVER=default激活,或在 OAP 的application.yml中配置:

receiver-otel: selector: ${SW_OTEL_RECEIVER:default} default: enabledHandlers: ${SW_OTEL_RECEIVER_ENABLED_HANDLERS:"otlp-metrics"} enabledOtelMetricsRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:"istio-controlplane"}

参数说明:

配置项环境变量作用
selectorSW_OTEL_RECEIVER选择 receiver 实现,默认值为default,对应源码中的OtelMetricReceiverProvider(见 OtelMetricReceiverProvider.java)
enabledHandlersSW_OTEL_RECEIVER_ENABLED_HANDLERS启用哪些 OTLP handler。otlp-metrics为指标 handler;从源码可见还支持otlp-logsotlp-traces等(handler 按类型逐个注册)
enabledOtelMetricsRulesSW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES启用哪些 OTLP 指标解析规则,多个规则以英文逗号分隔。istio-controlplane即对应otel-rules/istio-controlplane.yaml

enabledHandlersenabledOtelMetricsRules在源码中均按逗号拆分解析(见 OtelMetricReceiverConfig.java 的getEnabledHandlers()与 OpenTelemetryMetricRequestProcessor.java 中Rules.loadRules("otel-rules", enabledRules)的加载逻辑),因此可以一次启用多条规则。

注意:OAP 在启动时加载otel-rules目录下的规则文件(位于$CLASSPATH/otel-rules)。如果规则文件格式不合法,OAP 可能启动失败,修改规则后需谨慎验证。

receiver-otel 支持的数据来源

OpenTelemetry receiver 本身是通用的指标接收端,其内置规则覆盖了多种数据源。与 Istio 相关的规则如下:

描述规则文件数据链路
Istio 控制面指标otel-rules/istio-controlplane.yamlIstio Control Plane → OpenTelemetry Collector(OTLP exporter) → SkyWalking OAP Server

其它预置规则(OAP 自身、Linux/Windows OS、K8s、MySQL、PostgreSQL、Redis、Kafka、ClickHouse、RocketMQ 等)可参见 opentelemetry-receiver.md,说明该 receiver 是 Istio 之外多种监控场景的公共入口。

部署并配置 OpenTelemetry Collector

OpenTelemetry Collector 是 Istio 遥测数据的目的地:Istio 把指标暴露出来,Collector 负责抓取、处理并转发给 SkyWalking 后端。可参照 OpenTelemetry Collector 官方 Getting Started 完成安装。Collector 内置了丰富的组件,可按需组合。

抓取 Istio 指标并转发到 OAP 的完整配置

安装完成后,把 Collector 配置为「从 Istio 抓取指标、发送给 SkyWalking 后端」,一个可直接使用的 job 配置如下:

receivers: prometheus: config: scrape_configs: - job_name: 'istiod-monitor' kubernetes_sd_configs: - role: endpoints relabel_configs: - source_labels: [ __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name ] action: keep regex: istiod;http-monitoring - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [ ] target_label: cluster replacement: your-cluster # replace this with your cluster name exporters: otlp: endpoint: oap.skywalking:11800 # replace this with the OAP gRPC service address tls: insecure: true service: pipelines: metrics: receivers: [ prometheus ] exporters: [ otlp,logging ]

配置要点逐项说明:

  • receivers.prometheus.config.scrape_configs:定义抓取任务istiod-monitorkubernetes_sd_configs使用endpoints角色自动发现集群内的端点。
  • relabel_configs第一段:仅保留service_name=istiod且端口名为http-monitoring的端点,即精准定位 istiod 的控制面监控端点。
  • relabel_configs第二段labelmap把 Kubernetes Service 标签(__meta_kubernetes_service_label_*)映射为指标标签,便于后续按appcluster等维度聚合。
  • relabel_configs第三段:为所有指标打上cluster标签,值为your-cluster务必替换为实际集群名——OAP 侧规则正是按cluster维度进行服务聚合的(见下文规则解析)。
  • exporters.otlp:通过 OTLP gRPC 协议把指标推送到 OAP,endpoint为 OAP 的 gRPC 服务地址(示例为oap.skywalking:11800,需替换为真实地址);tls.insecure: true表示关闭 TLS。
  • service.pipelines.metrics:把prometheusreceiver 与otlplogging两个 exporter 串联成一条指标流水线(logging用于本地输出调试)。

Collector 到 OAP 的传输格式适配

从源码看,OAP 的OpenTelemetryMetricRequestProcessor负责把 OTLP 指标转换为 SkyWalking 的 Prometheus 中间模型,其转换逻辑支持 OTLP 中的 Gauge、Sum(区分 Delta/Cumulative、单调/非单调)、Histogram、ExponentialHistogram 与 Summary 五种数据类型(见 OpenTelemetryMetricRequestProcessor.java 的adaptMetrics方法)。

此外,处理器对资源属性(Resource Attributes)做了标签映射(LABEL_MAPPINGS),这对理解最终指标维度很重要:

OTLP 资源属性映射后的 SkyWalking 标签
net.host.name(部分 OTLP 版本为host.namenode_identifier_host_name
jobservice.namejob_name

细节提醒:在资源作用域(resource scope)中,属性名里的点号.会被转换为下划线_;而在指标作用域(metrics scope)中不做转换。采集时需要注意这一差异对标签名的影响。

OAP 侧指标解析规则:istio-controlplane.yaml 深度解析

当 OAP 收到 OTLP 指标后,会按照enabledOtelMetricsRules指定的规则文件进行二次加工。Istio 控制面指标规则位于 otel-rules/istio-controlplane.yaml,其核心结构如下(省略 License 头):

expSuffix: tag({tags -> tags.cluster = 'istio-ctrl::' + tags.cluster}).service(['cluster', 'app'], Layer.MESH_CP) metricPrefix: meter_istio metricsRules: # 版本信息 - name: pilot_version exp: istio_build.tagEqual('component', 'pilot').sum(['cluster', 'app', 'tag']) # 内存 - name: virtual_memory exp: process_virtual_memory_bytes.tagEqual('app', 'istiod').sum(['cluster', 'app']) - name: resident_memory exp: process_resident_memory_bytes.tagEqual('app', 'istiod').sum(['cluster', 'app']) - name: go_alloc exp: go_memstats_alloc_bytes.tagEqual('app', 'istiod').sum(['cluster', 'app']) # CPU - name: cpu exp: (process_cpu_seconds_total * 100).tagEqual('app', 'istiod').sum(['cluster', 'app']).rate('PT1M') # Goroutines - name: go_goroutines exp: go_goroutines.tagEqual('app', 'istiod').sum(['cluster', 'app']) # Pilot 推送 - name: pilot_xds_pushes exp: pilot_xds_pushes.tagMatch('type', 'lds|cds|rds|eds').sum(['cluster', 'app', 'type']).irate() # 配置冲突 - name: pilot_conflict_il exp: pilot_conflict_inbound_listener.tagEqual('app', 'istiod').sum(['cluster', 'app']) # Webhook / 校验 - name: galley_validation_passed exp: galley_validation_passed.tagEqual('app', 'istiod').sum(['cluster', 'app']).rate('PT1M') - name: sidecar_injection_success_total exp: sidecar_injection_success_total.tagEqual('app', 'istiod').sum(['cluster', 'app']).rate('PT1M')

规则语义

  • expSuffix:对全部规则统一施加「尾部表达式」。tag(...)先把cluster标签改写为istio-ctrl::<cluster>前缀形式,使 Istio 控制面与数据面/业务服务在命名空间上区分;随后.service(['cluster', 'app'], Layer.MESH_CP)clusterapp作为服务标识维度,将指标归属到MESH_CP(服务网格控制面)层
  • metricPrefix: meter_istio:所有加工后指标名统一加meter_istio前缀,例如pilot_xds_pushes最终成为meter_istio_pilot_xds_pushes
  • metricsRules:逐条定义「原始指标名 → 目标指标」的换算表达式。完整规则还覆盖了 Pilot 各类 xDS 拒绝计数(pilot_xds_cds_reject/eds/rds/lds)、推送超时与内部错误、pilot_proxy_convergence_time的分位数(P50/P90/P99)、以及 galley 配置校验、sidecar 注入成功/失败等控制面关键行为指标。感兴趣的读者可直接阅读 istio-controlplane.yaml 全文。

从表达式可以看出,Istio 控制面监控的核心是istiod(Pilot)进程:它的内存(虚拟内存、常驻内存、Go 堆)、CPU 使用率、Goroutine 数量、xDS 推送行为、配置冲突、校验与注入成功率。这些指标经过换算后进入 MeterSystem,成为 UI 面板的数据来源。

在 SkyWalking UI 中观察 Istio

Dashboard -> Istio 面板

打开 SkyWalking UI,依次点击Dashboard->Istio,即可查看由 Istio 指标生成的图表。该菜单背后的模板与层级在仓库中均有对应物:

  • UI 菜单定义Service Mesh -> Control Plane的 layer 为MESH_CP,其 documentLink 即指向本文档(见 menu.yaml 中Service Mesh菜单段);
  • 控制面模板文件mesh-control-plane-root.jsonmesh-control-plane-service.json位于 ui-initialized-templates/mesh_cp/ 目录,OAP 启动时会将其初始化到 UI 模板库中。

因此只要指标成功入库,且服务被归属到MESH_CP层,面板就会自动出现 istiod 相关图表。

通过 swctl 与告警消费指标

除 UI 外,还可以:

  • 使用 SkyWalking 命令行工具swctl查询这些指标,便于脚本化巡检与二次开发;
  • 基于这些指标配置告警规则,例如 xDS 拒绝数突增、sidecar 注入失败率上升、Pilot 推送耗时 P99 超阈值等。SkyWalking 的告警规则定义与示例可参考 backend-alarm.md 及 alarm-settings.yml。

扩展:观察 Istio 托管服务的拓扑与调用关系

本文方案聚焦控制面自身。若想观察 Istio 托管业务服务(含服务拓扑),官方推荐使用ALS(Envoy Access Log Service)方案:Istio 的 Envoy sidecar 将访问日志通过 gRPC 推送给 OAP 的 envoy-metric receiver,OAP 侧通过k8s-mesh(基于 Kubernetes 元数据)或mx-mesh(基于 Envoy metadata exchange)等分析器还原服务调用关系,详见 als_setting.md。两条链路互为补充:控制面指标看 istiod 健康度,ALS 看数据面服务拓扑。

小结与常见问题排查

本文完整走通了「Istio 控制面 → OpenTelemetry Collector → SkyWalking OAP」的指标传输链路。落地时重点检查以下三点:

  1. receiver 是否激活:确认 OAP 的receiver-otel/selectordefault,且enabledOtelMetricsRules包含istio-controlplane,否则 Collector 推来的数据会被丢弃。
  2. Collector 端点与标签是否正确exporters.otlp.endpoint必须指向 OAP gRPC 地址(默认 11800);cluster标签务必替换为真实集群名,它直接决定 OAP 侧的服务维度聚合。
  3. 规则文件是否合法otel-rules下的 YAML 在 OAP 启动时加载,格式错误可能导致 OAP 启动失败(源码中Rules.loadRules抛出的IOException会包装为ModuleStartException)。
  4. 观测视角区分:控制面指标走本文链路;服务拓扑与业务调用观测请使用 ALS 方案。
  • 可观测性
  • 后端
  • 微服务
  • 云原生

【免费下载链接】skywalking

APM, Application Performance Monitoring System

项目地址:https://gitcode.com/gh_mirrors/sky/skywalking
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询