説明
NetworkPolicy が Pod と異なる名前空間にある場合や、podSelector が実際の Pod を選択しない場合、そのポリシーは対象 Pod に適用されません。ネットワークで保護されているように見えても、実際にはアクセスできる状態が残るおそれがあります。
ポリシーの有無だけでなく、名前空間、ラベル、対象 Pod を確認してください。適用には NetworkPolicy に対応するネットワークプラグインが必要です。また、複数のポリシーによる通信の許可範囲は併せて適用されます。
想定される影響
- Pod 間や外部との通信が想定より広く許可される場合があります。
- 内部サービスが保護されないまま残るおそれがあります。
- ポリシーが宣言されていても、想定したネットワーク分離が機能しない場合があります。
対処方法
- NetworkPolicy を保護対象の Pod と同じ名前空間に配置してください。
podSelectorが実際の Pod のラベルと一致することを確認してください。- ポリシー適用後に、対象 Pod の通信が実際に制限されることをテストしてください。
例
使用する名前空間とアプリケーションイメージを別途用意してください。例の古い nginx バージョンはデプロイの推奨ではありません。
変更前
yaml
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
namespace: app-one
labels:
app: shouldmatch
spec:
containers:
- name: nginx
image: nginx:1.14.2
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: sample-policy
namespace: app-another
spec:
podSelector:
matchLabels:
app: shouldmatch
変更後
yaml
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
namespace: app-safe
spec:
containers:
- name: app
image: images.my-company.example/app:v4
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: sample-policy
namespace: app-safe
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
補足:
- 変更前: Pod とポリシーの名前空間が異なるため、このポリシーは例の Pod に適用されません。
- 変更後: 同じ名前空間のすべての Pod に、受信・送信のデフォルト拒否を適用します。別のポリシーによる許可は有効なため、ポリシー全体を確認し、必要な DNS やアプリケーション通信を明示的に許可してください。