Kubernetes環境でCiliumとHubbleを導入し、素晴らしいサービスマップが描かれるのを見て感動しましたか? 🤩 しかし、いざトラフィックを詳しく見てみると、L3/L4、TCP、Unknownのような情報しか表示されず、本当に見たかったHTTP GET /api/users、Kafka Produce messageのような詳細なL7(アプリケーションレイヤー)情報が見えず、もどかしい思いをした経験は皆さんあるでしょう。
「L7可視性はCiliumの主要機能のはずなのに、なぜ自分だけ見えないのだろう?」と思われたなら、今日のこの記事でその疑問を完全に解決します。実はこれはバグでも設定ミスでもありません。Ciliumの非常に重要な「哲学」に関わる問題なのです。

🤔 なぜL7トラフィックはデフォルトで表示されないのか? パフォーマンス、そして選択と集中!
まず知っておくべきことは、Ciliumはデフォルトですべてのトラフィックに対してL7パースを実行しないということです。
考えてみてください。クラスター内を行き交うすべてのネットワークパケットを一つ一つ開いて、それがHTTPなのか、Kafkaなのか、gRPCなのかを分析する作業は、かなりのCPUとメモリリソースを消費します。🤯 もしすべてのトラフィックにこの作業を適用すれば、ネットワークパフォーマンスに大きな影響を与える可能性があります。
CiliumはeBPFを通じてカーネルレベルで非常に効率的に動作するのが利点ですが、無差別なL7パースはこのような利点を相殺してしまう可能性があります。
そのためCiliumは、「パフォーマンスのためにデフォルトはL3/L4で、L7分析はユーザーが明示的に要求したものに対してのみ実行する!」という「Opt-in」方式を採用しました。つまり、私たちが「このサービスに入ってくるトラフィックはHTTPだから詳しく見てほしい!」と伝えなければ、CiliumはL7プロキシ(Envoy)を投入してトラフィックを詳細に分析し始めないのです。
これが全体的な背景です。私たちはCiliumに「どのトラフィックを分析すべきか」を伝える方法を学ぶだけでよいのです。
✨ 魔法の一行:AnnotationでL7可視性を有効にする
Ciliumに特定のサービスのトラフィックを分析するよう指示する最も簡単で明確な方法は、Kubernetesのサービス(Service)に特定のAnnotationを追加することです。
AnnotationはKubernetesオブジェクトに追加のメタデータを与える機能で、様々なツールやコントローラーがこの値を読み取り、特定の動作を実行するようにできます。CiliumもまさにこのAnnotationを活用します。
では、実際の例を通してどのように適用するか見ていきましょう。
ここにmy-appというPodを指すごく普通のサービスが一つあります。
# 💻 Raw Data: 適用前のService YAML
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
現在の状態では、my-app-service:80に入ってくるトラフィックはHubbleでは単なるTCPトラフィックとしてしか見えないでしょう。ここに魔法のAnnotationを一行追加してみましょう。
# 💻 Raw Data: L7パースのためのAnnotation適用後のService YAML
apiVersion: v1
kind: Service
metadata:
name: my-app-service
annotations:
# ✨ ここがポイントです!80番ポートに入ってくるHTTPトラフィックをパースするよう指示します。
io.cilium/proxy-visibility: "<80/HTTP>"
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
metadata.annotationsフィールドにio.cilium/proxy-visibility: “<80/HTTP>“を追加しました。このAnnotationの意味は以下の通りです。
- io.cilium/proxy-visibility: Ciliumプロキシの可視性設定を行うという意味のKeyです。
- <80/HTTP>: このサービスの80番ポートに入ってくるトラフィックをHTTPプロトコルとして解釈し、パースせよというValueです。
このYAMLをkubectl applyでクラスターに適用した瞬間、Ciliumはこのサービスに向かうトラフィックを検知し、L7プロキシ(Envoy)を動的に投入してHTTPリクエストを詳細に分析し始めます。
さあ、Hubble UIをもう一度確認してみてください。UnknownやTCPの代わりに、以下のような美しいL7情報が展開されるはずです。
- GET /api/v1/users
- POST /api/v1/login
- Response: 200 OK
- Response: 404 Not Found
本当に簡単でしょう?このようにAnnotationを使用する方法は、特定のワークロードに対する可視性を簡単かつ明示的にオンにできる強力な方法です。
💡 Tip: もし複数のポートを使用したり、他のプロトコル(例:Kafka)をパースしたい場合は? io.cilium/proxy-visibility: “<80/HTTP>,<9092/Kafka>” のようにカンマで区切って複数のルールを定義できます。
❌ よくある誤解と間違ったアプローチ
この問題を解決しようとするときに陥りやすい落とし穴があります。なぜ他の方法が正解ではないのかを知っておくと、Ciliumをより深く理解できます。
1. 「Hubbleをインストールするだけで全てできるのではないですか?」 (
背景: HubbleはCiliumが収集したデータを可視化する「観測所」🔭の役割です。データ収集はCiliumの役割です。CiliumがL7データを収集(パース)しなければ、Hubbleは表示するデータ自体がありません。したがって、HubbleのインストールだけではL7可視性は有効になりません。
2. 「PodにLabelを付ければいいのではないですか?」
背景: KubernetesではLabelとAnnotationは役割が異なります。Labelは主にオブジェクトを識別し、グループ化してセレクターなどで「選択」するために使用されます(例:app=my-app)。一方、Annotationはツールやシステムに特定の「動作」を指示したり、追加情報を提供するための非識別メタデータです。L7パースの有効化はCiliumエージェントに特定の動作を指示することなので、Annotationを使用するのが意味的にも機能的にも正しい方法です。⚙️
3. 「Cilium Network Policy(CNP)を適用しなければならないのですか?」
背景: L7可視性をオンにする方法は大きく二つあります。一つは今日説明したAnnotationを利用する方法、もう一つはL7ルールを含むCiliumNetworkPolicyを適用する方法です。ポリシーを通じてGET /publicパスは許可し、それ以外はブロックするなどのL7セキュリティルールを適用すると、Ciliumはそのポリシーを施行するために自然とL7パースを開始します。つまり、CNPの適用もL7可視性をオンにする「方法の一つ」ですが、「唯一の方法」ではありません。単にトラフィックを観察したいだけであれば、Annotation方式の方がはるかに簡単です。
まとめ
CiliumとHubbleのL7可視性は、単なる「機能」を超え、eBPFベースのネットワーキングがいかに強力であるかの証拠です。パフォーマンスを損なうことなく、必要なときに必要なワークロードのトラフィックだけをピンポイントで深く覗き込める柔軟性は、クラウドネイティブ環境において不可欠な能力です。
さあ、あなたのHubbleサービスマップで、もどかしかったUnknownの代わりに、アプリケーションの内部をはっきりと示すL7データを直接確認してみてください!たった一行のAnnotationで、あなたのKubernetesクラスター管理はさらにスマートになるでしょう。✨
コメントを残す