IPAM と Network Policy
対応バージョン: Cilium 1.18 最終更新: February 23, 2026
Lab 環境のセットアップ
このドキュメントの例に沿って進めるには、次のツールと環境が必要です。
必要なツール
- kubectl v1.31 以降
- 動作する Kubernetes cluster(EKS、minikube、kind など)
- Cilium CLI
IPAM と Network Policy Lab のセットアップ
# Check Cilium status
cilium status --wait
# Check current IPAM configuration
kubectl -n kube-system get configmap cilium-config -o yaml | grep -E 'ipam|allocator'
# Create namespace for network policy testing
kubectl create namespace policy-test
# Deploy test application
kubectl -n policy-test apply -f https://raw.githubusercontent.com/cilium/cilium/v1.14/examples/minikube/http-sw-app.yamlIP Address Management(IPAM)戦略
重要な概念: IPAM(IP Address Management)は、IP address の割り当て、追跡、管理を担うシステムです。
IPAM は、IP address の割り当て、追跡、管理を担うシステムです。Cilium は、さまざまな環境や要件に柔軟に対応できる複数の IPAM mode をサポートします。
Cilium IPAM アーキテクチャ
Cilium IPAM mode:
Cluster Pool:
- デフォルトの IPAM mode
- cluster 全体にわたる集中型の IP address 割り当て
- 単一または複数の IP pool を設定可能
- シンプルで使いやすい
Kubernetes Host Scope:
- 各 node に IP address range を割り当てる
- node は自身の range から IP address を割り当てる
- 中央での調整は不要
- node 間の IP conflict を防止する
CRD-based IPAM:
- CiliumIPPool custom resource による IP pool 定義
- 特定の namespace または Pod に IP pool を割り当てる
- きめ細かな IP address 管理
- 動的な IP pool 管理
AWS ENI (Elastic Network Interface):
- AWS VPC ENI との統合
- Pod にネイティブ VPC IP address を割り当てる
- overlay network を使用しない VPC ネイティブネットワーキング
- AWS 環境向けに最適化
Azure IPAM:
- Azure VNET との統合
- Pod にネイティブ VNET IP address を割り当てる
- Azure 環境向けに最適化
IPAM コンポーネント:
- IP Pool: 割り当て可能な IP address の範囲
- IP Allocation: Endpoint への IP address の割り当て
- IP Release: 未使用の IP address の再利用
- IP Conflict Detection: IP address conflict の防止
- IP Reservation: 特定の目的のための IP address の予約
IPAM の考慮事項:
- Address Space Size: 必要な IP address の数
- Network Segmentation: subnet と CIDR block の設計
- Scalability: 将来の成長を考慮すること
IPAM 設定例
Cluster Pool IPAM 設定:
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
ipam: "cluster-pool"
cluster-pool-ipv4-cidr: "10.0.0.0/16"
cluster-pool-ipv4-mask-size: "24"
enable-ipv4: "true"
enable-ipv6: "false"AWS ENI IPAM 設定:
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
ipam: "eni"
enable-ipv4: "true"
enable-ipv6: "false"
eni-tags: "{\"cluster\": \"eks-cluster\"}"
ec2-api-endpoint: "ec2.us-west-2.amazonaws.com"- Cloud Integration: cloud provider networking との統合
- IPv4 vs IPv6: single stack または dual stack の設定
Kubernetes と Cilium IPAM の統合
Cilium は Kubernetes と緊密に統合され、Pod と Service の IP address を割り当てて管理します。
Kubernetes IPAM 統合フロー:
- Pod Creation: Kubernetes が Pod 作成を要求する
- CNI Call: kubelet が Cilium CNI plugin を呼び出す
- IP Allocation Request: Cilium が IPAM module に IP address を要求する
- IP Allocation: IPAM が利用可能な IP address を割り当てる
- Network Setup: Cilium が Pod の network namespace を設定する
- State Storage: IP allocation 情報を保存する
- Pod Start: 設定済み network で Pod が起動する
Cilium Cluster Pool 設定:
# cilium-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# Cluster pool IPAM mode
ipam: "cluster-pool"
# IPv4 CIDR range
cluster-pool-ipv4-cidr: "10.0.0.0/8"
cluster-pool-ipv4-mask-size: "24"
# IPv6 CIDR range (optional)
cluster-pool-ipv6-cidr: "fd00::/104"
cluster-pool-ipv6-mask-size: "120"
# Enable dual stack
enable-ipv4: "true"
enable-ipv6: "true"CRD-based IPAM の例:
# cilium-ippool.yaml
apiVersion: "cilium.io/v2alpha1"
kind: CiliumIPPool
metadata:
name: "production-pool"
spec:
ipv4:
cidr: "10.10.0.0/16"
blockSize: 27 # 32 IP address blocks
selector:
matchLabels:
environment: productionAWS ENI IPAM 設定:
# cilium-aws-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# AWS ENI IPAM mode
ipam: "eni"
# AWS ENI configuration
enable-endpoint-routes: "true"
auto-create-cilium-node-resource: "true"
# ENI tags (optional)
eni-tags: "{\"team\": \"platform\"}"
# Prefix delegation (optional)
enable-prefix-delegation: "true"
eni-prefix-delegation-enabled: "true"IPAM mode の詳細
1. Cluster Scope - デフォルト mode
Cluster Scope IPAM は Cilium のデフォルト IPAM mode であり、cluster 全体にわたって IP address を集中管理で割り当てます。
主な機能:
- 集中型の IP address 割り当て
- cluster 全体で IP address の一意性を保証
- 単一または複数の IP pool を設定可能
- シンプルで使いやすい
仕組み:
- Cilium agent が cluster 全体の IP pool から IP address を割り当てます。
- 割り当てられた IP address は Kubernetes CRD に保存されます。
- IP address の割り当て情報は cluster 内のすべての node で共有されます。
2. Kubernetes Host Scope
Kubernetes Host Scope IPAM は各 node に IP address range を割り当て、node は自身の range から IP address を割り当てます。
主な機能:
- node 単位の IP address range 割り当て
- 中央での調整は不要
- node 間の IP conflict を防止
- scalability の向上
仕組み:
- Kubernetes が各 node に PodCIDR を割り当てます。
- Cilium が node の PodCIDR から IP address を割り当てます。
- 各 node は自身の IP address range を独立して管理します。
3. Multi-Pool - Beta
Multi-Pool IPAM では、複数の IP pool を定義し、特定の workload に特定の pool を割り当てることができます。
主な機能:
- 複数の IP pool を定義および管理
- namespace、Pod、または node ごとに IP pool を割り当て
- きめ細かな IP address 管理
- 多様な network 要件をサポート
仕組み:
- CiliumIPPool CRD を使用して複数の IP pool を定義します。
- selector を使用して、特定の workload に特定の pool を割り当てます。
- Cilium は定義された rule に従って、適切な pool から IP address を割り当てます。
4. Azure IPAM
Azure IPAM は Azure VNET と統合し、Pod にネイティブ VNET IP address を割り当てます。
主な機能:
- Azure VNET ネイティブ IP address の割り当て
- Azure network security group との統合
- Azure networking の最適化
5. Azure Delegated IPAM
Azure Delegated IPAM は、IP address 管理を Azure CNI に委譲する mode です。
主な機能:
- Azure CNI との統合
- Azure 管理の IP address 割り当て
- Azure networking 機能を活用
6. CRD-based IPAM
CRD-based IPAM は Kubernetes CRD を使用して IP address の割り当てを管理します。
主な機能:
- Kubernetes CRD による IP address 管理
- 宣言的な IP address 割り当て
- Kubernetes ネイティブ workflow との統合
仕組み:
- IP address pool 情報は CiliumNode CRD に保存されます。
- Cilium agent が CRD から IP address の割り当て情報を読み取ります。
- IP address の割り当て状態は CRD で更新されます。
CiliumNode CR を使用した node ごとの PodCIDR の照会
Cilium の cluster-pool IPAM mode では、各 node の Pod CIDR 割り当て情報は CiliumNode CR に記録されます。この CR は、static route 設定、IPAM debugging、network troubleshooting の信頼できる情報源として機能します。
注記: Kubernetes Node object の
spec.podCIDRは、CiliumNode CR のspec.ipam.podCIDRsと異なる場合があります。Cilium 環境では、常に CiliumNode CR を信頼できる情報源として使用してください。
CiliumNode CR の構造(主要フィールド)
apiVersion: cilium.io/v2
kind: CiliumNode
metadata:
name: hybrid-node-001
spec:
addresses:
- ip: 10.80.1.10 # Node IP (used as next hop for static routes)
type: InternalIP
ipam:
podCIDRs:
- 10.85.0.0/25 # Pod CIDR allocated to this nodespec.addresses[].ip: node の実際の IP address。static route を設定する際の next hop として使用されます。spec.ipam.podCIDRs: Cilium Operator がこの node に割り当てた Pod CIDR のリスト。
照会コマンド
# List all CiliumNodes
kubectl get ciliumnodes
# Query node IP and PodCIDR in table format
kubectl get ciliumnodes -o custom-columns='\
NAME:.metadata.name,\
NODE_IP:.spec.addresses[0].ip,\
POD_CIDR:.spec.ipam.podCIDRs[0]'出力例:
NAME NODE_IP POD_CIDR
hybrid-node-001 10.80.1.10 10.85.0.0/25
hybrid-node-002 10.80.1.11 10.85.0.128/25
hybrid-node-003 10.80.1.12 10.85.1.0/25Script での使用方法
# Extract routing table information using jq
kubectl get ciliumnodes -o json | jq -r \
'.items[] | "\(.metadata.name)\t\(.spec.addresses[0].ip)\t\(.spec.ipam.podCIDRs[0])"'
# Auto-generate static route commands (useful for EKS Hybrid Nodes, etc.)
kubectl get ciliumnodes -o json | jq -r \
'.items[] | "ip route add \(.spec.ipam.podCIDRs[0]) via \(.spec.addresses[0].ip)"'ユースケース: この情報は、EKS Hybrid Nodes 環境で BGP を使用せずに static route を設定するために使用されます。詳細は、EKS Hybrid Nodes - Network Configuration を参照してください。
Network Policy の設計と実装
Cilium Network Policy は、L3-L7 layer で microservice 間の通信を制御する強力なメカニズムを提供します。これらの policy は Kubernetes NetworkPolicy API を拡張し、よりきめ細かな制御を可能にします。
Network Policy の基本概念:
- Endpoint Selector: policy を適用する Endpoint を定義
- Ingress Rules: 受信 traffic を制御
- Egress Rules: 送信 traffic を制御
- L3/L4 Policy: IP address と port に基づく filtering
- L7 Policy: application layer protocol を認識する filtering
L3/L4 Network Policy の例:
# l3-l4-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l3-l4-policy"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
egress:
- toEndpoints:
- matchLabels:
app: database
toPorts:
- ports:
- port: "3306"
protocol: TCPL7 HTTP Policy の例:
# l7-http-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-http-policy"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/v1/users"
- method: "POST"
path: "/api/v1/users"
headers:
- "Content-Type: application/json"L7 Kafka Policy の例:
# l7-kafka-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "l7-kafka-policy"
spec:
endpointSelector:
matchLabels:
app: kafka-broker
ingress:
- fromEndpoints:
- matchLabels:
app: kafka-client
toPorts:
- ports:
- port: "9092"
protocol: TCP
rules:
kafka:
- apiKey: "Produce"
topic: "allowed-topic-1"
- apiKey: "Fetch"
topic: "allowed-topic-1"
- apiKey: "CreateTopics"
topic: "allowed-topic-.*"
apiVersions: ["0", "1"]DNS-based Policy の例:
# dns-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "dns-policy"
spec:
endpointSelector:
matchLabels:
app: client
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
- port: "53"
protocol: TCP
- toFQDNs:
- matchName: "api.example.com"
- matchPattern: "*.googleapis.com"
toPorts:
- ports:
- port: "443"
protocol: TCPNetwork Policy のベストプラクティス:
Default Deny Policy を適用する:
- 明示的に許可されていないすべての traffic を block する
- least privilege principle を適用する
段階的なアプローチ:
- observation mode で開始して影響を評価する
- policy を段階的に適用して強化する
label ベースの selector を使用する:
- IP address ではなく label ベースの selector を使用する
- 動的な環境で柔軟性を提供する
Policy の階層化:
- 基本 policy と特定の policy を組み合わせる
- 関心の分離と保守性を確保する
Policy のテストと検証:
- policy 適用前にテストする
- 継続的な policy の検証と monitoring を行う
Multi-cluster シナリオ
Cilium は、複数の Kubernetes cluster にまたがる networking と security のための強力な機能を提供します。これにより、cross-cluster Service 通信、Network Policy の適用、load balancing が可能になります。
Multi-cluster 接続モデル:
Global Services:
- 複数の cluster にわたって Service を公開する
- cross-cluster load balancing
- 自動 failover と high availability
Cluster Mesh:
- cluster 間の直接接続
- cross-cluster Network Policy
- 統合された observability
Remote Nodes:
- remote cluster の node を local として表示する
- cluster 間の透過的な通信
- 単一 network namespace のシミュレーション
Cilium Cluster Mesh アーキテクチャ:
+-------------------+ +-------------------+
| Cluster A | | Cluster B |
| | | |
| +---------------+ | | +---------------+ |
| | Service A | | | | Service B | |
| | (Global) | | | | (Global) | |
| +-------+-------+ | | +-------+-------+ |
| | | | | |
| +---v---+ | | +---v---+ |
| | eBPF | | | | eBPF | |
| +---+---+ | | +---+---+ |
| | | | | |
| +-------v-------+ | | +-------v-------+ |
| | Cilium | |<------>| | Cilium | |
| | Clustermesh | | | | Clustermesh | |
| +---------------+ | | +---------------+ |
| | | |
+-------------------+ +-------------------+Cilium Cluster Mesh のセットアップ:
# Enable Cluster Mesh on Cluster A
cilium clustermesh enable --context cluster-a
# Enable Cluster Mesh on Cluster B
cilium clustermesh enable --context cluster-b
# Connect clusters
cilium clustermesh connect --context cluster-a --destination-context cluster-b
# Check status
cilium clustermesh status --context cluster-aGlobal Service の定義:
# global-service.yaml
apiVersion: v1
kind: Service
metadata:
name: global-service
annotations:
io.cilium/global-service: "true"
spec:
selector:
app: global-app
ports:
- port: 80
targetPort: 8080
type: ClusterIPCross-cluster Network Policy:
# cross-cluster-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "cross-cluster-policy"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
io.kubernetes.pod.namespace: frontend-ns
io.cilium.k8s.policy.cluster: cluster-a
toPorts:
- ports:
- port: "8080"
protocol: TCPクイズ
この章で学んだ内容を確認するには、トピッククイズ に挑戦してください。