
KubernetesのNetworkPolicy:Podを守るための“Firewall”機能
Kubernetesを使っていると、Pod間の通信に関してどう制御するかを考える場面が増えてきます。デフォルトでは、KubernetesのPod同士は自由に通信ができる設計になっていますが、セキュリティ面では少し心配ですよね。そこで登場するのが「NetworkPolicy」。これを使うことで、特定のPodへのアクセスを制限することができますが、その中でも注目すべきなのが、podSelectorによる通信制限です。
Kubernetesのデフォルト設定とNetworkPolicy
Kubernetesでは、デフォルトでは全てのPod間の通信が許可されています。これは便利ですが、セキュリティ的に心配になることもありますよね。たとえば、外部からの不正アクセスや、内部のPodが他のPodに勝手にアクセスしてしまうのは望ましくありません。
そこで、NetworkPolicyを使うことで、どのPodがどのPodにアクセスできるかを制限することができます。特に、podSelectorを使用して特定のPodに対するアクセス制限を行うことができるため、セキュリティ面で非常に強力なツールです。
podSelectorの基本的な動作
まず重要なのは、podSelectorで指定したPodには、デフォルトで他のPodからのアクセスが拒否されるということです。ただし、これはあくまで**アクセスを制限するための「出発点」**です。具体的にアクセスを許可するためには、ingressやegressといったポリシーを設定する必要があります。
この点は、少し誤解を招くかもしれませんが、podSelectorを設定しただけでは、アクセスが完全に禁止されるわけではなく、実際には「アクセスを拒否する状態」になる、という理解が重要です。これにより、許可された通信だけが流れる仕組みが作られるのです。
PodのFirewallとしてのNetworkPolicy
この動きを、もう少し身近な例で考えてみましょう。podSelectorで指定されたPodは、まるで「自分専用のFirewallを持っているようなもの」です。これは、外部からの不正アクセスを一切許さない、強固なセキュリティシステムを作るイメージです。
たとえば、あなたの家にセキュリティシステムが設置されているとしましょう。このシステムは、事前に許可された人だけが入れるようになっています。外部の不正なアクセスがあれば、その場で即座に遮断されます。KubernetesのPodも同様に、NetworkPolicyを使うことで、指定したPodに対して外部からの不正なアクセスを遮断できるのです。
具体的な設定例
以下のNetworkPolicyの設定では、MySQL Pod(app=mysql)へのアクセスを特定のバックエンドPod(namespace=backend)に限定しています。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: restrict-db-access
namespace: db # このNetworkPolicyを適用するnamespace
spec:
podSelector:
matchLabels:
app: mysql # このラベルを持つPod(MySQL)への通信を制御
policyTypes:
- Ingress # 受信(Ingress)通信を制御
ingress:
- from:
- namespaceSelector:
matchLabels:
name: backend # "backend" namespaceのPodからの通信を許可
この例では、app=mysqlというラベルを持つMySQL PodがpodSelectorによって指定されています。これにより、MySQL Podはデフォルトでは他のPodからアクセスを拒否されます。そして、ingressの設定によって、namespace=backendという条件を満たすPodからのアクセスのみが許可される仕組みになっています。
ポリシーが無い場合のデフォルト動作
NetworkPolicyが設定されていない場合、Kubernetesでは全てのPod間の通信が許可されるデフォルト設定となります。つまり、NetworkPolicyが無ければ、Pod同士が自由に通信できてしまうということです。これを回避するために、NetworkPolicyを設定して、アクセス制御を行う必要があります。
まとめ
KubernetesのpodSelectorを使ったNetworkPolicyの設定は、Podを守るための「自分専用のFirewall」のような役割を果たします。podSelectorで指定したPodは、デフォルトでは他のPodからのアクセスが拒否され、必要な通信だけを許可する設定が可能になります。この仕組みを使うことで、セキュアな通信環境を構築でき、Pod同士の通信を厳密に制御することができます。
もし、Pod間通信を強化したい場合、NetworkPolicyを積極的に活用して、不要なアクセスを制限しましょう。セキュリティ面での不安を解消し、より安全なKubernetes環境を作り上げるための強力なツールです。