こんにちは。今回は Kubernetes の NetworkPolicy における Pod ラベルと Ingress/Egress 設定の基本ポイントについて解説します。
🧩 NetworkPolicyの基本
NetworkPolicy は Kubernetes クラスター内の Pod 間通信や外部からのアクセスを制御するためのリソースです。
特に、Pod のラベルと NetworkPolicy の podSelector.matchLabels
が一致していることが重要です。
🔍 Pod と NetworkPolicy のマッチング
- 対象の Pod が1つしかない場合、その Pod のラベルと NetworkPolicy の
podSelector.matchLabels
が完全に一致している必要があります。 - これがずれていると、その Pod に対する通信制御が正しく適用されません。
🚪 Ingress と Egress の違い
用語 | 説明 |
---|---|
Ingress | 外部(PodやNamespaceなど)から対象 Pod への受信トラフィックの制御。 |
Egress | 対象 Pod から外部(他 Pod や外部ネットワーク)への送信トラフィックの制御。 |
⚠️ Ingress(NetworkPolicy)と Kubernetes Ingress の違い
- Kubernetes の Ingress は外部から Service へのアクセスを管理します。
- NetworkPolicy の Ingress はクラスター内部の Pod 間の受信通信を制限します。
混同しないように注意が必要です。
🔧 NetworkPolicy の ports 設定時の注意点
NetworkPolicy の ports
設定は YAML の書き方で意味が変わる場合があります。
-
- ports:
のようにハイフンがついている場合:OR 条件(いずれかにマッチすれば許可) - ハイフンなしの
ports:
の場合:AND 条件(すべての条件を満たす必要あり)
📌 具体例解説
egress:
- to: # 1つ目の egress ルール(AND 条件のみ)
- podSelector: # id=api のラベルを持つ Pod への通信を許可
matchLabels:
id: api
ports: # 追加のセレクター(AND 条件)
- port: 53 # UDP 53番ポート(DNS通信)を許可
protocol: UDP
この例の意味は:
id: api のラベルを持つ Pod へ、かつ UDP の 53 番ポートへの通信のみ許可する
🔄 OR 条件の例(複数のポートや宛先がある場合)
egress:
- to:
- podSelector:
matchLabels:
id: api
- podSelector:
matchLabels:
id: db
ports:
- port: 53
- port: 80
この場合は、
- 宛先が
id: api
またはid: db
の Pod - ポートが 53 または 80
のいずれかに合致すれば通信許可となります。
📝 まとめ
- Pod のラベルと NetworkPolicy の
podSelector.matchLabels
は必ず一致させる - NetworkPolicy の Ingress と Kubernetes の Ingress は全く別物なので注意
-
ports
の書き方(ハイフンの有無)で AND/OR の意味が変わる - 具体例を参考にして、正確な NetworkPolicy 設計を心がけよう
今回の内容が NetworkPolicy 設計の理解に役立てば幸いです。
質問やコメントがあれば、ぜひお気軽にどうぞ 😊