mcpField
S
service-mesh-observability

service-mesh-observability

github.com/sickn33クラウド・DevOps48.8k74 回インストール今日更新
リポジトリ

service-mesh-observability について

IstioやLinkerdなどのサービスメッシュ向けに、可観測性の設計を支援するスキルです。プラットフォームや運用チーム向けに、トレース、メトリクス、ダッシュボード、アラート、トラブルシューティングの指針と設定例を提供します。

主な機能

  1. 01分散トレースの指針
  2. 02メトリクスとダッシュボードの設計
  3. 03レイテンシとエラーの調査
  4. 04SLOとアラートの計画
  5. 05IstioとLinkerdの例

活用シーン

  1. 01サービス間トレースの計画
  2. 02レイテンシやエラーの調査
  3. 03通信SLOの定義
  4. 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、P99P99 > 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%
  • トレースコンテキストを使用する - ヘッダーを一貫して伝播する
  • アラートを設定する - ゴールデンシグナルに対して設定する
  • メトリクスとトレースを関連付ける - エグザンプラーを使用する
  • 戦略的に保持する - ホット/コールドのストレージ階層を設ける
非推奨事項
  • 過剰にサンプリングしない - ストレージコストが積み重なります
  • カーディナリティを無視しない - ラベル値を制限する
  • ダッシュボードを省略しない - 依存関係を可視化する
  • コストを忘れない - 可観測性のコストを監視する

リソース

制限事項

  • タスクが上記の範囲に明確に一致する場合にのみ、このスキルを使用してください。
  • 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
  • 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認してください。

コメント