Kubernetes の NetworkPolicy を使って、Pod からのアウトバウンド通信を制御する考え方を整理します。クラウド環境でもオンプレ環境でも、Pod からどこへ通信できるのかを明示したい場面があります。
この記事の位置づけ
この記事は、Pod 単位の通信制御を NetworkPolicy で考える記事です。NetworkPolicy は Kubernetes の宣言だけでは完結せず、実際にどこまで効くかは CNI 実装とクラスタ設計に依存します。
次に読む記事
参考
書籍
書籍
参考書籍
Kubernetes完全ガイド 第2版
Kubernetes の仕組み、リソース、ネットワーク、運用観点を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
NetworkPolicy でできること
NetworkPolicy は Pod に対する ingress / egress の通信制御を定義します。ただし、実際に効くかどうかは利用している CNI に依存します。Calico など NetworkPolicy を実装する CNI が必要です。
RFC1918 宛てだけ許可する例
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注意点
- DNS への通信を許可しないと名前解決できなくなる。
- proxy 経由で外へ出す場合は、proxy 宛ての通信を明示的に許可する。
- CNI が NetworkPolicy を実装していない場合、この定義は期待どおりに効かない。
- FQDN ベースの制御は Kubernetes 標準の NetworkPolicy だけでは扱いにくい。
確認
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まとめ
NetworkPolicy は Pod の通信範囲を狭めるための基本機能ですが、インターネット向け通信を実運用で制御する場合は、DNS、proxy、CNI の実装、監査ログを合わせて考える必要があります。単に外向き通信を止めるだけではなく、どこを経由させ、どこでログを残すかが重要です。
Kubernetes NetworkPolicy によるアウトバウンド通信制御


