Kubernetes の NetworkPolicy を使って、Pod からのアウトバウンド通信を制御する考え方を確認します。重要なのは、NetworkPolicy は Kubernetes の標準リソースですが、実際にパケットを制御するのは CNI 側であり、どこまで効くかは利用している CNI とクラスタ設計に依存するという点です。
この記事の位置づけ
この記事は、Pod 単位のアウトバウンド通信制御を NetworkPolicy で考える記事です。標準の NetworkPolicy でできる範囲、CNI 依存になる範囲、DNS や proxy を含めて設計する必要がある範囲を分けて見ます。
NetworkPolicy でできること
NetworkPolicy は Pod に対する ingress / egress の通信制御を定義します。ただし、定義を書いただけで必ず効くわけではありません。Calico など NetworkPolicy を実装する CNI が必要です。
podSelectorで対象 Pod を選ぶpolicyTypesで Ingress / Egress を指定するegressで宛先 IP、namespace、Pod、port などを許可する- 一度 egress policy の対象になると、許可していない外向き通信は拒否される
RFC1918 宛てだけ許可する例
次は、対象 namespace の Pod から RFC1918 宛てだけを許可する例です。これは「内部ネットワークだけへ出す」考え方の例ですが、このままだと DNS への通信も許可されない場合があります。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-rfc1918-only
namespace: my-system
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
- ipBlock:
cidr: 172.16.0.0/12
- ipBlock:
cidr: 192.168.0.0/16このポリシーは、全 Pod を対象にした egress 制御です。実際の環境では、DNS、proxy、監視、ログ転送、イメージ取得など、許可すべき通信を個別に洗い出します。
DNS を許可する考え方
Pod が名前解決を必要とする場合、CoreDNS への UDP / TCP 53 を許可する必要があります。Kubernetes 標準の NetworkPolicy では、FQDN そのものを直接指定する制御は扱いにくいため、DNS を許可することと、名前解決後の宛先通信をどう制御するかは分けて考えます。
kubectl -n kube-system get svc kube-dns
kubectl -n kube-system get pod -l k8s-app=kube-dns -o wide注意点
- DNS への通信を許可しないと名前解決できなくなる。
- proxy 経由で外へ出す場合は、proxy 宛ての通信を明示的に許可する。
- CNI が NetworkPolicy を実装していない場合、この定義は期待どおりに効かない。
- FQDN ベースの制御は Kubernetes 標準の NetworkPolicy だけでは扱いにくい。
- 外部通信の監査ログをどこで取るかは、NetworkPolicy だけでは解決しない。
NetworkPolicy は通信を絞るための部品です。インターネット向け通信を統制したい場合は、proxy、DNS、Firewall、CNI のログ、監査の仕組みと組み合わせて設計します。
確認
NetworkPolicy は適用しただけで満足せず、対象 Pod から許可した通信と拒否したい通信の両方を確認します。
kubectl -n my-system get networkpolicy
kubectl -n my-system describe networkpolicy allow-rfc1918-only
kubectl -n my-system run curl-test --rm -it --image=curlimages/curl -- sh
kubectl -n my-system get pod -o wide確認用 Pod を使う場合は、その Pod が NetworkPolicy の対象 selector に含まれているかも確認します。対象外の Pod でテストすると、ポリシーが効いていないように見えることがあります。
まとめ
NetworkPolicy は Pod の通信範囲を狭めるための基本機能ですが、インターネット向け通信を実運用で制御する場合は、DNS、proxy、CNI の実装、監査ログを合わせて考える必要があります。
Kubernetes 標準の NetworkPolicy は、Pod と通信方向を宣言するための仕組みです。外部通信の統制全体を任せるものではありません。どの Pod が、どこへ、どの経路で、どのログを残して通信するのかを設計することが重要です。
関連する記事
- Kubernetes Calico eBPF の設計メモ – kube-proxy 代替、DualStack、高可用性をどう見るか
CNI とデータプレーンの設計を Calico eBPF の観点で確認しています。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
Service 公開時の送信元アドレスと経路設計を切り分ける記事です。 - Kubernetes Multus がうまく動かない時に考えること – CNI を複数持つ難しさ
複数 CNI を扱う時の切り分けを確認しています。 - Kubernetes 運用設計ガイド
Kubernetes 関連記事全体の入口です。
次に進む
- Kubernetes Calico eBPF の設計メモ – kube-proxy 代替、DualStack、高可用性をどう見るか
NetworkPolicy を支える CNI / データプレーン側の設計へ進みます。 - Kubernetes で送信元アドレスが変わる問題 – externalTrafficPolicy、hostNetwork、BGP 経路広告で考える
通信制御の次に、Service 公開時の送信元アドレスと経路設計を確認します。
参考書籍
書籍
Kubernetes の仕組み、リソース、ネットワーク、運用観点を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。

