Contents
Cilium の概要と Kubernetes における役割
Cilium は eBPF(extended Berkeley Packet Filter)を活用したデータプレーンを提供し、Kubernetes クラスタのネットワーク制御とセキュリティポリシーを統合的に管理できるソフトウェアです。従来の CNI プラグインが L3/L4 の転送だけを担うのに対し、Cilium はカーネル内部でパケット処理を行うことで高性能かつ柔軟な制御を実現します。本セクションでは、その主な機能と Kubernetes への組み込み方を概観します。
BPF‑ベースの高速転送
eBPF プログラムは Linux カーネル空間で直接実行されるため、パケットがユーザー空間に出入りするオーバーヘッドが大幅に削減されます。具体的には iptables と比較してレイテンシが 30〜50% 程度改善され、スループットも向上します。
Kubernetes CNI としての位置付け
Cilium の DaemonSet が各ノード上で起動し、Pod に対して仮想ネットワークインターフェース(cilium_netdev)を割り当てます。これにより、Kubernetes API Server から取得した Pod ラベル情報がそのまま Security Identity として利用でき、IP アドレスの変動に左右されないポリシー適用が可能です。
主な機能
| 機能 | 内容 |
|---|---|
| Identity | ラベルから生成された 32 ビットの Security Identity が Pod を一意に識別し、IP アドレスが変わっても同一ポリシーを適用できる。 |
| L7 可視化・ポリシー | HTTP、gRPC、Kafka 等のアプリケーション層トラフィックを解析し、メソッドやパス単位で細かいアクセス制御が可能。 |
| NetworkPolicy 拡張 | 標準 NetworkPolicy の上位互換として CiliumNetworkPolicy を提供し、DNS 名や Service 名でもマッチングできる。 |
| Hubble UI | トラフィックフローのリアルタイム可視化とメトリクス収集を行う Web UI(Prometheus との連携もサポート)。 |
要点:Cilium が提供する BPF データプレーンと Identity により、Kubernetes 環境で高速かつ粒度の細かいネットワーク制御が実現できます。
インストール手順とバージョン確認(2026 年最新版)
本章では Cilium を Kubernetes クラスタに導入する際の前提条件、各インストール方法の概要、およびインストール後のバージョン検証手順を解説します。実運用で必要になるカーネル要件や eBPF の有効化情報も合わせて記載しています。
前提条件とカーネル要件
Cilium が正常に動作するためには、以下の条件が最低限必要です(2026 年時点の公式要件)。
| 条件 | 推奨バージョン / 設定 |
|---|---|
| Linux カーネル | 5.10 以上(5.15 系以降を推奨)。古いカーネルでも一部機能が制限される可能性があります。 |
| eBPF コンフィグ | CONFIG_BPF=y、CONFIG_NET_CLS_BPF=y、CONFIG_HAVE_EBPF_JIT=y が有効であること。 |
| cgroup v2 | Cilium の一部機能(例:CNI 以外のポリシー)では cgroup v2 が必要です。 systemd.unified_cgroup_hierarchy=1 をカーネル起動パラメータに設定してください。 |
| 対応ディストリビューション | Ubuntu 22.04、RHEL / CentOS 8/9、Alpine 3.18 以降など、公式がサポートする主要 Linux ディストロでの利用が検証済みです。 |
カーネル設定は次のコマンドで確認できます。
|
1 2 3 4 5 6 |
# eBPF が有効かチェック grep -E 'CONFIG_BPF|CONFIG_NET_CLS_BPF|CONFIG_HAVE_EBPF_JIT' /boot/config-$(uname -r) # cgroup バージョンを確認 stat -fc %T /sys/fs/cgroup |
リリースバージョンの扱いについて
本稿では執筆時点で最新とされる v1.15.0 を例示していますが、実際に導入する際は公式 GitHub の Releases ページ( https://github.com/cilium/cilium/releases )で最新版を確認してください。バージョン番号は 6 ヶ月ごとのマイナーバージョン更新が行われるため、v1.15.x 系がリリースされた後でも v1.16.x がすでに提供されている可能性があります。
Helm によるデプロイ
Helm は Kubernetes のパッケージマネージャとして広く使われており、Cilium も公式チャートが用意されています。以下は Helm を利用した基本的なインストール手順です。
-
リポジトリの追加と更新
bash
helm repo add cilium https://helm.cilium.io/
helm repo update -
デフォルト設定でインストール(Kubernetes 1.30+、cgroup v2 が有効な環境を想定)
bash
helm install cilium cilium/cilium \
--namespace kube-system \
--create-namespace \
--set ipam.mode=kube-ipam \
--set hubble.enabled=true \
--version "$(curl -s https://raw.githubusercontent.com/cilium/cilium/master/stable.txt)"
stable.txtは最新版のタグを自動取得するための簡易スクリプトです。手動でバージョン番号を指定したい場合は--version 1.15.0のように置き換えてください。 -
クラウドプロバイダ固有設定例
- AWS ENI:
--set eni.enabled=true --set eni.instance-id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) - Azure CNI:
--set azure.enabled=true
Helm によるインストールは
values.yamlで細かくカスタマイズでき、GitOps ツールと組み合わせて再現性の高いデプロイが可能です。
Operator を使った自動管理
Cilium Operator は CNI の他に IPAM や BGP、ClusterMesh といった高度な機能を CRD(Custom Resource Definition)で宣言的に管理します。Operator による導入手順は次の通りです。
-
CRD と Operator 本体の適用
bash
kubectl apply -f https://raw.githubusercontent.com/cilium/operator/master/install/k8s.yaml -
CiliumInstallation カスタムリソースを作成(例:kube-ipam 使用)
yaml
apiVersion: cilium.io/v2alpha1
kind: CiliumInstallation
metadata:
name: default
namespace: kube-system
spec:
version: "latest" # latest は Operator が自動で最新タグを取得
ipamMode: kube-ipam
hubble:
enabled: true -
適用
bash
kubectl apply -f cilium-installation.yaml
Operator がバックグラウンドで Cilium のデプロイ・アップグレード・ロールバックを監視し、期待通りの状態が保たれない場合は自動で再適用します。
kubeadm ディレクトリへのマニフェスト適用
kubeadm で作成したクラスターでは、/etc/kubernetes/manifests 配下に配置するだけで kubelet が Pod として Cilium を起動します。手順は以下の通りです。
-
公式マニフェスト取得(バージョンは
latestタグを利用)
bash
curl -L https://github.com/cilium/cilium/releases/download/latest/cilium.yaml \
-o /etc/kubernetes/manifests/cilium.yaml -
kubelet が自動的にデプロイ
マニフェストが配置されると、kubelet が即座にciliumPod を起動し、ノードの CNI 設定を上書きします。
この方式はシンプルですが、設定変更時にはマニフェストファイルを書き換えて kubelet の再起動が必要になる点に注意してください。
バージョン確認方法
導入後に実際に走っている Cilium のバージョンやエージェントの状態を確認する手順です。
-
Cilium CLI
bash
cilium version
# 出力例: cilium-cli v0.15.2, cilium-agent 1.15.0 (2026-03-12) -
Pod のイメージタグ確認
bash
kubectl get pods -n kube-system -l k8s-app=cilium -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}' -
ステータスの詳細取得
bash
cilium status --verbose
バージョン情報は
cilium versionの出力だけでなく、cilium statusに含まれる Cluster や K8s の情報も合わせて確認すると、アップグレード時のトラブルを防げます。
NetworkPolicy の比較:Kubernetes 標準 vs CiliumNetworkPolicy
このセクションでは標準 NetworkPolicy と拡張版 CiliumNetworkPolicy を機能観点で比較し、どちらを選択すべきかの指針を示します。
主な違いと拡張ポイント
以下の表は両者の対応レイヤやマッチング対象をまとめたものです。各項目は実務上頻繁に直面する要件に焦点を当てています。
| 項目 | Kubernetes NetworkPolicy | CiliumNetworkPolicy |
|---|---|---|
| 対象レイヤ | L3(IP) / L4(Port) | L3/L4 + L7(HTTP, gRPC, Kafka 等) |
| ポリシー単位 | Namespace/PodSelector | Identity、Service 名、DNS 名、CIDR など多様 |
| マッチング対象 | Pod のラベル、Namespace ラベル、IPBlock | Security Identity、K8s Service、FQDN、DNS 解決結果 |
| デフォルト動作 | Allow all(許可) | Default Deny(cilium network-policy default-deny-all が推奨) |
| トラブルシューティング | kubectl describe np で情報取得 |
cilium monitor, cilium policy trace で詳細可視化 |
CiliumNetworkPolicy は「ゼロトラスト」的なデフォルト拒否モデルを前提としており、Identity ベースの粒度が高いためマイクロサービス間の細かい制御に適しています。
選択指針
- シンプルなネットワーク分離(例:名前空間単位で外部アクセスを遮断) → 標準
NetworkPolicyでも十分です。 - アプリケーション層の可視化・制御が必要(例:特定 API エンドポイントだけ許可、Kafka トピックごとのアクセス制限) →
CiliumNetworkPolicyが有力です。 - 既存インフラで cgroup v2 が未導入の場合は、標準ポリシーでまずは基礎的な分離を行い、段階的に Cilium へ移行することが推奨されます。
実践サンプル:CiliumNetworkPolicy の作成・適用と検証
本節では実際に CiliumNetworkPolicy を記述し、Ingress/Egress に加えて L7 フィルタを組み込む例を示します。最後にポリシーが正しく機能しているか確認する手順も併せて解説します。
Ingress と Egress の基本例
以下は backend Pod への inbound(8080/TCP)と、database への outbound(5432/TCP)を許可するシンプルなポリシーです。endpointSelector が対象 Pod を特定し、fromEndpoints / toEndpoints が通信元・先のラベルでマッチさせます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: allow-frontend-to-backend spec: endpointSelector: matchLabels: app: backend # 対象 Pod(backend) ingress: - fromEndpoints: - matchLabels: app: frontend # 通信元は frontend toPorts: - ports: - port: "8080" protocol: TCP egress: - toEndpoints: - matchLabels: app: database # 宛先は database toPorts: - ports: - port: "5432" protocol: TCP |
ポイント:IP アドレスではなくラベルでマッチングするため、Pod の再スケジューリングや IP 変更があってもポリシーは自動的に適用され続けます。
L4/L7 フィルタ付きポリシー例
次の例は api-gateway に対して、role=client の Pod が GET /v1/orders/* だけ通過できるよう制限したものです。L4 ポート(80/TCP)に加えて L7 の HTTP メソッドとパスを条件にしています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: http-get-filter spec: endpointSelector: matchLabels: app: api-gateway # 対象 Pod(API ゲートウェイ) ingress: - fromEndpoints: - matchLabels: role: client # クライアント側のラベル toPorts: - ports: - port: "80" protocol: TCP rules: http: - method: GET path: "/v1/orders/*" |
ポイント:
rules.http配列に記述できる項目はmethod,path,host,headersなど多岐にわたり、細かい API 単位でのアクセス制御が可能です。
適用後の動作確認手順
-
ポリシー適用
bash
kubectl apply -f allow-frontend-to-backend.yaml
kubectl apply -f http-get-filter.yaml -
Cilium エージェントがポリシーを認識したか確認
bash
cilium policy get allow-frontend-to-backend
cilium policy get http-get-filter -
ステータスの待機(エージェントが最新状態になるまで)
bash
cilium status --wait -
リアルタイムモニタリングでトラフィックを観測
bash
# L7 レベルまで出力
cilium monitor -t L7 -
Pod から実際にリクエストを送信し、期待通りの結果になるかテスト
Ingress/Egress のベーシックチェック
bash
# frontend → backend (許可)
kubectl exec -n prod -it $(kubectl get pod -l app=frontend -o jsonpath='{.items[0].metadata.name}') \
-- curl -s http://backend:8080/healthz
# frontend → database (未許可のポート例)
kubectl exec -n prod -it $(kubectl get pod -l app=frontend -o jsonpath='{.items[0].metadata.name}') \
-- nc -vz database 3306
L7 フィルタの検証
bash
# GET リクエスト (許可)
kubectl exec -n prod -it $(kubectl get pod -l role=client -o jsonpath='{.items[0].metadata.name}') \
-- curl -s http://api-gateway/v1/orders/123
# POST リクエスト (ブロックされるはず)
kubectl exec -n prod -it $(kubectl get pod -l role=client -o jsonpath='{.items[0].metadata.name}') \
-- curl -X POST -s http://api-gateway/v1/orders/123
期待通りに
POSTが 403 系のステータスで失敗すれば、L7 フィルタが正しく機能しています。
トラブルシューティングとベストプラクティス
本章ではポリシーが効かないケースや運用上の注意点をまとめ、安定した Cilium 環境を構築するための実践的な手順をご紹介します。
ポリシーが期待通りに適用されない時のチェックリスト
| チェック項目 | 確認方法 | 想定される原因 |
|---|---|---|
| Cilium エージェントの稼働状態 | kubectl -n kube-system get pods -l k8s-app=cilium |
Pod が CrashLoopBackOff している、またはイメージ不整合 |
| IPAM の設定 | cilium status --verbose の IPAM セクション |
kube-ipam が無効、ENI 設定ミス |
| BPF マップのロード状況 | cilium bpf map list |
カーネルが BPF をサポートしていない、または CONFIG_BPF=y が無効 |
| ラベル一致 | kubectl get pod -L app,role |
ポリシーで指定したラベルと実際の Pod ラベルが不一致 |
| デフォルト Deny の有無 | cilium policy get |
予期せぬ default-deny-all が適用されている |
| cgroup バージョン | stat -fc %T /sys/fs/cgroup |
cgroup v1 しか利用できず、一部機能が制限 |
代表的な対処例
-
エージェントが停止している場合
bash
kubectl rollout restart daemonset cilium -n kube-system -
IPAM エラー
bash
cilium ipam uninstall && cilium ipam install -
BPF がロードされていない(カーネルアップデートまたはブートオプションの修正)
bash
# カーネルパラメータを確認し、必要なら再起動
grep -i bpf /boot/config-$(uname -r)
運用上のベストプラクティス
-
名前空間単位で Default‑Deny を設定
yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: default-deny-all
namespace: prod
spec:
endpointSelector: {}
ingress: [] # すべての Ingress を遮断
egress: [] # すべての Egress を遮断
ゼロトラストを基本方針とし、許可したい通信だけを個別にポリシーで追加します。 -
ポリシーは機能単位でファイル分割
-
ingress-allow.yaml、egress-db.yamlなど目的別に管理し、kustomizeやhelmの patchesStrategicMerge 機構で統合すると差分が見やすくなります。 -
CI/CD パイプラインでポリシー検証
- PR 時点で
cilium policy verify --from-yaml <policy.yaml>を実行し、シンタックスエラーや未使用ラベルを早期に発見。 -
kindクラスター上で自動テスト(curl,grpcurl)を走らせ、期待通りにブロック/許可されるかを検証します。 -
BPF マップの定期的なメンテナンス
-
大規模クラスターではマップサイズが増大しパフォーマンス低下の原因になることがあります。以下コマンドでサイズを確認し、必要に応じてリセットしてください。
bash
cilium bpf map list | grep -E 'policy|lb' # サイズ表示
cilium bpf policy delete --all # 全ポリシーマップのクリア(再適用が必要) -
可視化と監視
- Hubble UI をデプロイし、L7 トラフィックフローやポリシー違反をリアルタイムで確認。
-
Prometheus エクスポートされたメトリクス(
cilium_flow_*,cilium_policy_*)を Grafana ダッシュボードに組み込み、異常検知アラートを設定します。 -
アップグレード時の安全策
- 現行バージョンで
cilium status --verboseを取得し、全コンポーネントが Ready 状態か確認。 - Helm の場合は
helm upgrade --install ... --dry-runでマニフェストを事前検証。 - Operator 利用時は
CiliumInstallationのversionフィールドだけを書き換えてkubectl apply -f、Operator がロールアウトを自動管理します。
要点:チェックリストで迅速に原因切り分けし、Default‑Deny・ポリシー分割・CI テストというベストプラクティスを組み合わせることで、Cilium の運用リスクを最小化できます。
まとめ
- Cilium は eBPF を核にした高速データプレーンと Identity ベースのポリシーで、Kubernetes におけるネットワーク制御を次世代レベルへ引き上げます。
- インストールは Helm・Operator・kubeadm マニフェストのいずれでも可能ですが、カーネル 5.10 以上・eBPF 有効化・cgroup v2 が必須条件です。最新版は公式リポジトリで随時確認してください。
- 標準
NetworkPolicyと比較すると、Cilium の拡張版は L7 フィルタや DNS/Service 名ベースのマッチングを提供し、ゼロトラスト実装に適しています。 - 実践サンプルでは Ingress/Egress に加えて HTTP GET 限定ポリシーを示し、
cilium monitorとcurlテストで動作検証する流れを紹介しました。 - トラブルシューティングは「エージェント状態」「IPAM」「BPF マップ」「ラベル一致」の四点に絞ってチェックリスト化し、ベストプラクティスとして Default‑Deny、ポリシー分割、CI/CD テスト、定期的な BPF マップクリア、Hubble 可視化を推奨します。
以上のポイントを踏まえて導入・運用すれば、Cilium が提供する高度なネットワーク機能とセキュリティポリシーを安定して活かせるはずです。