Skip to content
Published on

Ciliumアーキテクチャ内部分析:eBPFベースネットワーキングの核心

Authors

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の起動時には以下の順序で初期化が進行します。

  1. 設定ロード:ConfigMapまたはコマンドライン引数から設定を読み込み
  2. KVStore接続:etcdまたはCRDベースのKVStoreに接続
  3. IPAM初期化:IPアドレスプールの設定
  4. BPFマップ初期化:必要なBPFマップの作成または復元
  5. 既存エンドポイント復元:再起動時に既存のエンドポイント状態を復元
  6. ポリシーロード:既存のネットワークポリシーをロードして適用
  7. イベント監視開始: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_ipcacheLPM TrieIPからIdentity/トンネル情報へのマッピング
cilium_policyHashIdentityベースのポリシールックアップ
cilium_ct4_globalHash(LRU)IPv4コネクショントラッキング
cilium_ct6_globalHash(LRU)IPv6コネクショントラッキング
cilium_lb4_servicesHashIPv4サービスロードバランサー
cilium_lb4_backendsHashIPv4バックエンド情報
cilium_snat_v4_externalHash(LRU)IPv4 SNATマッピング
cilium_tunnel_mapHashトンネルエンドポイントマッピング
cilium_lxcHashエンドポイント情報
cilium_signalsPerf 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数値意味
unknown0不明なソース
host1ローカルホスト
world2クラスタ外部
unmanaged3Ciliumが管理しないエンドポイント
health4ヘルスチェックエンドポイント
init5初期化中のエンドポイント
remote-node6リモートノード
kube-apiserver7Kubernetes APIサーバー
ingress8Ingress

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 トラブルシューティングチェックリスト

  1. cilium statusでAgent/Operator状態を確認
  2. cilium endpoint listでエンドポイント状態を確認(ready/not-ready/regenerating)
  3. cilium bpf ipcache listでIP-to-Identityマッピングを確認
  4. cilium monitor --type dropでドロップされたパケットの原因を分析
  5. cilium policy getで適用されたポリシーを確認
  6. cilium bpf ct list globalでコネクショントラッキング状態を確認

まとめ

Ciliumのアーキテクチャは以下の核心的な設計原則に基づいています。

  • カーネルレベル処理:eBPFを通じてネットワークパケットをカーネルで直接処理し高性能を達成
  • Identityベースセキュリティ:IPアドレスの代わりにラベルベースのIdentityでポリシーを適用し動的環境に適応
  • 宣言的管理:Kubernetes CRDを通じた宣言的な状態管理
  • ゼロダウンタイム更新:BPFプログラムとマップがカーネルに保持されAgent再起動時もデータパスを維持
  • 役割分離:Agent(ノードレベル)とOperator(クラスタレベル)の明確な役割分離