- Authors

- Name
- Youngju Kim
- @fjvbn20031
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_total | TCPフラグ別パケット数 |
| hubble_dns_queries_total | DNSクエリ数 |
| hubble_dns_responses_total | DNSレスポンス数 |
| hubble_dns_response_types_total | DNSレスポンスタイプ別数 |
| hubble_http_requests_total | HTTPリクエスト数(メソッド、パス別) |
| hubble_http_responses_total | HTTPレスポンス数(ステータスコード別) |
| hubble_http_request_duration_seconds | HTTPリクエストレイテンシ |
| hubble_icmp_total | ICMPパケット数 |
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によるカスタムツール統合