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への通信を制御 |
egress | Podから外部への通信を制御(任意) |
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 などを立ち上げ、wget
やnc
コマンドで通信テストすると理解が進みます。 kubectl exec
を使って対象Podに入って確認できます:
kubectl exec -it busybox -- /bin/sh
wget <db-service>:5432
🔚 まとめ
NetworkPolicyは、Kubernetesにおけるネットワークセキュリティの要です。
- デフォルトは全開放 → 明示的な制限を加えることで安全に
- PodのラベルやNamespaceを活用して柔軟な制御が可能
- 実際にはCNIプラグインとセットで使う点に注意