Kubernetes Learning 第30章:NetworkPolicyの使い方 〜Pod間通信を制御するセキュリティの要〜

Kubernetesクラスターでは、デフォルトではすべてのPod間通信が許可されています。これは開発初期には便利ですが、本番環境ではセキュリティ上のリスクになります。
たとえば、「アプリケーションのPodからしかDBにアクセスさせたくない」など、通信の制限が必要になります。

このような通信制御を行うために使われるのが、NetworkPolicy(ネットワークポリシー) です。


✅ NetworkPolicyとは?

NetworkPolicy は、KubernetesにおけるPod間やPod⇔外部のネットワーク通信を制限・許可する仕組みです。

具体的には、以下のようなことができます:

  • 特定のPodからの通信のみを許可(インバウンド制御)
  • 特定の宛先への通信のみを許可(アウトバウンド制御)
  • Namespace や Label に基づいたフィルタリング

🧩 基本的な構造

NetworkPolicyは、以下のようなYAML形式で定義します:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-frontend
  namespace: my-app
spec:
  podSelector:
    matchLabels:
      role: backend
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend

この例では:

  • my-app 名前空間の role=backend のPodに対し、
  • role=frontend のPodからの通信 だけ を許可します。

⚠️ ポイント:
NetworkPolicyを1つでも作成すると、それにマッチしない通信は遮断されます(ホワイトリスト方式)。


🔍 設定対象とできること

項目説明
podSelector対象となるPodをラベルで指定
ingress外部からPodへの通信を制御
egressPodから外部への通信を制御(任意)
from / to許可対象(PodやNamespaceなど)
ports許可するポート番号

🛠 例:PostgreSQLへのアクセス制御

例えば、DB Podに対し、app=backend というラベルを持つPodだけがポート5432で通信できるようにします:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-backend-to-db
  namespace: prod
spec:
  podSelector:
    matchLabels:
      app: db
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: backend
      ports:
        - protocol: TCP
          port: 5432

🚦 NetworkPolicyの注意点

  • Kubernetes単体ではNetworkPolicyを解釈するだけで、実際の通信制御はCNIプラグイン側が実行します(例: Calico, Cilium, Weave Net など)。
  • kubectl get networkpolicy で定義されたポリシーを確認できますが、動作確認には実際の通信テストが重要です。
  • Namespaceをまたいだ通信制御も可能です。

✅ よくあるユースケース

ユースケースNetworkPolicyで実現できること
DBへのアクセスを一部のPodに限定ingress で制御
外部インターネットへのアクセスを禁止egress で制御
Namespaceごとに隔離namespaceSelector を活用

📌 動作確認のポイント

  • 簡易的に busybox Pod などを立ち上げ、wgetnc コマンドで通信テストすると理解が進みます。
  • kubectl exec を使って対象Podに入って確認できます:
kubectl exec -it busybox -- /bin/sh
wget <db-service>:5432

🔚 まとめ

NetworkPolicyは、Kubernetesにおけるネットワークセキュリティの要です。

  • デフォルトは全開放 → 明示的な制限を加えることで安全に
  • PodのラベルやNamespaceを活用して柔軟な制御が可能
  • 実際にはCNIプラグインとセットで使う点に注意

mh

Related Posts

Kubernetes Learning 第40章:Kubernetesのアップグレードとバージョン管理 ~安全にバージョンを上げるための基本知識~

Kubernetes Learning 第39章:CRD(Custom Resource Definition)とは?~Kubernetesに“自分専用のリソース”を追加する仕組み~

You Missed

Kubernetes Learning 第40章:Kubernetesのアップグレードとバージョン管理 ~安全にバージョンを上げるための基本知識~

  • 投稿者 mh
  • 6月 24, 2025
  • 56 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第13章:ストレージとデータベースの基礎 : オブジェクトストレージ: Cloud Storage(バケット、オブジェクト、ストレージクラス)- あなたの「データ置き場」

  • 投稿者 mh
  • 6月 23, 2025
  • 73 views

Kubernetes Learning 第39章:CRD(Custom Resource Definition)とは?~Kubernetesに“自分専用のリソース”を追加する仕組み~

  • 投稿者 mh
  • 6月 21, 2025
  • 72 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第12章:Cloud CDN(Content Delivery Network):あなたのWebサイトを「世界中のユーザーに超高速で届ける宅配便ネットワーク」

  • 投稿者 mh
  • 6月 20, 2025
  • 91 views

Kubernetes Learning 第38章:Operatorとは? ~Kubernetesに「運用の自動化ロボット」を組み込む仕組み~

  • 投稿者 mh
  • 6月 19, 2025
  • 79 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第11章:Cloud Load Balancing:あなたのGCPリソースを「賢く振り分ける交通整理の達人」

  • 投稿者 mh
  • 6月 18, 2025
  • 95 views