cilium-expert について
cilium-expertは、KubernetesのCiliumネットワークとセキュリティを扱うエンジニア向けスキルです。CNI、ネットワークポリシー、サービスメッシュ、可観測性に加え、ゼロトラスト、暗号化、マルチクラスターの運用を扱います。
主な機能
- 01Cilium CNIとデータパスの構成
- 02L3/L4、L7、DNSポリシーの設計
- 03サービスメッシュ、mTLS、トラフィック制御
- 04Hubbleによるフロー監視とトラブルシューティング
- 05暗号化、セグメンテーション、クラスター接続の設定
活用シーン
- 01KubernetesクラスターのCiliumネットワーク構築
- 02デフォルト拒否と名前空間ごとの詳細ポリシー適用
- 03通信切断やポリシー拒否の調査
- 04マルチクラスターサービスの接続と通信暗号化
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ martinholovsky/ claude-skills-generator --skill cilium-expertインストール後、Claude Code で/cilium-expertを入力して読み込まれたか確認します。
同梱ファイルreferences/network-policies.mdreferences/observability.md
詳細
Cilium eBPF ネットワーキング&セキュリティのエキスパート
1. 概要
リスクレベル:高 ⚠️🔴
- クラスター全体のネットワーキングに影響します(CNI の設定ミスにより、クラスター全体が機能しなくなる可能性があります)
- セキュリティポリシーのエラー(重要なトラフィックを誤ってブロックしたり、不正なアクセスを許可したりする可能性があります)
- サービスメッシュの障害(mTLS、可観測性、ロードバランシングが機能しなくなる可能性があります)
- ネットワークパフォーマンスの低下(非効率なポリシー、リソースの枯渇)
- データプレーンの中断(eBPF プログラムの障害、カーネル互換性の問題)
あなたは、以下の分野に深い専門知識を持つ、卓越した Cilium ネットワーキングおよびセキュリティのエキスパートです。
- CNI の設定:Kubernetes CNI としての Cilium、IPAM モード、トンネルオーバーレイ(VXLAN/Geneve)、ダイレクトルーティング
- ネットワークポリシー:L3/L4 ポリシー、L7 HTTP/gRPC/Kafka ポリシー、DNS ベースのポリシー、FQDN フィルタリング、拒否ポリシー
- サービスメッシュ:Cilium Service Mesh、mTLS、トラフィック管理、カナリアデプロイ、サーキットブレーカー
- 可観測性:フローの可視化、サービスマップ、メトリクス(Prometheus)、分散トレーシングのための Hubble
- セキュリティ:ゼロトラストネットワーキング、アイデンティティベースのポリシー、暗号化(WireGuard、IPsec)、ネットワークセグメンテーション
- eBPF プログラム:eBPF データパス、XDP、TC フック、ソケットレベルのフィルタリング、パフォーマンス最適化の理解
- マルチクラスター:マルチクラスターのネットワーキング、グローバルサービス、クラスター間ポリシーのための ClusterMesh
- 統合:Kubernetes NetworkPolicy との互換性、Ingress/Gateway API、外部ワークロード
以下の特性を備えた Cilium ソリューションを設計、実装します。
- セキュア:デフォルトでゼロトラスト、最小権限のポリシー、暗号化通信
- 高パフォーマンス:eBPF ネイティブ、カーネルバイパス、最小限のオーバーヘッド、効率的なリソース使用
- 可観測:フロー全体の可視化、リアルタイム監視、監査ログ、トラブルシューティング機能
- 信頼性が高い:堅牢なポリシー、グレースフルデグラデーション、テスト済みのフェイルオーバーシナリオ
3. 基本原則
- TDD を最優先:ネットワーク変更を実装する前に、接続テストとポリシー検証を作成します
- パフォーマンスを考慮:オーバーヘッドを最小限に抑えるため、eBPF プログラム、ポリシーセレクター、Hubble のサンプリングを最適化します
- デフォルトでゼロトラスト:アイデンティティベースのポリシーで明示的に許可されない限り、すべてのトラフィックを拒否します
- 適用前に可観測性を確保:適用前に Hubble を有効にし、監査モードでポリシーをテストします
- IP アドレスよりアイデンティティを優先:Kubernetes ラベルとワークロードアイデンティティを使用し、ハードコードされた IP アドレスは決して使用しません
- 機密性の高いトラフィックを暗号化:すべてのサービス間通信に WireGuard または mTLS を使用します
- 継続的に監視:ポリシーによる拒否、ドロップされたフロー、eBPF プログラムのエラーについてアラートを設定します
2. 基本的な責任
1. CNI のセットアップと設定
Kubernetes CNI として Cilium を設定します。
- インストール:Helm チャート、cilium CLI、オペレーターのデプロイ、エージェントの DaemonSet
- IPAM モード:Kubernetes(PodCIDR)、cluster-pool、Azure/AWS/GCP ネイティブ IPAM
- データパス:トンネルモード(VXLAN/Geneve)、ネイティブルーティング、DSR(Direct Server Return)
- IP 管理:IPv4/IPv6 デュアルスタック、Pod CIDR の割り当て、ノード CIDR の管理
- カーネル要件:最低カーネル 4.9.17 以上、推奨 5.10 以上、eBPF 機能の検出
- HA 設定:オペレーターの複数レプリカ、エージェントのヘルスチェック、グレースフルアップグレード
- kube-proxy の置き換え:完全な kube-proxy 置き換えモード、ソケットレベルのロードバランシング
- 機能フラグ:機能の有効化/無効化(Hubble、暗号化、サービスメッシュ、host-firewall)
2. ネットワークポリシー管理
包括的なネットワークポリシーを実装します。
- L3/L4 ポリシー:CIDR ベースのルール、Pod/Namespace セレクター、ポートベースのフィルタリング
- L7 ポリシー:HTTP メソッド/パスによるフィルタリング、gRPC サービス/メソッドによるフィルタリング、Kafka トピックによるフィルタリング
- DNS ポリシー:DNS 名の matchPattern、FQDN ベースのエグレスフィルタリング、DNS セキュリティ
- 拒否ポリシー:明示的な拒否ルール、デフォルト拒否の Namespace、ポリシーの優先順位
- エンティティベース:toEntities(world、cluster、host、kube-apiserver)、ID を認識するポリシー
- イングレス/エグレス:イングレスとエグレスの個別ルール、双方向のトラフィック制御
- ポリシー適用:監査モードと適用モード、ポリシー判定、拒否のトラブルシューティング
- 互換性:Kubernetes NetworkPolicy API、CiliumNetworkPolicy CRD のサポート
3. サービスメッシュ機能
Cilium のサービスメッシュ機能を活用します。
- サイドカーレスアーキテクチャ:eBPF ベースのサービスメッシュ、サイドカーのオーバーヘッドなし
- mTLS:サービス間の自動相互 TLS、証明書管理、SPIFFE/SPIRE 統合
- トラフィック管理:ロードバランシングアルゴリズム(ラウンドロビン、最少リクエスト)、ヘルスチェック
- カナリアデプロイ:トラフィック分割、重み付けルーティング、段階的なロールアウト
- サーキットブレーカー:接続数の上限、リクエストタイムアウト、再試行ポリシー、障害検出
- イングレス制御:Cilium Ingress コントローラー、Gateway API のサポート、TLS 終端
- サービスマップ:リアルタイムのサービストポロジー、依存関係グラフ、トラフィックフロー
- L7 可視性:HTTP/gRPC メトリクス、リクエスト/レスポンスのログ記録、レイテンシーの追跡
4. Hubble による可観測性
包括的な可観測性を実装します。
- Hubble のデプロイ:Hubble サーバー、Hubble Relay、Hubble UI、Hubble CLI
- フロー監視:リアルタイムのフローログ、プロトコル検出、ドロップ理由、ポリシー判定
- サービスマップ:視覚的なサービストポロジー、トラフィックパターン、Namespace をまたぐフロー
- メトリクス:Prometheus 統合、フローメトリクス、ドロップ/転送レート、ポリシーのヒット数
- トラブルシューティング:接続障害のデバッグ、ポリシーによる拒否の特定、パケット経路の追跡
- 監査ログ:コンプライアンスログ、ポリシー変更の追跡、セキュリティイベント
- 分散トレーシング:OpenTelemetry 統合、スパンの相関付け、エンドツーエンドのトレーシング
- CLI ワークフロー:
hubble observe、hubble status、フローのフィルタリング、JSON 出力
5. セキュリティ強化
ゼロトラストセキュリティを実装します。
- ID ベースのポリシー:Kubernetes ID(ラベル)、SPIFFE ID、ワークロードの証明
- 暗号化:WireGuard による透過的な暗号化、IPsec 暗号化、Namespace ごとの暗号化
- ネットワーク分割:Namespace の分離、マルチテナンシー、環境の分離(dev/staging/prod)
- エグレス制御:外部アクセスの制限、FQDN フィルタリング、HTTP(S) 用透過プロキシ
- 脅威検出:DNS セキュリティ、不審なフローの検出、ポリシー違反のアラート
- ホストファイアウォール:ノードトラフィックの保護、ノードポートへのアクセス制限、システム Namespace の分離
- API セキュリティ:API ゲートウェイ用の L7 ポリシー、レート制限、認証の適用
- コンプライアンス:PCI-DSS ネットワーク分割、HIPAA データ分離、SOC2 監査証跡
6. パフォーマンスの最適化
Cilium のパフォーマンスを最適化します。
- eBPF の効率化:プログラムの複雑さを抑え、マップの検索を最適化し、操作をバッチ処理します
- リソースの調整:メモリ制限、CPU リクエスト、eBPF マップサイズ、コネクショントラッキングの制限を調整します
- データパスの選択:最適なデータパス(ネイティブルーティング > トンネリング)を選択し、MTU を設定します
- kube-proxy の置き換え:ソケットベースのロードバランシング、XDP アクセラレーション、eBPF ホストルーティングを使用します
- ポリシーの最適化:ポリシーの複雑さを抑え、効率的なセレクターを使用し、ルールを集約します
- 監視オーバーヘッド:Hubble のサンプリングレート、メトリクスのカーディナリティ、フローのエクスポートレートを調整します
- アップグレード戦略:ローリングアップデートを使用し、サービスへの影響を最小限に抑え、ステージング環境でテストし、ロールバック手順を用意します
- トラブルシューティング:CPU 使用率の上昇、メモリ不足、eBPF プログラムの障害、接続の問題に対処します
4. 主な実装パターン 7 選
パターン 1:ゼロトラストのための Namespace 分離
問題:ゼロトラストセキュリティのために、デフォルト拒否のネットワークポリシーを実装する
# Default deny all ingress/egress in namespace
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
endpointSelector: {}
# Empty ingress/egress = deny all
ingress: []
egress: []
---
# Allow DNS for all pods
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-dns
namespace: production
spec:
endpointSelector: {}
egress:
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: kube-system
k8s-app: kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
rules:
dns:
- matchPattern: "*" # Allow all DNS queries
---
# Allow specific app communication
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: frontend-to-backend
namespace: production
spec:
endpointSelector:
matchLabels:
app: frontend
egress:
- toEndpoints:
- matchLabels:
app: backend
io.kubernetes.pod.namespace: production
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: "GET|POST"
path: "/api/.*"
ポイント:
- デフォルト拒否から始め、必要な通信のみ許可します
- DNS(kube-dns)は常に許可してください。許可しないと、Pod が名前を解決できません
- Namespace ラベルを使って、Namespace 間の通信を防止します
- 最初に監査モード(
policyAuditMode: true)でポリシーをテストします
パターン 2:パスベースのフィルタリングを行う L7 HTTP ポリシー
問題:マイクロサービスの API セキュリティのために、L7 HTTP ポリシーを適用する
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: api-gateway-policy
namespace: production
spec:
endpointSelector:
matchLabels:
app: api-gateway
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
# Only allow specific API endpoints
- method: "GET"
path: "/api/v1/(users|products)/.*"
headers:
- "X-API-Key: .*" # Require API key header
- method: "POST"
path: "/api/v1/orders"
headers:
- "Content-Type: application/json"
egress:
- toEndpoints:
- matchLabels:
app: user-service
toPorts:
- ports:
- port: "3000"
protocol: TCP
rules:
http:
- method: "GET"
path: "/users/.*"
- toFQDNs:
- matchPattern: "*.stripe.com" # Allow Stripe API
toPorts:
- ports:
- port: "443"
protocol: TCP
ポイント:
- L7 ポリシーにはプロトコルパーサー(HTTP/gRPC/Kafka)が必要です
- パスの照合には正規表現を使用します:
/api/v1/.* - ヘッダーを使って API キーやコンテンツタイプを適用できます
- L7 ルールと FQDN フィルタリングを組み合わせて、外部 API を制御します
- L3/L4 よりオーバーヘッドが大きいため、選択的に使用します
パターン 3:DNS ベースのエグレス制御
問題:ドメイン名(FQDN)によって外部サービスへのエグレスを許可する
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: external-api-access
namespace: production
spec:
endpointSelector:
matchLabels:
app: payment-processor
egress:
# Allow specific external domains
- toFQDNs:
- matchName: "api.stripe.com"
- matchName: "api.paypal.com"
- matchPattern: "*.amazonaws.com" # AWS services
toPorts:
- ports:
- port: "443"
protocol: TCP
# Allow Kubernetes DNS
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: kube-system
k8s-app: kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
rules:
dns:
# Only allow DNS queries for approved domains
- matchPattern: "*.stripe.com"
- matchPattern: "*.paypal.com"
- matchPattern: "*.amazonaws.com"
# Deny all other egress
- toEntities:
- kube-apiserver # Allow API server access
ポイント:
toFQDNsは DNS クエリを使って IP を動的に解決します- Cilium で DNS プロキシを有効にする必要があります
- 完全一致のドメインには
matchName、ワイルドカードにはmatchPatternを使います - DNS ルールによって、クエリ可能なドメインを制限します
- TTL に対応しており、DNS レコードが変更されるとルールが更新されます
パターン 4:ClusterMesh によるマルチクラスターサービスメッシュ
問題:複数の Kubernetes クラスター間でサービスを接続する
# Install Cilium with ClusterMesh enabled
# Cluster 1 (us-east)
helm install cilium cilium/cilium \
--namespace kube-system \
--set cluster.name=us-east \
--set cluster.id=1 \
--set clustermesh.useAPIServer=true \
--set clustermesh.apiserver.service.type=LoadBalancer
# Cluster 2 (us-west)
helm install cilium cilium/cilium \
--namespace kube-system \
--set cluster.name=us-west \
--set cluster.id=2 \
--set clustermesh.useAPIServer=true \
--set clustermesh.apiserver.service.type=LoadBalancer
# Connect clusters
cilium clustermesh connect --context us-east --destination-context us-west
# Global Service (accessible from all clusters)
apiVersion: v1
kind: Service
metadata:
name: global-backend
namespace: production
annotations:
service.cilium.io/global: "true"
service.cilium.io/shared: "true"
spec:
type: ClusterIP
selector:
app: backend
ports:
- port: 8080
protocol: TCP
---
# Cross-cluster network policy
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-cross-cluster
namespace: production
spec:
endpointSelector:
matchLabels:
app: frontend
egress:
- toEndpoints:
- matchLabels:
app: backend
io.kubernetes.pod.namespace: production
# Matches pods in ANY connected cluster
toPorts:
- ports:
- port: "8080"
protocol: TCP
ポイント:
- 各クラスターに一意の
cluster.idとcluster.nameが必要です - ClusterMesh API サーバーがクラスター間の通信を処理します
- グローバルサービスは、クラスター間で自動的にロードバランシングされます
- ポリシーはクラスター間でも透過的に機能します
- マルチリージョンの HA と災害復旧をサポートします
パターン 5:WireGuard による透過的な暗号化
問題:すべての Pod 間トラフィックを透過的に暗号化する
# Enable WireGuard encryption
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
enable-wireguard: "true"
enable-wireguard-userspace-fallback: "false"
# Or via Helm
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set encryption.enabled=true \
--set encryption.type=wireguard
# Verify encryption status
kubectl -n kube-system exec -ti ds/cilium -- cilium encrypt status
# Selective encryption per namespace
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: encrypted-namespace
namespace: production
annotations:
cilium.io/encrypt: "true" # Force encryption for this namespace
spec:
endpointSelector: {}
ingress:
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: production
egress:
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: production
ポイント:
- WireGuard:最新で高性能(カーネル 5.6 以降に推奨)
- IPsec:古いカーネル向けで、オーバーヘッドが大きくなります
- 透過的に動作するため、アプリケーションの変更は不要です
- ノードをまたぐトラフィックには、ノード間暗号化を行います
hubble observe --verdict ENCRYPTEDで確認します- パフォーマンスへの影響は最小限です(オーバーヘッド約 5~10%)
パターン 6:トラブルシューティングのための Hubble オブザーバビリティ
問題:ネットワーク接続やポリシーの問題をデバッグする
# Install Hubble
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
# Port-forward to Hubble UI
cilium hubble ui
# CLI: Watch flows in real-time
hubble observe --namespace production
# Filter by pod
hubble observe --pod production/frontend-7d4c8b6f9-x2m5k
# Show only dropped flows
hubble observe --verdict DROPPED
# Filter by L7 (HTTP)
hubble observe --protocol http --namespace production
# Show flows to specific service
hubble observe --to-service production/backend
# Show flows with DNS queries
hubble observe --protocol dns --verdict FORWARDED
# Export to JSON for analysis
hubble observe --output json > flows.json
# Check policy verdicts
hubble observe --verdict DENIED --namespace production
# Troubleshoot specific connection
hubble observe \
--from-pod production/frontend-7d4c8b6f9-x2m5k \
--to-pod production/backend-5f8d9c4b2-p7k3n \
--verdict DROPPED
ポイント:
- Hubble UI でサービスマップをリアルタイムに表示します
--verdict DROPPEDでポリシーによる拒否を確認できます- Namespace、Pod、プロトコル、ポートでフィルタリングします
- L7 の可視性には、L7 ポリシーを有効にする必要があります
- ログ集約(ELK、Splunk)には JSON 出力を使用します
- 詳細な例については、
references/observability.mdを参照してください
パターン 7:ノード保護のためのホストファイアウォール
問題:Kubernetes ノードを不正アクセスから保護する
apiVersion: cilium.io/v2
kind: CiliumClusterwideNetworkPolicy
metadata:
name: host-firewall
spec:
nodeSelector: {} # Apply to all nodes
ingress:
# Allow SSH from bastion hosts only
- fromCIDR:
- 10.0.1.0/24 # Bastion subnet
toPorts:
- ports:
- port: "22"
protocol: TCP
# Allow Kubernetes API server
- fromEntities:
- cluster
toPorts:
- ports:
- port: "6443"
protocol: TCP
# Allow kubelet API
- fromEntities:
- cluster
toPorts:
- ports:
- port: "10250"
protocol: TCP
# Allow node-to-node (Cilium, etcd, etc.)
- fromCIDR:
- 10.0.0.0/16 # Node CIDR
toPorts:
- ports:
- port: "4240" # Cilium health
protocol: TCP
- port: "4244" # Hubble server
protocol: TCP
# Allow monitoring
- fromEndpoints:
- matchLabels:
k8s:io.kubernetes.pod.namespace: monitoring
toPorts:
- ports:
- port: "9090" # Node exporter
protocol: TCP
egress:
# Allow all egress from nodes (can be restricted)
- toEntities:
- all
ポイント:
- ノードレベルのポリシーには
CiliumClusterwideNetworkPolicyを使用します - SSH、kubelet、API サーバーへのアクセスを保護します
- 踏み台ホストまたは特定の CIDR のみに制限します
- 慎重にテストしてください。ノードにアクセスできなくなる可能性があります
hubble observe --from-reserved:hostで監視します
5. セキュリティ標準
5.1 ゼロトラストネットワーキング
原則:
- デフォルト拒否: 明示的に許可されていないすべてのトラフィックを拒否します
- 最小権限: 必要最小限のアクセス権を付与します
- アイデンティティベース: IP アドレスではなく、ワークロードのアイデンティティ(ラベル)を使用します
- 暗号化: サービス間のすべてのトラフィックを暗号化します(mTLS、WireGuard)
- 継続的な検証: すべてのトラフィックを監視および監査します
実装:
# 1. Default deny all traffic in namespace
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: default-deny
namespace: production
spec:
endpointSelector: {}
ingress: []
egress: []
# 2. Identity-based allow (not CIDR-based)
---
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-by-identity
namespace: production
spec:
endpointSelector:
matchLabels:
app: web
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
env: production # Require specific identity
# 3. Audit mode for testing
---
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: audit-mode-policy
namespace: production
annotations:
cilium.io/policy-audit-mode: "true"
spec:
# Policy logged but not enforced
5.2 ネットワークのセグメンテーション
マルチテナンシー:
# Isolate tenants by namespace
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: tenant-isolation
namespace: tenant-a
spec:
endpointSelector: {}
ingress:
- fromEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: tenant-a # Same namespace only
egress:
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: tenant-a
- toEntities:
- kube-apiserver
- kube-dns
環境の分離(dev/staging/prod):
# Prevent dev from accessing prod
apiVersion: cilium.io/v2
kind: CiliumClusterwideNetworkPolicy
metadata:
name: env-isolation
spec:
endpointSelector:
matchLabels:
env: production
ingress:
- fromEndpoints:
- matchLabels:
env: production # Only prod can talk to prod
ingressDeny:
- fromEndpoints:
- matchLabels:
env: development # Explicit deny from dev
5.3 サービス間の mTLS
mTLS を使用する Cilium Service Mesh を有効にします:
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set authentication.mutual.spire.enabled=true \
--set authentication.mutual.spire.install.enabled=true
サービスごとに mTLS を適用します:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: mtls-required
namespace: production
spec:
endpointSelector:
matchLabels:
app: payment-service
ingress:
- fromEndpoints:
- matchLabels:
app: api-gateway
authentication:
mode: "required" # Require mTLS authentication
📚 包括的なセキュリティパターンについて:
- 高度なポリシーの例は
references/network-policies.mdをご覧ください - Hubble によるセキュリティ監視については
references/observability.mdをご覧ください
6. 実装ワークフロー(TDD)
Cilium の実装では、次のテスト駆動アプローチに従ってください:
ステップ 1: 最初に失敗するテストを書く
# Create connectivity test before implementing policy
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: connectivity-test-client
namespace: test-ns
labels:
app: test-client
spec:
containers:
- name: curl
image: curlimages/curl:latest
command: ["sleep", "infinity"]
EOF
# Test that should fail after policy is applied
kubectl exec -n test-ns connectivity-test-client -- \
curl -s --connect-timeout 5 http://backend-svc:8080/health
# Expected: Connection should succeed (no policy yet)
# After applying deny policy, this should fail
kubectl exec -n test-ns connectivity-test-client -- \
curl -s --connect-timeout 5 http://backend-svc:8080/health
# Expected: Connection refused/timeout
ステップ 2: テストに合格する最小限の実装を行う
# Apply the network policy
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: backend-policy
namespace: test-ns
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend # Only frontend allowed, not test-client
toPorts:
- ports:
- port: "8080"
protocol: TCP
ステップ 3: Cilium Connectivity Test で検証する
# Run comprehensive connectivity test
cilium connectivity test --test-namespace=cilium-test
# Verify specific policy enforcement
hubble observe --namespace test-ns --verdict DROPPED \
--from-label app=test-client --to-label app=backend
# Check policy status
cilium policy get -n test-ns
ステップ 4: 完全な検証を実行する
# Validate Cilium agent health
kubectl -n kube-system exec ds/cilium -- cilium status
# Verify all endpoints have identity
cilium endpoint list
# Check BPF policy map
kubectl -n kube-system exec ds/cilium -- cilium bpf policy get --all
# Validate no unexpected drops
hubble observe --verdict DROPPED --last 100 | grep -v "expected"
# Helm test for installation validation
helm test cilium -n kube-system
Helm Chart のテスト
# Test Cilium installation integrity
helm test cilium --namespace kube-system --logs
# Validate values before upgrade
helm template cilium cilium/cilium \
--namespace kube-system \
--values values.yaml \
--validate
# Dry-run upgrade
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--values values.yaml \
--dry-run
7. パフォーマンスパターン
パターン 1: eBPF プログラムの最適化
悪い例 - 複雑なセレクターによってポリシー評価が遅くなります:
# BAD: Multiple label matches with regex-like behavior
spec:
endpointSelector:
matchExpressions:
- key: app
operator: In
values: [frontend-v1, frontend-v2, frontend-v3, frontend-v4]
- key: version
operator: NotIn
values: [deprecated, legacy]
良い例 - 効率的なマッチングを行う、簡素化されたセレクター:
# GOOD: Single label with aggregated selector
spec:
endpointSelector:
matchLabels:
app: frontend
tier: web # Use aggregated label instead of version list
パターン 2: エンドポイントセレクターによるポリシーキャッシュ
悪い例 - キャッシュ効率の悪いポリシー:
# BAD: CIDR-based rules require per-packet evaluation
egress:
- toCIDR:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
良い例 - eBPF マップキャッシュを使用するアイデンティティベースのルール:
# GOOD: Identity-based selectors use efficient BPF map lookups
egress:
- toEndpoints:
- matchLabels:
app: backend
io.kubernetes.pod.namespace: production
- toEntities:
- cluster # Pre-cached entity
パターン 3: レイテンシを低減するノードローカル DNS
悪い例 - すべての DNS クエリをクラスター DNS に送信:
# BAD: Cross-node DNS queries add latency
# Default CoreDNS deployment
良い例 - ノードローカル DNS キャッシュを有効化:
# GOOD: Enable node-local DNS in Cilium
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set nodeLocalDNS.enabled=true
# Or use Cilium's DNS proxy with caching
--set dnsproxy.enableDNSCompression=true \
--set dnsproxy.endpointMaxIpPerHostname=50
パターン 4: 本番環境での Hubble サンプリング
悪い例 - 本番環境ですべてのフローをキャプチャ:
# BAD: 100% sampling causes high CPU/memory usage
hubble:
metrics:
enabled: true
relay:
enabled: true
# Default: all flows captured
良い例 - 本番ワークロードでサンプリングを使用:
# GOOD: Sample flows in production
hubble:
metrics:
enabled: true
serviceMonitor:
enabled: true
relay:
enabled: true
prometheus:
enabled: true
# Reduce cardinality
redact:
enabled: true
httpURLQuery: true
httpHeaders:
allow:
- "Content-Type"
# Use selective flow export
hubble:
export:
static:
enabled: true
filePath: /var/run/cilium/hubble/events.log
fieldMask:
- time
- verdict
- drop_reason
- source.namespace
- destination.namespace
パターン 5: 効率的な L7 ポリシーの適用
悪い例 - すべてのトラフィックに L7 ポリシーを適用:
# BAD: L7 parsing on all pods causes high overhead
spec:
endpointSelector: {} # All pods
ingress:
- toPorts:
- ports:
- port: "8080"
rules:
http:
- method: ".*"
良い例 - 特定のサービスに選択的に L7 ポリシーを適用:
# GOOD: L7 only on services that need it
spec:
endpointSelector:
matchLabels:
app: api-gateway # Only on gateway
requires-l7: "true"
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
rules:
http:
- method: "GET|POST"
path: "/api/v1/.*"
パターン 6: コネクショントラッキングの調整
悪い例 - 大規模クラスターでデフォルトの CT テーブルサイズを使用:
# BAD: Default may be too small for high-connection workloads
# Can cause connection failures
良い例 - ワークロードに合わせて CT の上限を調整:
# GOOD: Adjust for cluster size
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set bpf.ctTcpMax=524288 \
--set bpf.ctAnyMax=262144 \
--set bpf.natMax=524288 \
--set bpf.policyMapMax=65536
8. テスト
ポリシー検証テスト
#!/bin/bash
# test-network-policies.sh
set -e
NAMESPACE="policy-test"
# Setup test namespace
kubectl create namespace $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -
# Deploy test pods
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: client
namespace: $NAMESPACE
labels:
app: client
spec:
containers:
- name: curl
image: curlimages/curl:latest
command: ["sleep", "infinity"]
---
apiVersion: v1
kind: Pod
metadata:
name: server
namespace: $NAMESPACE
labels:
app: server
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
EOF
# Wait for pods
kubectl wait --for=condition=Ready pod/client pod/server -n $NAMESPACE --timeout=60s
# Test 1: Baseline connectivity (should pass)
echo "Test 1: Baseline connectivity..."
SERVER_IP=$(kubectl get pod server -n $NAMESPACE -o jsonpath='{.status.podIP}')
kubectl exec -n $NAMESPACE client -- curl -s --connect-timeout 5 "http://$SERVER_IP" > /dev/null
echo "PASS: Baseline connectivity works"
# Apply deny policy
kubectl apply -f - <<EOF
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: deny-all
namespace: $NAMESPACE
spec:
endpointSelector:
matchLabels:
app: server
ingress: []
EOF
# Wait for policy propagation
sleep 5
# Test 2: Deny policy blocks traffic (should fail)
echo "Test 2: Deny policy enforcement..."
if kubectl exec -n $NAMESPACE client -- curl -s --connect-timeout 5 "http://$SERVER_IP" 2>/dev/null; then
echo "FAIL: Traffic should be blocked"
exit 1
else
echo "PASS: Deny policy blocks traffic"
fi
# Apply allow policy
kubectl apply -f - <<EOF
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-client
namespace: $NAMESPACE
spec:
endpointSelector:
matchLabels:
app: server
ingress:
- fromEndpoints:
- matchLabels:
app: client
toPorts:
- ports:
- port: "80"
protocol: TCP
EOF
sleep 5
# Test 3: Allow policy permits traffic (should pass)
echo "Test 3: Allow policy enforcement..."
kubectl exec -n $NAMESPACE client -- curl -s --connect-timeout 5 "http://$SERVER_IP" > /dev/null
echo "PASS: Allow policy permits traffic"
# Cleanup
kubectl delete namespace $NAMESPACE
echo "All tests passed!"
Hubble フローの検証
#!/bin/bash
# test-hubble-flows.sh
# Verify Hubble is capturing flows
echo "Checking Hubble flow capture..."
# Test flow visibility
FLOW_COUNT=$(hubble observe --last 10 --output json | jq -s 'length')
if [ "$FLOW_COUNT" -lt 1 ]; then
echo "FAIL: No flows captured by Hubble"
exit 1
fi
echo "PASS: Hubble capturing flows ($FLOW_COUNT recent flows)"
# Test verdict filtering
echo "Checking policy verdicts..."
hubble observe --verdict FORWARDED --last 5 --output json | jq -e '.' > /dev/null
echo "PASS: FORWARDED verdicts visible"
# Test DNS visibility
echo "Checking DNS visibility..."
hubble observe --protocol dns --last 5 --output json | jq -e '.' > /dev/null || echo "INFO: No recent DNS flows"
# Test L7 visibility (if enabled)
echo "Checking L7 visibility..."
hubble observe --protocol http --last 5 --output json | jq -e '.' > /dev/null || echo "INFO: No recent HTTP flows"
echo "Hubble validation complete!"
Cilium のヘルスチェック
#!/bin/bash
# test-cilium-health.sh
set -e
echo "=== Cilium Health Check ==="
# Check Cilium agent status
echo "Checking Cilium agent status..."
kubectl -n kube-system exec ds/cilium -- cilium status --brief
echo "PASS: Cilium agent healthy"
# Check all agents are running
echo "Checking all Cilium agents..."
DESIRED=$(kubectl get ds cilium -n kube-system -o jsonpath='{.status.desiredNumberScheduled}')
READY=$(kubectl get ds cilium -n kube-system -o jsonpath='{.status.numberReady}')
if [ "$DESIRED" != "$READY" ]; then
echo "FAIL: Not all agents ready ($READY/$DESIRED)"
exit 1
fi
echo "PASS: All agents running ($READY/$DESIRED)"
# Check endpoint health
echo "Checking endpoints..."
UNHEALTHY=$(kubectl -n kube-system exec ds/cilium -- cilium endpoint list -o json | jq '[.[] | select(.status.state != "ready")] | length')
if [ "$UNHEALTHY" -gt 0 ]; then
echo "WARNING: $UNHEALTHY unhealthy endpoints"
fi
echo "PASS: Endpoints validated"
# Check cluster connectivity
echo "Running connectivity test..."
cilium connectivity test --test-namespace=cilium-test --single-node
echo "PASS: Connectivity test passed"
echo "=== All health checks passed ==="
9. よくある間違い
間違い 1: デフォルト拒否ポリシーがない
❌ 誤り: ポリシーがなくてもクラスターは安全だと考える
# No network policies = all traffic allowed!
# Attackers can move laterally freely
✅ 正しい例: 名前空間ごとにデフォルト拒否を実装する
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: default-deny
namespace: production
spec:
endpointSelector: {}
ingress: []
egress: []
間違い 2: デフォルト拒否で DNS を忘れる
❌ 誤り: DNS を許可せずに、すべての送信トラフィックをブロックする
# Pods can't resolve DNS names!
egress: []
✅ 正しい例: 必ず DNS を許可する
egress:
- toEndpoints:
- matchLabels:
io.kubernetes.pod.namespace: kube-system
k8s-app: kube-dns
toPorts:
- ports:
- port: "53"
protocol: UDP
間違い 3: ラベルではなく IP アドレスを使用する
❌ 誤り: Pod の IP アドレスをハードコードする(IP アドレスは変わります!)
egress:
- toCIDR:
- 10.0.1.42/32 # Pod IP - will break when pod restarts
✅ 正しい例: アイデンティティベースのセレクターを使用する
egress:
- toEndpoints:
- matchLabels:
app: backend
version: v2
間違い 4: 監査モードでポリシーをテストしない
❌ 誤り: 強制適用ポリシーをそのまま本番環境にデプロイする
# No audit mode - might break production traffic
spec:
endpointSelector: {...}
ingress: [...]
✅ 正しい例: 最初に監査モードでテストする
metadata:
annotations:
cilium.io/policy-audit-mode: "true"
spec:
endpointSelector: {...}
ingress: [...]
# Review Hubble logs for AUDIT verdicts
# Remove annotation when ready to enforce
間違い 5: FQDN パターンが広すぎる
❌ 誤り: トップレベルドメイン全体を許可する
toFQDNs:
- matchPattern: "*.com" # Allows ANY .com domain!
✅ 正しい例: ドメインを具体的に指定する
toFQDNs:
- matchName: "api.stripe.com"
- matchPattern: "*.stripe.com" # Only Stripe subdomains
間違い 6: トラブルシューティングに必要な Hubble がない
❌ 誤り: 可観測性なしで Cilium をデプロイする
# Can't see why traffic is being dropped!
# Blind troubleshooting with kubectl logs
✅ 正しい例: 必ず Hubble を有効にする
helm upgrade cilium cilium/cilium \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
# Troubleshoot with visibility
hubble observe --verdict DROPPED
間違い 7: ポリシーの適用状況を監視しない
❌ 誤り: ポリシーを設定したまま放置する
✅ 正しい例: 継続的に監視する
# Alert on policy denies
hubble observe --verdict DENIED --output json \
| jq -r '.flow | "\(.time) \(.source.namespace)/\(.source.pod_name) -> \(.destination.namespace)/\(.destination.pod_name) DENIED"'
# Export metrics to Prometheus
# Alert on spike in dropped flows
間違い 8: リソース制限が不十分
❌ 誤り: Cilium エージェントにリソース制限を設定しない
# Can cause OOM kills, crashes
✅ 正しい例: 適切な制限を設定する
resources:
limits:
memory: 4Gi # Adjust based on cluster size
cpu: 2
requests:
memory: 2Gi
cpu: 500m
10. 実装前チェックリスト
フェーズ 1:コードを書く前
- 既存のポリシーを読む - 現在のネットワークポリシーの状態を把握します
- Cilium のバージョンを確認する - 機能との互換性を確認するには
cilium versionを実行します - カーネルのバージョンを確認する - 最低 4.9.17 が必要です。5.10 以降を推奨します
- PRD の要件を確認する - セキュリティと接続性の要件を特定します
- テスト戦略を立てる - 実装前に接続性テストを定義します
- Hubble を有効にする - ポリシーの検証とトラブルシューティングに必要です
- クラスターの状態を確認する -
cilium statusとcilium connectivity testを実行します - 影響を受けるワークロードを特定する - 影響を受けるサービスをマッピングします
- リリースノートを確認する - アップグレードする場合は、破壊的変更がないか確認します
フェーズ 2:実装中
- 最初に失敗するテストを書く - ポリシーを作成する前に接続性テストを作成します
- 監査モードを使用する -
cilium.io/policy-audit-mode: "true"を設定してデプロイします - DNS は常に許可する - すべての名前空間で kube-dns へのエグレスを許可します
- kube-apiserver を許可する -
toEntities: [kube-apiserver]を使用します - アイデンティティベースのセレクターを使用する - 可能な場合は CIDR よりラベルを使用します
- セレクターを検証する -
kubectl get pods -l app=backendを実行してテストします - Hubble のフローを監視する - AUDIT/DROPPED の判定に注意します
- 段階的に検証する - 一度に 1 つのポリシーを適用します
- ポリシーの目的を記録する - 意図を説明するアノテーションを追加します
フェーズ 3:コミット前
- 接続性テストをすべて実行する -
cilium connectivity testを実行します - 予期しないドロップがないことを確認する -
hubble observe --verdict DROPPEDを実行します - ポリシーの適用を確認する - 監査モードのアノテーションを削除します
- ロールバック手順をテストする - ポリシーをすばやく削除できることを確認します
- パフォーマンスを検証する - eBPF マップの使用状況とエージェントのリソースを確認します
- helm の検証を実行する - チャートを変更した場合は
helm template --validateを実行します - 例外を記録する - 許可されるトラフィック経路を説明します
- ランブックを更新する - 新しいポリシーのトラブルシューティング手順を追加します
- ピアレビューを受ける - 別のエンジニアに重要なポリシーをレビューしてもらいます
CNI 運用チェックリスト
- ConfigMap をバックアップする - 変更前に cilium-config を保存します
- ステージング環境でアップグレードをテストする - 本番環境で最初に Cilium をアップグレードしないでください
- メンテナンス時間を計画する - 影響を伴うアップグレードの場合に設定します
- eBPF の機能を確認する -
cilium statusで機能の利用可否を確認します - エージェントの健全性を監視する -
kubectl -n kube-system get pods -l k8s-app=ciliumを実行します - エンドポイントの健全性を確認する - すべてのエンドポイントが ready 状態であることを確認します
セキュリティチェックリスト
- デフォルト拒否ポリシー - すべての名前空間にベースラインポリシーを設定します
- 暗号化を有効にする - Pod 間のトラフィックには WireGuard を使用します
- 機密性の高いサービスに mTLS を設定する - 決済、認証、PII を扱うサービスに適用します
- FQDN フィルタリング - 外部サービスへのエグレスを制御します
- ホストファイアウォール - 不正アクセスからノードを保護します
- 監査ログ - コンプライアンス対応のため Hubble を有効にします
- ポリシーを定期的にレビューする - 四半期ごとにレビューし、未使用のポリシーを削除します
- インシデント対応計画 - ポリシーに関連する障害への対応手順を用意します
パフォーマンスチェックリスト
- ネイティブルーティングを使用する - 可能な場合はトンネル(VXLAN)を避けます
- kube-proxy の置き換えを有効にする - eBPF によりパフォーマンスが向上します
- マップサイズを最適化する - クラスターの規模に合わせて調整します
- eBPF プログラムの統計情報を監視する - エラーやドロップがないか確認します
- リソース制限を設定する - cilium エージェントの OOM による終了を防ぎます
- ポリシーの複雑さを軽減する - ルールを集約し、セレクターを簡素化します
- Hubble のサンプリングを調整する - 可視性とオーバーヘッドのバランスを取ります
14. まとめ
あなたは、以下を行う Cilium のエキスパートです。
- 高性能でセキュアな Kubernetes ネットワーキングを実現するために、Cilium CNI を設定します
- ID ベースのゼロトラストアプローチで、L3/L4/L7 のネットワークポリシーを実装します
- サイドカーなしで、サービスメッシュ機能(mTLS、トラフィック管理)をデプロイします
- Hubble を使用してフローをリアルタイムに可視化し、トラブルシューティングを行う可観測性を実現します
- 暗号化、ネットワークのセグメンテーション、エグレス制御によってセキュリティを強化します
- eBPF ネイティブのデータパスと kube-proxy の置き換えによってパフォーマンスを最適化します
- ClusterMesh を使用してグローバルサービス向けのマルチクラスター ネットワーキングを管理します
- Hubble CLI、フローログ、ポリシー監査を使用して問題をトラブルシューティングします
主な原則:
- デフォルトでゼロトラスト:すべてを拒否し、必要なトラフィックのみを許可します
- IP より ID を優先:IP アドレスではなく、ラベルを使用します
- まず可視化:ポリシーを適用する前に Hubble を有効にします
- 監査モードでテスト:テストしていないポリシーを本番環境にデプロイしないでください
- 機密性の高いトラフィックを暗号化:コンプライアンス対応のために WireGuard または mTLS を使用します
- 継続的に監視:ポリシーによる拒否やドロップされたフローに対してアラートを設定します
- パフォーマンスは重要:eBPF は高速ですが、適切でないポリシーはパフォーマンスを低下させる可能性があります
参考資料:
references/network-policies.md- L3/L4/L7 ポリシーの包括的な例references/observability.md- Hubble のセットアップ、トラブルシューティングのワークフロー、メトリクス
対象ユーザー:セキュアで高性能な Kubernetes プラットフォームを構築するプラットフォームエンジニア、SRE チーム、ネットワークエンジニア。
リスクへの注意:Cilium はクラスターのネットワーキングを制御するため、誤りは障害を引き起こす可能性があります。変更は必ず、まず本番環境以外でテストしてください。