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 |
| トラフィック | 1 秒あたりのリクエスト数 | 異常検知 |
| エラー | 5xx エラー率 | > 1% |
| 飽和度 | リソース使用率 | > 80% |
テンプレート
これらはバージョン固有の断片であり、デプロイ可能なスタック全体ではありません。メッシュ、コレクター、オペレーターのバージョンを固定し、適用前にサポート対象のスキーマをエクスポートまたはレンダリングして、マニフェストを確認してください。Services、RBAC、レシーバー/プロバイダーの接続設定は別途用意してください。istiod 用の ServiceMonitor だけでは、すべてのワークロードプロキシをスクレイピングできません。しきい値は例であり、サービス固有の SLO が必要です。
トレース/タップの出力は許可された環境内にとどめ、機密性の高い属性を削除し、アクセスを制限してください。匿名の 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 の統合
Jaeger の OTLP 対応レシーバーに 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%
- トレースコンテキストを使用する - ヘッダーを一貫して伝播する
- アラートを設定する - ゴールデンシグナルに対して設定する
- メトリクスとトレースを関連付ける - エグザンプラーを使用する
- 戦略的に保持する - ホット/コールドのストレージ階層を設ける
非推奨事項
- 過剰にサンプリングしない - ストレージコストが積み重なります
- カーディナリティを無視しない - ラベル値を制限する
- ダッシュボードを省略しない - 依存関係を可視化する
- コストを忘れない - 可観測性のコストを監視する
リソース
制限事項
- タスクが上記の範囲に明確に一致する場合にのみ、このスキルを使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認してください。