8.10. NetworkPolicy の有効化
ovs-subnet および ovs-multitenant プラグインにはネットワークの分離についての独自のレガシーモデルがありますが、Kubernetes NetworkPolicy
はサポートしません。ただし、NetworkPolicy
サポートは、ovs-networkpolicy プラグインを使用すると利用できます。
Egress
ポリシータイプ、ipBlock
パラメーター、および podSelector
パラメーターと namespaceSelector
パラメーターを組み合わせる機能は、OpenShift Container Platform では使用できません。
NetworkPolicy
機能はクラスターとの通信に障害を発生させる可能性があるため、これらの機能をデフォルトの OpenShift Container Platform プロジェクトに適用しないでください。
NetworkPolicy
ルールは、ホストネットワーク namespace には適用されません。ホストネットワークが有効にされている Pod は NetworkPolicy
ルールによる影響を受けません。
ovs-networkpolicy プラグインを使用するように設定されている クラスターでは、ネットワークの分離は NetworkPolicy
オブジェクト によって完全に制御されます。デフォルトで、プロジェクトのすべての Pod は他の Pod およびネットワークのエンドポイントからアクセスできます。プロジェクトで 1 つ以上の Pod を分離するには、そのプロジェクトで NetworkPolicy
オブジェクトを作成し、許可する着信接続を指定します。プロジェクト管理者は独自のプロジェクト内で NetworkPolicy
オブジェクトの作成および削除を実行できます。
Pod を参照する NetworkPolicy
オブジェクトを持たない Pod は完全にアクセスできますが、Pod を参照する 1 つ以上の NetworkPolicy
オブジェクトを持つ Pod は分離されます。これらの分離された Pod は 1 つ以上の NetworkPolicy
オブジェクトで許可される接続のみを受け入れます。
複数の異なるシナリオに対応するいくつかの NetworkPolicy
オブジェクト定義のいくつかを見てみましょう。
すべてのトラフィックを拒否
プロジェクトに deny by default (デフォルトで拒否) を実行させるには、すべての Pod に一致するが、トラフィックを一切許可しない
NetworkPolicy
オブジェクトを追加します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: deny-by-default spec: podSelector: ingress: []
プロジェクト内の Pod からの接続のみを許可
Pod が同じプロジェクト内の他の Pod からの接続を受け入れるが、他のプロジェクトの Pod からの接続を拒否するように設定するには、以下を実行します。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-same-namespace spec: podSelector: ingress: - from: - podSelector: {}
Pod ラベルに基づいて HTTP および HTTPS トラフィックのみを許可
特定のラベル (以下の例の
role=frontend
) の付いた Pod への HTTP および HTTPS アクセスのみを有効にするには、以下と同様のNetworkPolicy
オブジェクトを追加します。kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-http-and-https spec: podSelector: matchLabels: role: frontend ingress: - ports: - protocol: TCP port: 80 - protocol: TCP port: 443
NetworkPolicy
オブジェクトは加算されるものです。つまり、複数の NetworkPolicy
オブジェクトを組み合わせて複雑なネットワーク要件を満すことができます。
たとえば、先の例で定義された NetworkPolicy
オブジェクトの場合、同じプロジェト内に allow-same-namespace
と allow-http-and-https
ポリシーの両方を定義することができます。これにより、ラベル role=frontend
の付いた Pod は各ポリシーで許可されるすべての接続を受け入れます。つまり、同じ namespace の Pod からのすべてのポート、および すべての namespace の Pod からのポート 80
および 443
での接続を受け入れます。
8.10.1. NetworkPolicy の効率的な使用
NetworkPolicy
オブジェクトは、namespace 内でラベルで相互に区別される Pod を分離することを許可します。
NetworkPolicy
オブジェクトを単一 namespace 内の多数の個別 Pod に適用することは効率的ではありません。Pod ラベルは IP レベルには存在しないため、NetworkPolicy
オブジェクトは、podSelector
で選択されるすべての Pod 間のすべてのリンクについての別個の OVS フロールールを生成します。
たとえば、spec
podSelector
および ingress
podSelector
within a NetworkPolicy
オブジェクトのそれぞれが 200 Pod に一致する場合、40000 (200*200) OVS フロールールが生成されます。これにより、マシンの速度が低下する可能性があります。
OVS フロールールの量を減らすには、namespace を使用して分離する必要のある Pod のグループを組み込みます。
namespace 全体を選択する NetworkPolicy
オブジェクトは、namespaceSelectors
または空の podSelectors
を使用して、namespace の VXLAN VNID に一致する単一の OVS フロールールのみを生成します。
分離する必要のない Pod は元の namespace に維持し、分離する必要のある Pod は 1 つ以上の異なる namespace に移します。
追加のターゲット設定された namespace 間のポリシーを作成し、分離された Pod から許可する必要のある特定のトラフィックを可能にします。