CiliumNetworkPolicy に関して
KubernetesでCiliumNetworkPolicyを使用すると、特定の名前空間に限ったネットワークポリシーを設定できますが、このポリシーを有効にするためには**`endpointSelector`が必須**です。この記事では、`endpointSelector`の役割と、その設定方法について詳しく説明します。また、名前空間ごとにネットワークポリシーを適用する利点についても解説します。
CiliumNetworkPolicyは名前空間ごとに適用される
CiliumNetworkPolicyは、通常Kubernetesの`metadata`で指定された名前空間(namespace)内でのみ適用されるように設計されています。これにより、ネットワークポリシーは指定された名前空間内のリソース(Podやサービス)にのみ有効となり、他の名前空間にあるリソースには影響を与えません。
`endpointSelector`の役割と必須性
CiliumNetworkPolicyを適用するためには、`spec`内に**`endpointSelector`を必ず指定する必要があります**。`endpointSelector`は、どのPodにこのポリシーを適用するかを決めるための設定であり、これを省略するとポリシーの対象が定義されないため、ポリシーが無効になります。
`endpointSelector`で対象となるPodを指定する際、`matchLabels: {}`を使えば、その名前空間内のすべてのPodを対象にすることができます。これにより、特定の名前空間内の全Podに対して一括でポリシーを適用することが可能です。
設定例:`example-namespace`内の全Podにポリシーを適用する
例えば、`example-namespace`という名前空間内のすべてのPodに通信を許可するポリシーを設定する場合、次のような`CiliumNetworkPolicy`の設定が必要です。
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: allow-all-in-namespace
namespace: example-namespace # この名前空間内のリソースに対してポリシーを適用
spec:
endpointSelector:
matchLabels: {} # `example-namespace` 内の全Podを対象にする
ingress:
- fromEndpoints:
- matchLabels: {} # 同じ名前空間内のPodからの通信を許可
設定内容の解説
metadata.namespace: `example-namespace`という名前空間を指定しているため、このポリシーは`example-namespace`内のリソースにのみ適用されます。
endpointSelector: `matchLabels: {}`を指定することで、`example-namespace`内のすべてのPodを対象にポリシーが適用されます。`endpointSelector`は必須であり、これを省略するとポリシーが適用されません。
ingress: `fromEndpoints`で同じ名前空間内のPodからの通信を許可しています。この設定により、`example-namespace`内のPod同士の通信が可能になります。
名前空間ごとにネットワークを制御する利点
名前空間ごとにネットワークポリシーを設定することで、異なるアプリケーションや環境を1つのKubernetesクラスター内で分離して管理できます。以下のような利点があります。
アプリケーションごとの分離:異なるアプリケーションやチームごとに名前空間を分け、名前空間ごとに異なるポリシーを適用することで、不要な通信やデータのやり取りを防ぎ、セキュリティを強化できます。
環境ごとのセキュリティ:開発用と本番用の環境を名前空間で分け、異なる通信ルールを設定することで、開発環境と本番環境が影響し合うリスクを回避できます。
まとめ
CiliumNetworkPolicyは指定された名前空間内でのみ適用される:`metadata.namespace`で定義された名前空間に限ってポリシーが実施されます。
`endpointSelector`は必須:対象となるPodを指定するために`endpointSelector`が必要です。省略するとポリシーが無効になります。
セキュリティと管理の利便性:名前空間ごとにネットワーク制御を行うことで、Kubernetesクラスター全体の安全性と管理のしやすさが向上します。
CiliumNetworkPolicyと`endpointSelector`を活用することで、Kubernetes内のリソースを名前空間ごとにしっかりと分離し、安全に管理することが可能です。