Skip to content
Published on

Kubernetes Network PolicyとService Mesh完全ガイド(Istio、Cilium、Calico比較)

Authors
  • Name
    Twitter
Kubernetes Network PolicyとService Meshアーキテクチャ

はじめに

Kubernetesクラスターにおけるクラスター内のPod間通信は、デフォルトで**すべて許可(allow-all)**の状態です。同じクラスター内であれば、どのPodからでも他のPodに自由にアクセスできるということです。小規模な開発環境ではそれほど問題になりませんが、本番環境で数十、数百のマイクロサービスが動作している場合、これは深刻なセキュリティ上の脅威となります。

攻撃者が1つのPodを侵害すると、クラスター内のすべてのサービスへの横方向移動(lateral movement)が可能になるためです。これを防ぐには、Network Policyによるネットワークセグメンテーションと、Service MeshによるmTLS暗号化およびゼロトラストアーキテクチャが不可欠です。

この記事では、Kubernetes Network Policyの基礎から応用までを扱い、Istio、Cilium、Calicoの3つのソリューションのService Meshアーキテクチャを比較分析します。実際の運用で遭遇するトラブルシューティング事例やパフォーマンスベンチマークも含めて、皆さんの環境に最適な選択ができるようガイドします。

Kubernetes Network Policyの基礎

Network Policyとは?

Network PolicyはKubernetesネイティブのリソースで、Podレベルでインバウンド(Ingress)とアウトバウンド(Egress)のトラフィックを制御するファイアウォールルールです。ラベルセレクターに基づいて動作し、Podが再起動したりノード間を移動しても一貫したポリシーが適用されます。

重要な前提条件:Network Policyリソースを作成しても、それを実装するCNIプラグイン(Calico、Cilium、Antreaなど)がなければ、ポリシーは一切適用されません。デフォルトのkubenetやFlannelはNetwork Policyをサポートしていません。

Default Denyポリシー

すべてのネットワークセキュリティの出発点はDefault Denyポリシーです。まずすべてのトラフィックを遮断し、必要な通信のみを明示的に許可するホワイトリスト方式を適用します。

# default-deny-all.yaml
# ネームスペース内のすべてのPodのIngress/Egressトラフィックを遮断
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {} # 空のセレクター = ネームスペース内のすべてのPod
  policyTypes:
    - Ingress
    - Egress

このポリシーが適用されると、productionネームスペースのすべてのPodはインバウンド/アウトバウンドのトラフィックが完全に遮断されます。DNS問い合わせも不可能になるため、必ずDNS許可ポリシーを併せて適用する必要があります。

# allow-dns.yaml
# kube-dns(CoreDNS)へのアクセスを許可するポリシー
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53

Pod間の特定通信の許可

Default Deny状態でフロントエンドがバックエンドAPIにアクセスできるようにする例です。

# allow-frontend-to-backend.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend-api
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 8080

このポリシーは、app: frontendラベルを持つPodからapp: backend-api PodのTCPポート8080へのインバウンドトラフィックのみを許可します。

Network Policy応用:Egress、CIDR、ポート制御

Egressポリシーによる外部アクセス制御

マイクロサービスが外部APIやデータベースにアクセスする場合、Egressポリシーで許可対象を細かく制限できます。

# egress-external-api-and-db.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-egress-policy
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend-api
  policyTypes:
    - Egress
  egress:
    # 1. 同じネームスペースのRedisへのアクセスを許可
    - to:
        - podSelector:
            matchLabels:
              app: redis
      ports:
        - protocol: TCP
          port: 6379
    # 2. 外部PostgreSQL RDSへのアクセス(CIDRベース)
    - to:
        - ipBlock:
            cidr: 10.100.0.0/16
      ports:
        - protocol: TCP
          port: 5432
    # 3. 外部HTTPS APIアクセスの許可
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0
            except:
              - 10.0.0.0/8
              - 172.16.0.0/12
              - 192.168.0.0/16
      ports:
        - protocol: TCP
          port: 443
    # 4. DNSの許可
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
      ports:
        - protocol: UDP
          port: 53

ネームスペース間通信の制御

マルチテナント環境ではネームスペース間の分離が必須です。特定のネームスペースからのみアクセスを許可するパターンです。

# cross-namespace-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-monitoring-access
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend-api
  policyTypes:
    - Ingress
  ingress:
    # monitoringネームスペースのPrometheusのみメトリクススクレイピングを許可
    - from:
        - namespaceSelector:
            matchLabels:
              team: monitoring
          podSelector:
            matchLabels:
              app: prometheus
      ports:
        - protocol: TCP
          port: 9090

Network Policyの限界

Kubernetes標準のNetwork PolicyはL3/L4レベル(IP、ポート、プロトコル)の制御のみ可能です。以下のような要件は基本的なNetwork Policyでは対応できません:

  • L7(HTTPパス、メソッド、ヘッダー)ベースのフィルタリング
  • mTLS暗号化およびサービス認証
  • トラフィックの可観測性(Observability)および分散トレーシング
  • 高度なトラフィック管理(カナリアデプロイ、サーキットブレーカー、リトライ)
  • FQDN(ドメイン)ベースのEgress制御

これらの高度な機能が必要な場合にService Meshが登場します。

Service Meshアーキテクチャ比較(Istio vs Cilium vs Calico)

3つの主要ソリューションのアーキテクチャと機能を比較します。

項目Istio(Ambient Mode)Cilium Service MeshCalico(Enterprise)
データプレーンztunnel(L4) + Waypoint Proxy(L7)eBPF(L3/L4) + ノード別Envoy(L7)iptables/eBPF + Envoy(L7)
サイドカー不要(Ambient Mode)不要選択的
mTLS自動(HBONEプロトコル)WireGuard/IPsecWireGuard手動設定
L7ポリシーAuthorizationPolicyCiliumNetworkPolicyGlobalNetworkPolicy
可観測性Kiali、Jaeger、PrometheusHubble(内蔵)Calico Enterprise UI
性能オーバーヘッド中(ztunnel経由)低(カーネルレベル)
CPU使用量普通30%少ない(L4基準)普通
QPSパフォーマンス高い(低接続時に優秀)高い(高接続時に優秀)普通
マルチクラスター対応(East-West Gateway)Cluster Mesh対応Federation対応
学習曲線高い中程度中程度
コミュニティ非常に大きい(CNCF Graduated)大きい(CNCF Graduated)大きい(Tigera主導)
Windowsノード非対応非対応対応
最適なユースケース大規模マルチクラスター、L7精密制御高性能L4、eBPFベースの可観測性ハイブリッド環境、エンタープライズ規制準拠

アーキテクチャ選択基準

  • 純粋なL3/L4ネットワークセキュリティのみ必要:Kubernetes標準Network Policy + Calico/Cilium CNI
  • L7トラフィック管理 + mTLSが核心:Istio Ambient Mode
  • 高性能 + カーネルレベルの可観測性:Cilium Service Mesh
  • エンタープライズ規制準拠 + ハイブリッド:Calico Enterprise

Istioベースのサービスメッシュ構築

Istio Ambient Modeのインストール

Istio 1.24からAmbient Modeが正式GAになりました。従来のサイドカー方式と比較してCPU/メモリオーバーヘッドを90%以上削減しながら、mTLSとL7トラフィック管理を提供します。

# istioctlのインストール
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.24.2 sh -
export PATH="$HOME/istio-1.24.2/bin:$PATH"

# Ambientプロファイルでインストール
istioctl install --set profile=ambient --skip-confirmation

# インストール確認
kubectl get pods -n istio-system
# NAME                                   READY   STATUS    RESTARTS   AGE
# istiod-7b69f4b6c-xxxxx                 1/1     Running   0          60s
# ztunnel-xxxxx                          1/1     Running   0          60s
# istio-cni-node-xxxxx                   1/1     Running   0          60s

# ネームスペースにAmbientモードを有効化
kubectl label namespace production istio.io/dataplane-mode=ambient

Waypoint Proxyのデプロイ(L7ポリシー用)

L4レベルのmTLSのみ必要であればztunnelだけで十分です。L7レベルの精密なトラフィック制御が必要な場合はWaypoint Proxyを追加デプロイします。

# Waypoint Proxyの作成
istioctl waypoint apply --namespace production --name backend-waypoint

# 特定サービスにWaypointを接続
kubectl label service backend-api \
  istio.io/use-waypoint=backend-waypoint \
  -n production

Istio AuthorizationPolicyの設定

IstioのL7ポリシーはAuthorizationPolicyを通じてHTTPメソッド、パス、ヘッダーレベルまで制御します。

# istio-auth-policy.yaml
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: backend-api-policy
  namespace: production
spec:
  targetRefs:
    - kind: Service
      group: ''
      name: backend-api
  action: ALLOW
  rules:
    - from:
        - source:
            principals:
              - 'cluster.local/ns/production/sa/frontend'
      to:
        - operation:
            methods: ['GET', 'POST']
            paths: ['/api/v1/*']
    - from:
        - source:
            principals:
              - 'cluster.local/ns/monitoring/sa/prometheus'
      to:
        - operation:
            methods: ['GET']
            paths: ['/metrics']

このポリシーは、frontendサービスアカウントから/api/v1/パスへのGET、POSTのみを許可し、Prometheusから/metricsパスへのGETのみを許可します。その他のすべてのリクエストは403 Forbiddenで拒否されます。

CiliumベースのeBPFサービスメッシュ

Ciliumのインストールとサービスメッシュの有効化

CiliumはeBPFを活用してカーネルレベルでネットワーキングを処理します。サイドカープロキシなしでL4トラフィックを処理し、L7処理が必要な場合にのみノード別の共有Envoyプロキシを使用します。

# Cilium CLIのインストール
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
GOOS=$(go env GOOS)
GOARCH=$(go env GOARCH)
curl -L --fail --remote-name-all \
  "https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-${GOOS}-${GOARCH}.tar.gz"
sudo tar xzvfC "cilium-${GOOS}-${GOARCH}.tar.gz" /usr/local/bin

# HelmでCiliumをインストール(Service Mesh + Hubble有効化)
helm repo add cilium https://helm.cilium.io/
helm repo update

helm install cilium cilium/cilium --version 1.17.0 \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set hubble.enabled=true \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set envoy.enabled=true \
  --set encryption.enabled=true \
  --set encryption.type=wireguard

# インストール確認
cilium status --wait
cilium connectivity test

CiliumNetworkPolicyによるL7ポリシーの適用

Ciliumは独自のCRDであるCiliumNetworkPolicyを通じて、HTTP、gRPC、KafkaなどのL7プロトコルレベルの精密なポリシーをサポートします。

# cilium-l7-policy.yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: backend-l7-policy
  namespace: production
spec:
  endpointSelector:
    matchLabels:
      app: backend-api
  ingress:
    - fromEndpoints:
        - matchLabels:
            app: frontend
      toPorts:
        - ports:
            - port: '8080'
              protocol: TCP
          rules:
            http:
              - method: 'GET'
                path: '/api/v1/products'
              - method: 'POST'
                path: '/api/v1/orders'
              - method: 'GET'
                path: '/healthz'
    - fromEndpoints:
        - matchLabels:
            app: prometheus
      toPorts:
        - ports:
            - port: '9090'
              protocol: TCP
          rules:
            http:
              - method: 'GET'
                path: '/metrics'

Hubbleを活用したネットワーク監視

CiliumのHubbleはeBPFベースですべてのネットワークフローをリアルタイムにモニタリングします。

# Hubble CLIインストール後に監視
hubble observe --namespace production --follow

# 特定Podのトラフィックのみフィルタリング
hubble observe --namespace production \
  --to-label app=backend-api \
  --verdict DROPPED

# HTTPリクエストの監視(L7)
hubble observe --namespace production \
  --protocol http \
  --http-status 5xx

# ネットワークフローの可視化(Hubble UI)
cilium hubble port-forward &
# ブラウザでhttp://localhost:12000にアクセス

Hubbleの出力例:

TIMESTAMP             SOURCE                  DESTINATION             TYPE      VERDICT   SUMMARY
Mar 14 10:23:01.123   production/frontend     production/backend-api  L7/HTTP   FORWARDED GET /api/v1/products => 200
Mar 14 10:23:01.456   production/attacker     production/backend-api  L7/HTTP   DROPPED   POST /api/v1/admin => Policy denied
Mar 14 10:23:02.789   production/backend-api  production/redis        L4/TCP    FORWARDED TCP 6379

mTLSとゼロトラストネットワーク

ゼロトラストとは?

ゼロトラスト(Zero Trust)は「何も信頼せず、すべてを検証する」というセキュリティモデルです。クラスター内部の通信も暗号化し、すべてのサービス間呼び出しでアイデンティティを検証します。Network Policyだけではトラフィックの暗号化ができないため、mTLS(mutual TLS)を提供するService Meshが必要です。

Istio Ambient ModeのmTLS

Istio Ambient Modeは**HBONE(HTTP-Based Overlay Network Environment)**プロトコルを使用して、すべてのトラフィックを自動的にmTLS暗号化します。ztunnelがノードレベルで証明書を管理し、各Podごとに固有のSPIFFEベースのワークロードIDを発行します。

# istio-peer-auth.yaml
# STRICTモード:mTLSでない平文トラフィックを拒否
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: strict-mtls
  namespace: production
spec:
  mtls:
    mode: STRICT

STRICTモードを設定すると、そのネームスペースのすべてのサービスはmTLS接続のみを受け付けます。メッシュに含まれていないサービスからの平文リクエストはすべて拒否されます。

CiliumのWireGuardベース暗号化

Ciliumはカーネル内蔵のWireGuardを使用してノード間トラフィックを自動暗号化します。IstioのmTLSとは異なりアプリケーションレベルではなくカーネルレベルで動作するため、パフォーマンスオーバーヘッドが少なくなります。

# WireGuard暗号化状態の確認
cilium encrypt status

# 出力例:
# Encryption:  Wireguard
# Keys in use: 2
# Errors:      0
# Interfaces:  cilium_wg0

# 暗号化キー一覧の確認
cilium encrypt get

WireGuardとmTLSの違い:

  • WireGuard:ノード間L3レベル暗号化、カーネルレベル処理、Pod個別IDなし
  • mTLS(Istio):サービス間L7レベル暗号化、SPIFFEベースのワークロードID、きめ細かな認可ポリシー

本番環境では、CiliumのWireGuardでノード間暗号化を適用し、さらにIstioのmTLSでワークロードレベルの認証まで実装する二重セキュリティ戦略を採用することもあります。

運用時の注意事項とトラブルシューティング

1. Network Policyの適用順序に注意

Network Policyは**和集合(additive)**方式で動作します。複数のポリシーが同一Podに適用される場合、許可ルールが合算されます。競合するポリシーがある場合、拒否ルールが優先されるのではなく、いずれか1つでも許可していればトラフィックが通過します。

# 特定Podに適用されているすべてのNetwork Policyの確認
kubectl get networkpolicy -n production -o wide

# Podラベルの確認(ポリシーセレクターのマッチング検証)
kubectl get pods -n production --show-labels

# Calicoを使用している場合のポリシーマッチング確認
calicoctl get networkpolicy -n production -o yaml

2. CNIプラグイン未インストール状態でのNetwork Policy無視

最もよくある間違いです。Network Policyリソースを作成しても、それを実装するCNIプラグインがなければポリシーは一切適用されません。

# CNIプラグインの確認
kubectl get pods -n kube-system | grep -E 'calico|cilium|antrea'

# Network Policyが実際に適用されているかの検証テスト
# 1. Default Denyの適用
kubectl apply -f default-deny-all.yaml

# 2. 通信テスト(遮断されるべき)
kubectl exec -n production deploy/frontend -- \
  curl -s --connect-timeout 3 http://backend-api:8080/healthz
# タイムアウトが発生すればポリシーが正しく適用されている

3. DNS解決の失敗

Default Denyポリシー適用後にDNS許可を設定し忘れると、すべてのサービスディスカバリーが中断されます。

# DNS問題の診断
kubectl exec -n production deploy/frontend -- nslookup backend-api
# ;; connection timed out; no servers could be reached

# CoreDNS Podの確認
kubectl get pods -n kube-system -l k8s-app=kube-dns

# DNSポリシー適用後に再テスト
kubectl apply -f allow-dns.yaml
kubectl exec -n production deploy/frontend -- nslookup backend-api
# Server:    10.96.0.10
# Name:      backend-api.production.svc.cluster.local

4. Istio ztunnel障害対応

ztunnelはノード別のDaemonSetとして実行され、障害時にそのノードのすべてのAmbient Meshトラフィックが中断されます。

# ztunnelの状態確認
kubectl get pods -n istio-system -l app=ztunnel

# ztunnelのログ確認(証明書問題の診断)
kubectl logs -n istio-system -l app=ztunnel --tail=50

# ztunnelの再起動
kubectl rollout restart daemonset/ztunnel -n istio-system

# IstiodとのxDS接続状態の確認
istioctl proxy-status

5. Cilium eBPFマップの容量超過

大規模クラスターではCiliumのeBPFマップのデフォルトサイズが不足する場合があります。

# eBPFマップの使用状況確認
cilium bpf ct list global | wc -l
cilium bpf policy get --all

# マップサイズの増加(Helm valuesの変更)
# bpf.ctGlobalTCPMax: 524288  (デフォルトより増加)
# bpf.ctGlobalAnyMax: 262144
# bpf.policyMapMax: 65536

# 変更の適用
helm upgrade cilium cilium/cilium \
  --namespace kube-system \
  --reuse-values \
  --set bpf.ctGlobalTCPMax=524288

障害事例とリカバリー手順

事例1:誤ったEgressポリシーによる全サービス障害

状況:運用チームがセキュリティ強化のためにDefault Deny Egressを適用しましたが、DNS許可ポリシーを設定し忘れ、すべてのサービス間通信が中断しました。

症状:すべてのPodからサービス名でのアクセスが失敗。IP直接指定では通信可能。

リカバリー手順

# 1. 即座に問題を確認
kubectl get networkpolicy -n production

# 2. DNS許可ポリシーの緊急適用
kubectl apply -f - <<'POLICY'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: emergency-allow-dns
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53
POLICY

# 3. サービス復旧の確認
kubectl exec -n production deploy/frontend -- nslookup backend-api

教訓:Default Denyポリシーは必ずDNS許可ポリシーと一緒に適用する必要があります。ポリシー変更前に必ずステージング環境でテストし、ロールバック計画を準備してください。

事例2:Istioアップグレード中のmTLS不一致

状況:Istioバージョンアップグレードの過程で、旧バージョンのサイドカーと新バージョンのztunnel間でmTLSハンドシェイクが失敗しました。

症状:一部のサービス間で503エラーおよび「upstream connect error」メッセージが発生。

リカバリー手順

# 1. mTLSモードを一時的にPERMISSIVEに変更(平文+mTLS両方許可)
kubectl apply -f - <<'POLICY'
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: permissive-during-upgrade
  namespace: production
spec:
  mtls:
    mode: PERMISSIVE
POLICY

# 2. すべてのワークロードを再起動して最新プロキシを適用
kubectl rollout restart deployment -n production

# 3. すべてのPodが新バージョンに置き換わった後、STRICTを復元
kubectl rollout status deployment -n production --timeout=300s
kubectl apply -f - <<'POLICY'
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: strict-mtls
  namespace: production
spec:
  mtls:
    mode: STRICT
POLICY

事例3:Cilium Agent再起動による瞬間的なトラフィックドロップ

状況:Cilium DaemonSetのアップデート中にノードのeBPFプログラムが一時的にアンロードされ、そのノードのPod間通信が数秒間中断しました。

リカバリーと予防

# Rolling Update戦略で1ノードずつアップデート
helm upgrade cilium cilium/cilium \
  --namespace kube-system \
  --reuse-values \
  --set upgradeCompatibility=1.16 \
  --set rollOutCiliumPods=true

# PodDisruptionBudgetの確認
kubectl get pdb -n kube-system

# アップデート進行状況のモニタリング
kubectl rollout status daemonset/cilium -n kube-system --timeout=600s

パフォーマンスベンチマークと選択ガイド

実測ベンチマーク結果(2025年基準)

最近の大規模エンタープライズ環境での比較テスト結果を要約します。

メトリックNetwork Policy OnlyIstio AmbientCilium Service Mesh
P99レイテンシ(ms)1.23.82.1
QPS(リクエスト/秒)45,00038,00042,000
QPS per Core-2,1781,815
CPUオーバーヘッド基準+15%+8%
メモリオーバーヘッド基準+120MB/ノード+80MB/ノード
低接続パフォーマンス-優秀普通
高接続パフォーマンス-普通優秀

注:IstioのQPS per Coreが高いのはL7処理能力が含まれた数値であり、CiliumのCPU測定にはカーネル内WireGuard暗号化コストが除外されている点を考慮する必要があります。

選択ガイドフローチャート

  1. L3/L4ネットワーク分離のみ必要か?

    • はい:Kubernetes Network Policy + CalicoまたはCilium CNIで十分
    • いいえ:2番へ
  2. L7トラフィック管理(カナリア、リトライ、サーキットブレーカー)が必要か?

    • はい:Istio Ambient ModeまたはCilium + Envoy
    • いいえ:3番へ
  3. mTLSベースのゼロトラストが要件か?

    • はい:Istio Ambient Mode(SPIFFEベースのワークロードID)
    • いいえ:Cilium WireGuard暗号化でノード間暗号化
  4. 高性能 + カーネルレベルの可観測性が優先か?

    • はい:Cilium Service Mesh + Hubble
    • いいえ:Istio(より豊富なL7機能)
  5. Windowsノード混用またはハイブリッド環境か?

    • はい:Calico Enterprise
    • いいえ:IstioまたはCilium

運用規模別の推奨事項

  • 小規模クラスター(ノード10台以下):Cilium CNI + 基本Network Policy。Service Mesh導入はオーバーヘッド対比メリットが少ない。
  • 中規模クラスター(ノード10~100台):Cilium Service MeshまたはIstio Ambient。L7要件に応じて選択。
  • 大規模クラスター(ノード100台以上):Istio Ambient Mode。成熟したマルチクラスターサポート、豊富なエコシステム、安定性。
  • ハイブリッド/マルチクラウド:Calico EnterpriseまたはCilium Cluster Mesh。

おわりに

Kubernetesのネットワークセキュリティは、単にNetwork Policyを適用することを超えて、アプリケーションの特性とセキュリティ要件に合った包括的な戦略が必要です。

要点まとめ:

  • Network Policyは基本中の基本:Default Denyから始めて、必要な通信のみを許可するホワイトリスト方式を必ず適用してください。DNS許可ポリシーを忘れないでください。
  • Service Meshは必要な時に導入:mTLS、L7ポリシー、高度なトラフィック管理が実際に必要な時点で導入してください。不必要な複雑さはむしろ運用負担を増加させます。
  • Istio vs Ciliumはトレードオフ:IstioはL7機能とエコシステムが豊富で、Ciliumはカーネルレベルの性能と可観測性が強みです。要件に合わせて選択してください。
  • 段階的な導入が重要:Default Denyポリシーから始めて、Network Policyを十分に検証した後、必要に応じてService Meshを追加する段階的アプローチが最も安全です。
  • 自動化とテスト:ポリシー変更は必ずCI/CDパイプラインを通じてステージングでまず検証し、ロールバック計画を常に準備してください。

ネットワークセキュリティは一度設定して終わりではありません。サービスが変化するにつれて、ポリシーも継続的にレビューし更新する必要があります。四半期ごとのポリシー監査を推奨し、HubbleやKialiなどの可観測性ツールを活用して実際のトラフィックパターンに基づいてポリシーを最適化してください。

参考資料