目的
- networkpolicy を理解する
手段
killercodaで手を動かす
環境
killercoda
networkpolicy とは
KubernetesのNetworkPolicyは、Pod(コンテナの実行単位)間のネットワークトラフィックを制御・制限するためのKubernetesリソースです。
デフォルトでは、Kubernetesクラスター内のすべてのPodは、特別な制限がなければ他のすべてのPodと自由に通信できます。NetworkPolicyは、このデフォルトの許可設定を変更し、セキュリティを強化するために、特定のインバウンド (Ingress) およびアウトバウンド (Egress) トラフィックを許可または拒否するルールを定義します。
つまり、kubernetes環境の L4 Firewall です。pod(label)やnamespace単位で通信元・通信先のリソースを指定します。また、IPアドレス(cidr)やexcept(除外)で特定の通信のみを許可できます。
気を付ける点は以下の通りです
- networkpolicyが存在しない状態は全てのpod間で通信可能
- 各種条件は配列の数で and または or を指定可能
- 通信を許可する条件を記載する。空のルール(
{})は全ての通信を許可する - 条件を記載するルール行を記載しない場合は全ての通信を許可しない
それぞれサンプル設定を確認します。
- networkpolicyが存在しない状態は全てのpod間で通信可能
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
# シンプルにNetworkPolicyリソースが存在しない状態です
- 各種条件は配列の数で and または or を指定可能
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
# from 配列に入る要素は一つです。(-は一つ)故に、条件は and になります。
# namespaceSelector 条件及びpodSelector 条件を満たすことが条件です
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
# from 配列に入る要素は二つです。(-は二つ)故に、条件は or になります。
# namespaceSelector条件、または、podSelector 条件を満たすことが条件です
- 通信を許可する条件を記載する。空のルール(
{})は全ての通信を許可する
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
# 全ての ingress 通信を拒否します。
# 許可する通信を指定する `ingress:` 行が存在しません。
# この許可する設定行が存在しないポリシーは指定された方向の通信を全て拒否します
また、namespaceSelector や podSelector の {} 指定は全てのリソースを対象とします。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: {}
# {} は全ての pod を対象とします
あとがき
Kubernetes は奥が深い...