Skip to content
Published on

Cilium Hubbleオブザーバビリティプラットフォーム内部分析

Authors

Cilium Hubbleオブザーバビリティプラットフォーム内部分析

概要

HubbleはCiliumに内蔵されたネットワークオブザーバビリティプラットフォームで、eBPFデータパスで発生するすべてのネットワークイベントをリアルタイムで収集・分析します。インフラストラクチャに追加のエージェントをインストールすることなく、深いネットワーク可視性を提供します。

1. Hubbleアーキテクチャ

1.1 コンポーネント構成

+-----------------------------------------------------------+
|                   Hubbleアーキテクチャ                       |
+-----------------------------------------------------------+
|                                                           |
|  ノード1            ノード2            ノード3              |
|  +-----------+     +-----------+     +-----------+        |
|  | Cilium    |     | Cilium    |     | Cilium    |        |
|  | Agent     |     | Agent     |     | Agent     |        |
|  |  +------+ |     |  +------+ |     |  +------+ |        |
|  |  |Hubble| |     |  |Hubble| |     |  |Hubble| |        |
|  |  |Server| |     |  |Server| |     |  |Server| |        |
|  |  +------+ |     |  +------+ |     |  +------+ |        |
|  +-----------+     +-----------+     +-----------+        |
|       |                 |                 |               |
|       +--------+--------+--------+--------+               |
|                |                 |                         |
|          +-----v-----+    +-----v-----+                   |
|          |  Hubble   |    | Hubble UI |                   |
|          |  Relay    |    |           |                   |
|          +-----------+    +-----------+                   |
|                |                                          |
|          +-----v-----+                                    |
|          | Prometheus|                                    |
|          | Grafana   |                                    |
|          +-----------+                                    |
+-----------------------------------------------------------+

1.2 各コンポーネントの役割

コンポーネント役割デプロイ形態
Hubble Server各ノードでフロー収集Cilium Agentに内蔵
Hubble Relayクラスタ全体フロー集約Deployment(1-2個)
Hubble UIトポロジー可視化Deployment
Hubble CLIコマンドラインフロー照会ローカルバイナリ

2. Hubble Server:フロー収集エンジン

2.1 フロー収集メカニズム

Hubble ServerはCilium Agent内部で実行され、eBPFデータパスのイベントを収集します。

eBPFデータパスイベント:
  [パケット処理] -> [ポリシーverdict] -> [conntrackイベント]
       |              |                   |
       v              v                   v
  [Perf Event Ring Buffer]
       |
       v
  [Hubble Server:イベントパーサー]
       |
       v
  [フローリングバッファ(メモリ内)]
       |
       v
  [gRPCサーバー:クライアントにフローストリーミング]

2.2 リングバッファ

Hubbleは固定サイズのリングバッファにフローを保存します。

# リングバッファサイズ設定
# デフォルト値:4095フロー
# 設定:--hubble-buffer-size=16383

# 現在のリングバッファ状態確認
hubble status
# Nodes:
#   node-1: Connected, Flows: 4095/4095 (100.00%), ...
#   node-2: Connected, Flows: 3821/4095 (93.31%), ...

2.3 フローデータ構造

フローレコード主要フィールド:

- time:イベントタイムスタンプ
- source:
    identity:ソースIdentity
    namespace:ソースネームスペース
    labels:ソースラベル
    pod_name:ソースPod名
- destination:
    identity:宛先Identity
    namespace:宛先ネームスペース
    labels:宛先ラベル
    pod_name:宛先Pod名
- IP    source:ソースIP
    destination:宛先IP
- l4:
    TCP/UDP      source_port:ソースポート
      destination_port:宛先ポート
- l7:
    type:HTTP/DNS/Kafka
    http:
      method:GET/POST/...
      url:リクエストURL
      code:レスポンスコード
- verdict:FORWARDED/DROPPED/AUDIT/REDIRECTED
- drop_reason:ドロップ理由(verdictがDROPPEDの場合)
- Type:L3_L4/L7/TRACE/DROP

3. Hubble Relay:クラスタ全体のオブザーバビリティ

3.1 Relay動作原理

Hubble RelayはクラスタのすべてのHubble Serverに接続してフローを集約します。

Relayの接続管理:

1. クラスタのすべてのCilium Agent(Hubble Server)ディスカバリ
2. 各ノードのHubble gRPCサービスに接続
3. フローリクエストをすべてのノードに分散
4. レスポンスを集約してクライアントに配信
5. ノード追加/削除時に自動再接続

3.2 Relayデプロイ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hubble-relay
  namespace: kube-system
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: hubble-relay
          image: quay.io/cilium/hubble-relay:v1.16.0
          ports:
            - containerPort: 4245
              name: grpc
          args:
            - serve
            - --peer-service=unix:///var/run/cilium/hubble.sock
            - --listen-address=:4245

3.3 Relayポートフォワーディング

# Hubble Relayにローカルポートフォワーディング
cilium hubble port-forward &

# 以降hubble CLIでアクセス可能
hubble observe
hubble status

4. Hubble UI:トポロジー可視化

4.1 UI機能

Hubble UIはWebベースのインターフェースで以下の機能を提供します。

主要機能:
1. サービスマップ(Service Map   - サービス間通信関係をトポロジーグラフで可視化
   - リアルタイムトラフィックフロー表示
   - 正常/異常接続の色分け

2. フローテーブル
   - リアルタイムネットワークフローリスト
   - フィルタリング(ネームスペース、ラベル、verdict)
   - 各フローの詳細情報

3. ポリシー可視化
   - ポリシーによる許可/拒否状態表示
   - ドロップされたトラフィックのハイライト

4.2 UIデプロイ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hubble-ui
  namespace: kube-system
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: frontend
          image: quay.io/cilium/hubble-ui:v0.13.0
          ports:
            - containerPort: 8081
              name: http
        - name: backend
          image: quay.io/cilium/hubble-ui-backend:v0.13.0
          ports:
            - containerPort: 8090

5. フロータイプ:L3/L4/L7

5.1 L3/L4フロー

すべてのネットワークパケットに対してデフォルトで収集されます。

# L3/L4フロー観察
hubble observe --type l3/l4

# 出力例:
# Mar 20 10:15:32.123 default/frontend-abc -> default/backend-xyz
#   TCP SYN 10.244.1.5:34567 -> 10.244.2.10:8080
#   verdict: FORWARDED

# TCP接続追跡
hubble observe --protocol tcp --to-port 8080

# UDPトラフィック
hubble observe --protocol udp --to-port 53

5.2 L7フロー

L7ポリシーが適用されたトラフィックに対して収集されます。

# HTTPフロー観察
hubble observe --type l7 --protocol http

# 出力例:
# Mar 20 10:15:32.456 default/frontend-abc -> default/api-server-xyz
#   HTTP GET /api/v1/users
#   Response: 200 OK (23ms)

# DNSフロー
hubble observe --type l7 --protocol dns

# 出力例:
# Mar 20 10:15:33.789 default/backend-abc -> kube-system/coredns-xyz
#   DNS Query: api.example.com A
#   DNS Response: 203.0.113.10 (TTL: 300)

# Kafkaフロー
hubble observe --type l7 --protocol kafka

5.3 ドロップフロー

ポリシーやエラーによりドロップされたパケットです。

# ドロップされたフローのみ観察
hubble observe --verdict DROPPED

# 出力例:
# Mar 20 10:15:34.012 default/untrusted-app -> default/backend-xyz
#   TCP 10.244.3.5:45678 -> 10.244.2.10:8080
#   verdict: DROPPED (Policy denied)

# 特定のドロップ理由でフィルタリング
hubble observe --verdict DROPPED --drop-reason POLICY_DENIED

6. Hubble CLI使用法

6.1 基本コマンド

# すべてのフロー観察(リアルタイムストリーミング)
hubble observe -f

# 最新100件のフロー
hubble observe --last 100

# 特定の時間範囲
hubble observe --since 5m
hubble observe --since "2026-03-20T10:00:00Z" --until "2026-03-20T10:30:00Z"

6.2 フィルタリング

# ネームスペースフィルタリング
hubble observe --namespace production

# Pod名フィルタリング
hubble observe --from-pod production/frontend-abc
hubble observe --to-pod production/backend-xyz

# ラベルフィルタリング
hubble observe --from-label "app=frontend"
hubble observe --to-label "app=backend"

# IPフィルタリング
hubble observe --from-ip 10.244.1.5
hubble observe --to-ip 10.244.2.10

# ポートフィルタリング
hubble observe --to-port 8080
hubble observe --from-port 443

# verdictフィルタリング
hubble observe --verdict FORWARDED
hubble observe --verdict DROPPED

# 複合フィルタ
hubble observe \
  --namespace production \
  --from-label "app=frontend" \
  --to-label "app=backend" \
  --to-port 8080 \
  --verdict FORWARDED

6.3 出力形式

# デフォルト出力(人間が読みやすい形式)
hubble observe

# JSON出力
hubble observe -o json

# コンパクト出力
hubble observe -o compact

# ディクショナリ出力
hubble observe -o dict

# jsonpb(Protocol Buffers JSON形式)
hubble observe -o jsonpb

6.4 状態確認

# Hubble全体の状態
hubble status

# 出力例:
# Healthcheck (via localhost:4245): Ok
# Current/Max Flows: 16383/16383 (100.00%)
# Flows/s: 245.32
# Connected Nodes: 3/3

# ノード別状態
hubble list nodes

7. Hubble Prometheusメトリクス

7.1 メトリクス有効化

# Cilium設定でHubbleメトリクスを有効化
# helm install cilium cilium/cilium \
#   --set hubble.metrics.enabled="{dns,drop,tcp,flow,icmp,httpV2:exemplars=true;labelsContext=source_ip,source_namespace,source_workload,destination_ip,destination_namespace,destination_workload,traffic_direction}"

7.2 主要メトリクス

メトリクス名説明
hubble_flows_processed_total処理されたフロー総数
hubble_drop_totalドロップされたパケット数(理由別)
hubble_tcp_flags_totalTCPフラグ別パケット数
hubble_dns_queries_totalDNSクエリ数
hubble_dns_responses_totalDNSレスポンス数
hubble_dns_response_types_totalDNSレスポンスタイプ別数
hubble_http_requests_totalHTTPリクエスト数(メソッド、パス別)
hubble_http_responses_totalHTTPレスポンス数(ステータスコード別)
hubble_http_request_duration_secondsHTTPリクエストレイテンシ
hubble_icmp_totalICMPパケット数

7.3 Grafanaダッシュボード

Hubble Grafanaダッシュボード構成:

1. ネットワーク概要
   - 総フロー数/   - ドロップ率
   - プロトコル別トラフィック分布

2. DNSモニタリング
   - DNSクエリ数/   - DNSレスポンスレイテンシ(p50、p95、p99)
   - DNSエラー率
   - 人気ドメイン

3. HTTPモニタリング
   - リクエスト数/秒(メソッド別)
   - レスポンスステータスコード分布
   - リクエストレイテンシヒストグラム
   - エラー率(5xx / 全体)

4. ポリシーモニタリング
   - ドロップされたパケット数/秒(理由別)
   - ポリシーverdict分布
   - Identity別ドロップ数

7.4 アラートルール例

# Prometheusアラートルール例
groups:
  - name: hubble-alerts
    rules:
      - alert: HighDropRate
        expr: rate(hubble_drop_total[5m]) > 100
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: '高いパケットドロップ率を検知'

      - alert: HTTPErrorRate
        expr: |
          rate(hubble_http_responses_total{status=~"5.."}[5m])
          / rate(hubble_http_responses_total[5m]) > 0.05
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: 'HTTP 5xxエラー率が5%を超過'

      - alert: DNSLatencyHigh
        expr: |
          histogram_quantile(0.99, rate(hubble_dns_response_time_seconds_bucket[5m]))
          > 0.5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: 'DNSレスポンスレイテンシp99が500msを超過'

8. Hubble gRPC API

8.1 API概要

HubbleはgRPC APIを通じてプログラマティックにフローデータにアクセスできます。

// Hubble Observer API(簡略化)
service Observer {
    // フローストリーミング
    rpc GetFlows(GetFlowsRequest) returns (stream GetFlowsResponse);

    // Hubbleサーバー状態
    rpc ServerStatus(ServerStatusRequest) returns (ServerStatusResponse);

    // ノードリスト
    rpc GetNodes(GetNodesRequest) returns (GetNodesResponse);
}

8.2 API使用例

# gRPCurlで直接API呼び出し
grpcurl -plaintext localhost:4245 observer.Observer/ServerStatus

# フローストリーミング
grpcurl -plaintext -d '{}' localhost:4245 observer.Observer/GetFlows

# フィルタ適用
grpcurl -plaintext -d '{
  "whitelist": [
    {
      "source_pod": ["default/frontend"]
    }
  ]
}' localhost:4245 observer.Observer/GetFlows

8.3 カスタム統合

Hubble gRPC API活用事例:

1. カスタムダッシュボード
   - 特定のビジネスメトリクス収集
   - カスタマイズされた可視化

2. 自動化されたセキュリティ分析
   - 異常トラフィックパターン検知
   - ポリシー違反自動アラート

3. 監査ログ
   - コンプライアンスのためのネットワーク活動記録
   - 長期保存のための外部システム連携

4. サービスメッシュ統合
   - サービス間レイテンシモニタリング
   - エラー追跡と分析

9. パフォーマンス影響とチューニング

9.1 パフォーマンスオーバーヘッド

Hubble有効化に伴うオーバーヘッド:

CPU  - 基本L3/L4観察:最小オーバーヘッド(約1-2%  - L7観察(HTTPなど):Envoyプロキシオーバーヘッドに依存
  - 高トラフィック環境:フローパースおよびリングバッファ管理

メモリ:
  - リングバッファサイズに比例
  - デフォルト4095フロー x フロー当たり約500バイト = 約2MB
  - 16383フロー:約8MB

ネットワーク:
  - RelayへのgRPCストリーミングトラフィック
  - 観察クライアント数に比例

9.2 チューニングパラメータ

# リングバッファサイズ調整
# より多くのフロー保存 = より多くのメモリ使用
--hubble-buffer-size=16383

# イベントキューサイズ
--hubble-event-queue-size=0  # 0 = 自動

# メトリクス有効化/無効化
# 必要なメトリクスのみ有効化してオーバーヘッドを最小化
--hubble-metrics=dns,drop,tcp,flow

# 特定のネームスペースのみモニタリング
--hubble-monitor-events="drop:true;trace:true;l7:true"

# L7観察範囲制限
# L7ポリシーが適用されたトラフィックのみL7フロー生成

9.3 大規模環境の最適化

大規模クラスタの考慮事項:

1. Relayリソース制限設定
   - CPU/メモリリソースリクエスト/リミットを適切に設定
   - ノード数が多いほどRelay負荷が増加

2. メトリクスカーディナリティ管理
   - ラベルコンテキストを最小化してメトリクス数を管理
   - 不要なメトリクスを無効化

3. フロー保持戦略
   - リングバッファサイズとトラフィック量のバランス
   - 長期保持が必要な場合は外部システムにエクスポート

4. ネットワーク帯域幅
   - RelayとAgent間のgRPCトラフィックを考慮
   - 大規模観察クエリの影響を制限

10. Hubble活用シナリオ

10.1 トラブルシューティング

# Pod間接続問題の診断
hubble observe --from-pod default/app-a --to-pod default/app-b

# ドロップされたトラフィックの原因分析
hubble observe --verdict DROPPED --from-pod default/app-a

# DNS解決問題の確認
hubble observe --type l7 --protocol dns --from-pod default/app-a

# 特定のサービスへのトラフィック確認
hubble observe --to-label "app=database" --to-port 5432

10.2 セキュリティ監査

# ポリシー違反トラフィックのモニタリング
hubble observe --verdict DROPPED --drop-reason POLICY_DENIED

# 外部へのイグレストラフィック追跡
hubble observe --to-identity reserved:world

# 特定ネームスペースのすべてのイングレストラフィック
hubble observe --namespace sensitive-ns --traffic-direction ingress

10.3 パフォーマンスモニタリング

# HTTPレスポンス時間の観察
hubble observe --type l7 --protocol http -o json | \
  jq '.flow.l7.http.latency'

# DNSクエリレイテンシ
hubble observe --type l7 --protocol dns -o json | \
  jq '.flow.l7.dns.latency'

# TCP接続確立の追跡
hubble observe --protocol tcp --tcp-flags SYN

まとめ

Cilium Hubbleは以下の核心機能でネットワークオブザーバビリティを提供します。

  • ゼロインストルメンテーション:アプリケーション修正なしにeBPFから自動的にフロー収集
  • 多層可視性:L3/L4ネットワークからL7アプリケーションまで全レイヤー観察
  • リアルタイムストリーミング:リングバッファとgRPCによるリアルタイムフローストリーミング
  • クラスタ全体の観察:Hubble Relayを通じたクラスタ全体データ集約
  • 可視化:Hubble UIによるサービストポロジーマップとフロー可視化
  • メトリクス統合:Prometheus/Grafanaによる時系列メトリクスとアラート
  • プログラマティックアクセス:gRPC APIによるカスタムツール統合