关于 service-mesh-observability
面向 Istio、Linkerd 等服务网格的可观测性指导,适用于平台与运维团队规划追踪、指标、仪表板、告警和故障排查,并提供配置模板及验证注意事项。
主要功能
- 01分布式追踪指导
- 02指标与仪表板模式
- 03延迟和错误排查
- 04SLO 与告警规划
- 05Istio 和 Linkerd 示例
适用场景
- 01规划服务间追踪
- 02调查延迟或错误
- 03定义通信 SLO
- 04可视化网格依赖
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill service-mesh-observability安装后在 Claude Code 中输入/service-mesh-observability确认已加载。
详细介绍
服务网格可观测性
Istio、Linkerd 和服务网格部署的可观测性模式完整指南。
不要在以下情况下使用此技能
- 任务与服务网格可观测性无关
- 你需要使用此范围之外的其他领域知识或工具
说明
- 明确目标、约束和所需输入。
- 应用相关最佳实践并验证结果。
- 提供可执行的步骤和验证方法。
在以下情况下使用此技能
- 为多个服务设置分布式追踪
- 实现服务网格指标和仪表盘
- 调试延迟和错误问题
- 为服务通信定义 SLO
- 可视化服务依赖关系
- 排查网格连通性问题
核心概念
1. 可观测性的三大支柱
┌─────────────────────────────────────────────────────┐
│ Observability │
├─────────────────┬─────────────────┬─────────────────┤
│ Metrics │ Traces │ Logs │
│ │ │ │
│ • Request rate │ • Span context │ • Access logs │
│ • Error rate │ • Latency │ • Error details │
│ • Latency P50 │ • Dependencies │ • Debug info │
│ • Saturation │ • Bottlenecks │ • Audit trail │
└─────────────────┴─────────────────┴─────────────────┘
2. 服务网格黄金信号
| 信号 | 描述 | 告警阈值 |
|---|---|---|
| 延迟 | 请求耗时 P50、P99 | P99 > 500ms |
| 流量 | 每秒请求数 | 异常检测 |
| 错误 | 5xx 错误率 | > 1% |
| 饱和度 | 资源利用率 | > 80% |
模板
以下是特定版本的片段,并非完整的可部署堆栈。请固定服务网格、采集器和 Operator 的版本,导出或渲染受支持的架构,并在应用清单前进行审查。请单独提供 Services、RBAC 以及接收器/提供程序连接配置;用于 istiod 的 ServiceMonitor 本身不会抓取每个工作负载代理。阈值仅为示例,需要根据具体服务的 SLO 进行调整。
请确保追踪/tap 输出仅保留在获授权的环境中,对敏感属性进行脱敏并限制访问。匿名 Kiali 示例仅适用于隔离且可信的开发环境;在共享使用前,请配置经过身份验证的访问,并缩小命名空间/RBAC 范围;请参阅 Kiali 身份验证。
模板 1:使用 Prometheus 和 Grafana 的 Istio
# Install Prometheus
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus
namespace: istio-system
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'istio-mesh'
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- istio-system
relabel_configs:
- source_labels: [__meta_kubernetes_service_name]
action: keep
regex: istio-telemetry
---
# ServiceMonitor for Prometheus Operator
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: istio-mesh
namespace: istio-system
spec:
selector:
matchLabels:
app: istiod
endpoints:
- port: http-monitoring
interval: 15s
模板 2:关键 Istio 指标查询
# Request rate by service
sum(rate(istio_requests_total{reporter="destination"}[5m])) by (destination_service_name)
# Error rate (5xx)
sum(rate(istio_requests_total{reporter="destination", response_code=~"5.."}[5m]))
/ sum(rate(istio_requests_total{reporter="destination"}[5m])) * 100
# P99 latency
histogram_quantile(0.99,
sum(rate(istio_request_duration_milliseconds_bucket{reporter="destination"}[5m]))
by (le, destination_service_name))
# TCP connections
sum(istio_tcp_connections_opened_total{reporter="destination"}) by (destination_service_name)
# Request size
histogram_quantile(0.99,
sum(rate(istio_request_bytes_bucket{reporter="destination"}[5m]))
by (le, destination_service_name))
模板 3:Jaeger 分布式追踪
# Jaeger installation for Istio
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
enableTracing: true
defaultConfig:
tracing:
sampling: 100.0 # 100% in dev, lower in prod
zipkin:
address: jaeger-collector.istio-system:9411
---
# Jaeger deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: jaeger
namespace: istio-system
spec:
selector:
matchLabels:
app: jaeger
template:
metadata:
labels:
app: jaeger
spec:
containers:
- name: jaeger
image: jaegertracing/all-in-one:1.50
ports:
- containerPort: 5775 # UDP
- containerPort: 6831 # Thrift
- containerPort: 6832 # Thrift
- containerPort: 5778 # Config
- containerPort: 16686 # UI
- containerPort: 14268 # HTTP
- containerPort: 14250 # gRPC
- containerPort: 9411 # Zipkin
env:
- name: COLLECTOR_ZIPKIN_HOST_PORT
value: ":9411"
模板 4:Linkerd Viz 仪表盘
# Install Linkerd viz extension
linkerd viz install | kubectl apply -f -
# Access dashboard
linkerd viz dashboard
# CLI commands for observability
# Top requests
linkerd viz top deploy/my-app
# Per-route metrics
linkerd viz routes deploy/my-app --to deploy/backend
# Live traffic inspection
linkerd viz tap deploy/my-app --to deploy/backend
# Service edges (dependencies)
linkerd viz edges deployment -n my-namespace
模板 5:Grafana 仪表盘 JSON
{
"dashboard": {
"title": "Service Mesh Overview",
"panels": [
{
"title": "Request Rate",
"type": "graph",
"targets": [
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\"}[5m])) by (destination_service_name)",
"legendFormat": "{{destination_service_name}}"
}
]
},
{
"title": "Error Rate",
"type": "gauge",
"targets": [
{
"expr": "sum(rate(istio_requests_total{response_code=~\"5..\"}[5m])) / sum(rate(istio_requests_total[5m])) * 100"
}
],
"fieldConfig": {
"defaults": {
"thresholds": {
"steps": [
{"value": 0, "color": "green"},
{"value": 1, "color": "yellow"},
{"value": 5, "color": "red"}
]
}
}
}
},
{
"title": "P99 Latency",
"type": "graph",
"targets": [
{
"expr": "histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le, destination_service_name))",
"legendFormat": "{{destination_service_name}}"
}
]
},
{
"title": "Service Topology",
"type": "nodeGraph",
"targets": [
{
"expr": "sum(rate(istio_requests_total{reporter=\"destination\"}[5m])) by (source_workload, destination_service_name)"
}
]
}
]
}
}
模板 6:Kiali 服务网格可视化
# Kiali installation
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
name: kiali
namespace: istio-system
spec:
auth:
strategy: anonymous # or openid, token
deployment:
accessible_namespaces:
- "**"
external_services:
prometheus:
url: http://prometheus.istio-system:9090
tracing:
url: http://jaeger-query.istio-system:16686
grafana:
url: http://grafana.istio-system:3000
模板 7:OpenTelemetry 集成
通过 OTLP 将数据发送到启用了 Jaeger OTLP 的接收器,并公开其 4317 Service 端口。标准发行版已移除原生 Jaeger Collector 导出器;请参阅 OpenTelemetry 迁移。下方的明文 insecure: true 示例仅适用于隔离网络;对于不可信链路,请使用经过身份验证的 TLS。请单独配置所引用的 Istio otel 扩展提供程序。
# OpenTelemetry Collector for mesh
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-collector-config
data:
config.yaml: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
zipkin:
endpoint: 0.0.0.0:9411
processors:
batch:
timeout: 10s
exporters:
otlp/jaeger:
endpoint: jaeger-collector:4317
tls:
insecure: true
prometheus:
endpoint: 0.0.0.0:8889
service:
pipelines:
traces:
receivers: [otlp, zipkin]
processors: [batch]
exporters: [otlp/jaeger]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]
---
# Istio Telemetry v2 with OTel
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: mesh-default
namespace: istio-system
spec:
tracing:
- providers:
- name: otel
randomSamplingPercentage: 10
告警规则
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: mesh-alerts
namespace: istio-system
spec:
groups:
- name: mesh.rules
rules:
- alert: HighErrorRate
expr: |
sum(rate(istio_requests_total{response_code=~"5.."}[5m])) by (destination_service_name)
/ sum(rate(istio_requests_total[5m])) by (destination_service_name) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate for {{ $labels.destination_service_name }}"
- alert: HighLatency
expr: |
histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket[5m]))
by (le, destination_service_name)) > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "High P99 latency for {{ $labels.destination_service_name }}"
- alert: MeshCertExpiring
expr: |
(certmanager_certificate_expiration_timestamp_seconds - time()) / 86400 < 7
labels:
severity: warning
annotations:
summary: "Mesh certificate expiring in less than 7 days"
最佳实践
应做事项
- 合理采样——开发环境中采样 100%,生产环境中采样 1-10%
- 使用追踪上下文——一致地传播请求头
- 设置告警——针对黄金信号设置告警
- 关联指标/追踪——使用 exemplars
- 合理保留数据——设置热/冷存储层级
不应做事项
- 不要过度采样——存储成本会不断累积
- 不要忽视基数——限制标签值
- 不要跳过仪表盘——可视化依赖关系
- 不要忽略成本——监控可观测性成本
资源
限制
- 仅当任务明确符合上述范围时,才使用此技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少必要输入、权限、安全边界或成功标准,请暂停并请求澄清。
评论
支持 Markdown