- Authors

- Name
- Youngju Kim
- @fjvbn20031
Ciliumアーキテクチャ内部分析:eBPFベースネットワーキングの核心
概要
CiliumはeBPF(extended Berkeley Packet Filter)を活用してKubernetes環境で高性能ネットワーキング、セキュリティ、オブザーバビリティを提供するCNIプラグインです。この記事ではCiliumの内部アーキテクチャを構成する核心コンポーネントを深く分析します。
1. Cilium Agent:ノードレベルの核心エンジン
1.1 Agentの概要
Cilium Agentは各KubernetesノードでDaemonSetとして実行される核心コンポーネントです。主な役割は以下の通りです。
- エンドポイント管理:Pod作成/削除時のネットワークインターフェース設定
- ポリシーコンパイル:CiliumNetworkPolicyをeBPFプログラムに変換
- eBPFプログラムロード:コンパイルされたBPFプログラムをカーネルにロード
- Identity管理:セキュリティラベルベースのIdentity割り当てと追跡
- IPAM:ノードレベルのIPアドレス管理
- 状態同期:KVStoreまたはCRDとの状態同期
1.2 Agent内部構造
Cilium Agentは複数のサブシステムで構成されます。
// Cilium Agentの主要サブシステム(概念的構造)
type Daemon struct {
// エンドポイント管理
endpointManager *endpoint.EndpointManager
// ポリシーリポジトリ
policy *policy.Repository
// Identityアロケータ
identityAllocator *cache.CachingIdentityAllocator
// IPAM
ipam *ipam.IPAM
// データパス管理
datapath datapath.Datapath
// KVStoreクライアント
kvStore kvstore.BackendOperations
// モニタリング
monitorAgent monitorAgent.Agent
}
1.3 Agent起動プロセス
Agentの起動時には以下の順序で初期化が進行します。
- 設定ロード:ConfigMapまたはコマンドライン引数から設定を読み込み
- KVStore接続:etcdまたはCRDベースのKVStoreに接続
- IPAM初期化:IPアドレスプールの設定
- BPFマップ初期化:必要なBPFマップの作成または復元
- 既存エンドポイント復元:再起動時に既存のエンドポイント状態を復元
- ポリシーロード:既存のネットワークポリシーをロードして適用
- イベント監視開始:Kubernetes APIサーバーイベントの監視
# Agent状態確認
cilium status --verbose
# Agent設定確認
cilium config
1.4 エンドポイント管理の詳細
Cilium AgentはPod作成時にCNIインターフェースを通じて呼び出されます。
# Pod作成時のCilium CNI呼び出しフロー
# 1. kubeletがCRIを通じてコンテナランタイムにPod作成を要求
# 2. コンテナランタイムがCNIプラグイン(Cilium)を呼び出し
# 3. Cilium CNIがAgentにAPI呼び出し
# 4. Agentがveth pair作成、IP割り当て、BPFプログラムロード
# エンドポイント一覧確認
cilium endpoint list
# 特定エンドポイントの詳細情報
cilium endpoint get 12345
2. Cilium Operator:クラスタレベルの管理
2.1 Operatorの役割
Cilium Operatorはクラスタレベルで実行されるコンポーネントで、単一インスタンス(またはHAのためのリーダー選出ベースの複数インスタンス)としてデプロイされます。
主な役割:
- IPAM管理:クラスタ範囲のIPプール管理(Cluster Scope IPAM、AWS ENIなど)
- CRD管理:CiliumNode、CiliumIdentityなどのCRDガベージコレクション
- ノードディスカバリ:新規ノードの登録とメタデータ管理
- Ingress/Gateway管理:IngressおよびGateway APIリソースの処理
2.2 OperatorとAgentの役割分離
+------------------+ +-------------------+
| Cilium Operator | | Cilium Agent |
| (クラスタ範囲) | | (ノード範囲) |
+------------------+ +-------------------+
| - Cluster IPAM | | - エンドポイント管理 |
| - CRD GC | | - BPFプログラムロード|
| - ノードディスカバリ| | - ポリシー適用 |
| - Ingress処理 | | - conntrack管理 |
| - Identity GC | | - Identity割り当て |
+------------------+ +-------------------+
2.3 Operator設定例
apiVersion: apps/v1
kind: Deployment
metadata:
name: cilium-operator
namespace: kube-system
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
spec:
containers:
- name: cilium-operator
image: quay.io/cilium/operator-generic:v1.16.0
args:
- --config-dir=/tmp/cilium/config-map
- --cluster-pool-ipv4-cidr=10.0.0.0/8
- --cluster-pool-ipv4-mask-size=24
3. eBPFデータパス:カーネルレベルのネットワーク処理
3.1 eBPFプログラムフックポイント
CiliumはLinuxカーネルの複数のフックポイントにeBPFプログラムをアタッチします。
tc(Traffic Control)フック
最も主要なフックポイントで、各ネットワークインターフェースのingress/egressにアタッチされます。
パケット受信フロー:
NIC -> [XDP] -> ドライバ -> [tc ingress] -> ネットワークスタック -> [tc egress] -> NIC
Cilium BPFプログラムアタッチ位置:
- lxc*(veth):from-container、to-container
- cilium_host:to-host、from-host
- cilium_net:from-host(オーバーレイ)
- eth0(物理):from-netdev、to-netdev
XDP(eXpress Data Path)
ネットワークドライバレベルで動作する最速のパケット処理パスです。
# XDPプログラム確認
ip link show dev eth0
# eth0: ... xdp/id:42 ...
# BPFプログラム一覧確認
bpftool prog list
ソケットレベルフック
ソケットシステムコールをインターセプトしてサービスロードバランシングを実行します。
connect() -> [BPF sock_ops] -> サービスIPをバックエンドIPに変換
sendmsg() -> [BPF sk_msg] -> ソケット間メッセージリダイレクション
3.2 BPFプログラムコンパイルパイプライン
Cソースコード(bpf/*.c)
|
v
LLVM/Clang(BPFバックエンド)
|
v
BPF ELFオブジェクトファイル(.o)
|
v
BPFローダー(bpfシステムコール)
|
v
カーネルBPF検証器
|
v
JITコンパイル -> ネイティブ機械語
|
v
カーネルで実行
3.3 主要BPFプログラムファイル
bpf/
bpf_lxc.c # Pod(エンドポイント)データパス
bpf_host.c # ホストネットワークデータパス
bpf_overlay.c # オーバーレイ(VXLAN/Geneve)データパス
bpf_network.c # 物理ネットワークインターフェース
bpf_xdp.c # XDPプログラム
bpf_sock.c # ソケットレベルプログラム
lib/
common.h # 共通ヘッダーとマクロ
maps.h # BPFマップ定義
policy.h # ポリシー関連関数
conntrack.h # コネクショントラッキング
nat.h # NATエンジン
lb.h # ロードバランサー
4. BPFマップ:データパスの状態ストア
4.1 主要BPFマップタイプ
Ciliumは様々なBPFマップタイプを使用します。
| マップ名 | タイプ | 用途 |
|---|---|---|
| cilium_ipcache | LPM Trie | IPからIdentity/トンネル情報へのマッピング |
| cilium_policy | Hash | Identityベースのポリシールックアップ |
| cilium_ct4_global | Hash(LRU) | IPv4コネクショントラッキング |
| cilium_ct6_global | Hash(LRU) | IPv6コネクショントラッキング |
| cilium_lb4_services | Hash | IPv4サービスロードバランサー |
| cilium_lb4_backends | Hash | IPv4バックエンド情報 |
| cilium_snat_v4_external | Hash(LRU) | IPv4 SNATマッピング |
| cilium_tunnel_map | Hash | トンネルエンドポイントマッピング |
| cilium_lxc | Hash | エンドポイント情報 |
| cilium_signals | Perf Event Array | イベントシグナリング |
4.2 BPFマップ確認コマンド
# すべてのBPFマップ一覧確認
bpftool map list
# 特定マップの内容確認(ipcache)
cilium bpf ipcache list
# コネクショントラッキングテーブル
cilium bpf ct list global
# サービスロードバランサーテーブル
cilium bpf lb list
# ポリシーマップ確認
cilium bpf policy get 12345
# トンネルマップ確認
cilium bpf tunnel list
4.3 LPM Trie:CIDRポリシーの核心
LPM(Longest Prefix Match)TrieはCIDRベースのポリシーマッチングに使用されます。
IP Cache構造:
10.0.0.0/8 -> Identity: 1(world)
10.244.0.0/16 -> Identity: 100(cluster)
10.244.1.0/24 -> Identity: 200(特定の名前空間)
10.244.1.5/32 -> Identity: 300(特定のPod)
ルックアップ:10.244.1.5 -> Identity 300(最も具体的なマッチ)
4.4 LRU Hash:コネクショントラッキング
LRU(Least Recently Used)Hashマップはコネクショントラッキングに使用されます。マップがいっぱいになると最も古いエントリが自動的に削除されます。
# conntrackエントリ例
cilium bpf ct list global
# SRC: 10.244.1.5:34567 DST: 10.96.0.1:443
# Flags: rx+tx closing
# Lifetime: 120s
# RxPackets: 42 RxBytes: 3456
# TxPackets: 38 TxBytes: 2890
5. Identity割り当て:ラベルベースのセキュリティモデル
5.1 Identity割り当てメカニズム
CiliumのセキュリティモデルはラベルベースのIdentityに基づいています。
Podラベル:
app: frontend
env: production
team: web
|
v(セキュリティ関連ラベルの抽出)
セキュリティ関連ラベル:
k8s:app=frontend
k8s:io.kubernetes.pod.namespace=default
|
v(ハッシュ計算)
Identity: 48291(数値識別子)
5.2 セキュリティ関連ラベルの決定
すべてのラベルがIdentityに使用されるわけではありません。デフォルトでは以下がセキュリティ関連ラベルとみなされます。
# Identity一覧確認
cilium identity list
# 特定Identityの詳細情報
cilium identity get 48291
# Identityに含まれるラベル例:
# - k8s:app=...
# - k8s:io.kubernetes.pod.namespace=...
# - k8s:io.cilium.k8s.policy.cluster=...
# Identityから除外されるラベル例:
# - k8s:controller-revision-hash=...
# - k8s:pod-template-hash=...
# - k8s:pod-template-generation=...
5.3 Identity同期
IdentityはKVStoreを通じてクラスタ全体で同期されます。
ノードA:Pod作成 -> ラベルベースのIdentity要求
|
v
KVStore(CRDまたはetcd)
|
v(Identity割り当て/照会)
CiliumIdentity CRD:
metadata:
name: "48291"
security-labels:
k8s:app: frontend
k8s:io.kubernetes.pod.namespace: default
|
v
ノードB:ipcacheにIP-to-Identityマッピングを更新
5.4 予約済みIdentity
Ciliumは特殊目的の予約済みIdentityを定義しています。
| Identity | 数値 | 意味 |
|---|---|---|
| unknown | 0 | 不明なソース |
| host | 1 | ローカルホスト |
| world | 2 | クラスタ外部 |
| unmanaged | 3 | Ciliumが管理しないエンドポイント |
| health | 4 | ヘルスチェックエンドポイント |
| init | 5 | 初期化中のエンドポイント |
| remote-node | 6 | リモートノード |
| kube-apiserver | 7 | Kubernetes APIサーバー |
| ingress | 8 | Ingress |
6. エンドポイントライフサイクル
6.1 エンドポイントの作成
1. Pod作成イベント受信
|
v
2. CNI ADD呼び出し -> veth pair作成
|
v
3. IPアドレス割り当て(IPAM)
|
v
4. Identity割り当て
|
v
5. ポリシー計算(Identityベース)
|
v
6. BPFプログラムコンパイル
(ポリシー + Identity + 設定 -> カスタムBPFコード)
|
v
7. BPFプログラムロード(tc ingress/egress)
|
v
8. BPFマップ更新
(ipcache、endpointマップ、policyマップ)
|
v
9. エンドポイント状態:Ready
6.2 エンドポイント再生成(Regeneration)
ポリシー変更時に影響を受けるエンドポイントのBPFプログラムを再コンパイルします。
# エンドポイント再生成トリガー理由
# - ネットワークポリシーの変更
# - Identityの変更
# - Cilium設定の変更
# - ポリシーで参照されるFQDNのIP変更
# 再生成状態のモニタリング
cilium endpoint list
# ID IDENTITY POLICY ENDPOINT STATUS
# 1234 48291 OK ready
# 1235 48292 OK regenerating <-- 再生成中
6.3 エンドポイントの削除
1. Pod削除イベント受信
|
v
2. CNI DEL呼び出し
|
v
3. BPFプログラムの分離と削除
|
v
4. BPFマップから関連エントリを削除
|
v
5. veth pair削除
|
v
6. IPアドレス返却(IPAM)
|
v
7. エンドポイントメタデータのクリーンアップ
6.4 エンドポイント状態の確認
# 詳細エンドポイント情報
cilium endpoint get 1234
# エンドポイントヘルスチェック
cilium endpoint health 1234
# エンドポイントごとのBPFプログラム確認
cilium bpf prog list
# エンドポイントログ確認
cilium endpoint log 1234
7. 状態管理と復元
7.1 KVStoreバックエンド
Ciliumは2つのKVStoreバックエンドをサポートします。
# CRDベース(デフォルト)
# - CiliumIdentity、CiliumEndpoint、CiliumNodeなどのCRDを使用
# - etcd依存性なし
# - Kubernetes APIサーバーを通じた状態管理
# etcdベース
# - 別途のetcdクラスタが必要
# - 大規模クラスタでのパフォーマンス優位
# - ClusterMesh時に必須(clustermesh-apiserver)
7.2 Agent再起動時の状態復元
Agent再起動
|
v
BPFマップ復元(マップはカーネルに保持)
|
v
既存エンドポイント検索(vethインターフェーススキャン)
|
v
エンドポイント状態復元(CRDからロード)
|
v
Identityキャッシュのウォーミング
|
v
ポリシー再計算と適用
|
v
通常運用再開
Agentが再起動してもBPFマップとプログラムはカーネルに保持されるため、データパスは中断なく動作し続けます。これによりAgentアップグレード時もネットワーク接続が維持されます。
8. アーキテクチャデバッグツール
8.1 基本デバッグコマンド
# 全体状態確認
cilium status --verbose
# BPFプログラミング状態
cilium bpf prog list
# データパス設定確認
cilium debuginfo
# モニタリング(リアルタイムパケットイベント)
cilium monitor --type trace
cilium monitor --type drop
cilium monitor --type policy-verdict
# メトリクス確認
cilium metrics list
8.2 トラブルシューティングチェックリスト
cilium statusでAgent/Operator状態を確認cilium endpoint listでエンドポイント状態を確認(ready/not-ready/regenerating)cilium bpf ipcache listでIP-to-Identityマッピングを確認cilium monitor --type dropでドロップされたパケットの原因を分析cilium policy getで適用されたポリシーを確認cilium bpf ct list globalでコネクショントラッキング状態を確認
まとめ
Ciliumのアーキテクチャは以下の核心的な設計原則に基づいています。
- カーネルレベル処理:eBPFを通じてネットワークパケットをカーネルで直接処理し高性能を達成
- Identityベースセキュリティ:IPアドレスの代わりにラベルベースのIdentityでポリシーを適用し動的環境に適応
- 宣言的管理:Kubernetes CRDを通じた宣言的な状態管理
- ゼロダウンタイム更新:BPFプログラムとマップがカーネルに保持されAgent再起動時もデータパスを維持
- 役割分離:Agent(ノードレベル)とOperator(クラスタレベル)の明確な役割分離