21.4. マルチネットワークポリシーの設定
クラスター管理者は、追加のネットワーク用にマルチネットワークを設定できます。SR-IOV および macvlan 追加ネットワークのマルチネットワークポリシーを指定できます。Macvlan 追加ネットワークは完全にサポートされています。ipvlan などの他の追加のネットワークタイプはサポートされていません。
SR-IOV 追加ネットワークのマルチネットワークポリシー設定のサポートはテクノロジープレビュー機能であり、カーネルネットワークインターフェイスカード (NIC) でのみサポートされます。SR-IOV は、データプレーン開発キット (DPDK) アプリケーションではサポートされていません。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
設定されたネットワークポリシーは、IPv6 ネットワークでは無視されます。
21.4.1. マルチネットワークポリシーとネットワークポリシーの違い リンクのコピーリンクがクリップボードにコピーされました!
MultiNetworkPolicy API は、NetworkPolicy API を実装していますが、いくつかの重要な違いがあります。
以下の場合は、
MultiNetworkPolicyAPI を使用する必要があります。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy-
CLI を使用してマルチネットワークポリシーと対話する場合は、
multi-networkpolicyリソース名を使用する必要があります。たとえば、oc get multi-networkpolicy <name>コマンドを使用してマルチネットワークポリシーオブジェクトを表示できます。ここで、<name>はマルチネットワークポリシーの名前になります。 MultiNetworkPolicyオブジェクトでk8s.v1.cni.cncf.io/policy-forアノテーションを使用することで、NetworkAttachmentDefinition(NAD) カスタムリソース (CR) を指定できます。NAD CR は、ポリシーを適用するネットワークを定義します。k8s.v1.cni.cncf.io/policy-forアノテーションを含むマルチネットワークポリシーの例apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>ここでは、以下のようになります。
<namespace_name>- namespace 名を指定します。
<network_name>- ネットワーク割り当て定義の名前を指定します。
21.4.2. クラスターのマルチネットワークポリシーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、クラスターでマルチネットワークポリシーのサポートを有効にすることができます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインする。
手順
以下の YAML で
multinetwork-enable-patch.yamlファイルを作成します。apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: useMultiNetworkPolicy: trueマルチネットワークポリシーを有効にするようにクラスターを設定します。
$ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml出力例
network.operator.openshift.io/cluster patched
21.4.3. マルチネットワークポリシーの使用 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、マルチネットワークポリシーを作成、編集、表示、および削除することができます。
21.4.3.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
- クラスターのマルチネットワークポリシーサポートを有効にしている。
21.4.3.2. CLI を使用したマルチネットワークポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
マルチネットワークポリシーを作成し、クラスターの namespace に許可される Ingress または Egress ネットワークトラフィックを記述する詳細なルールを定義することができます。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが適用される namespace で作業していること。
手順
ポリシールールを作成します。
<policy_name>.yamlファイルを作成します。$ touch <policy_name>.yamlここでは、以下のようになります。
<policy_name>- マルチネットワークポリシーのファイル名を指定します。
作成したばかりのファイルで、以下の例のようなマルチネットワークポリシーを定義します。
すべての namespace のすべての Pod から Ingress を拒否します。
これは基本的なポリシーであり、他のネットワークポリシーの設定によって許可されたクロス Pod トラフィック以外のすべてのクロス Pod ネットワーキングをブロックします。
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default annotations: k8s.v1.cni.cncf.io/policy-for: <network_name> spec: podSelector: ingress: []ここでは、以下のようになります。
<network_name>- ネットワーク割り当て定義の名前を指定します。
同じ namespace のすべての Pod から Ingress を許可する
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-same-namespace annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: ingress: - from: - podSelector: {}ここでは、以下のようになります。
<network_name>- ネットワーク割り当て定義の名前を指定します。
特定の namespace から 1 つの Pod への Ingress トラフィックを許可する
このポリシーは、
namespace-yで実行されている Pod からpod-aというラベルの付いた Pod へのトラフィックを許可します。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: allow-traffic-pod annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: matchLabels: pod: pod-a policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: namespace-yここでは、以下のようになります。
<network_name>- ネットワーク割り当て定義の名前を指定します。
サービスへのトラフィックを制限する
このポリシーを適用すると、
app=bookstoreとrole=apiの両方のラベルを持つすべての Pod に、app=bookstoreというラベルを持つ Pod のみがアクセスできるようになります。この例では、アプリケーションは、ラベルapp=bookstoreおよびrole=apiでマークされた REST API サーバーである可能性があります。この例では、次のユースケースに対応します。
- サービスへのトラフィックを、それを使用する必要がある他のマイクロサービスのみに制限します。
データベースへの接続を制限して、それを使用するアプリケーションのみを許可します。
apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: api-allow annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstoreここでは、以下のようになります。
<network_name>- ネットワーク割り当て定義の名前を指定します。
マルチネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。
$ oc apply -f <policy_name>.yaml -n <namespace>ここでは、以下のようになります。
<policy_name>- マルチネットワークポリシーのファイル名を指定します。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
出力例
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールのフォームから、クラスターの任意の namespace でネットワークポリシーを直接作成できます。
21.4.3.3. マルチネットワークポリシーの編集 リンクのコピーリンクがクリップボードにコピーされました!
namespace のマルチネットワークポリシーを編集できます。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが存在する namespace で作業している。
手順
オプション: namespace のマルチネットワークポリシーオブジェクトをリスト表示するには、以下のコマンドを入力します。
$ oc get multi-networkpolicyここでは、以下のようになります。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
マルチネットワークポリシーオブジェクトを編集します。
マルチネットワークポリシーの定義をファイルに保存した場合は、ファイルを編集して必要な変更を加えてから、以下のコマンドを入力します。
$ oc apply -n <namespace> -f <policy_file>.yamlここでは、以下のようになります。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
<policy_file>- ネットワークポリシーを含むファイルの名前を指定します。
マルチネットワークポリシーオブジェクトを直接更新する必要がある場合、以下のコマンドを入力できます。
$ oc edit multi-networkpolicy <policy_name> -n <namespace>ここでは、以下のようになります。
<policy_name>- ネットワークポリシーの名前を指定します。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
マルチネットワークポリシーオブジェクトが更新されていることを確認します。
$ oc describe multi-networkpolicy <policy_name> -n <namespace>ここでは、以下のようになります。
<policy_name>- マルチネットワークポリシーの名前を指定します。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールの Actions メニューのポリシーから、クラスターの任意の namespace でネットワークポリシーを直接編集できます。
21.4.3.4. CLI を使用したマルチネットワークポリシーの表示 リンクのコピーリンクがクリップボードにコピーされました!
namespace のマルチネットワークポリシーを検査できます。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが存在する namespace で作業している。
手順
namespace のマルチネットワークポリシーをリスト表示します。
namespace で定義されたマルチネットワークポリシーオブジェクトを表示するには、以下のコマンドを実行します。
$ oc get multi-networkpolicyオプション: 特定のマルチネットワークポリシーを検査するには、以下のコマンドを入力します。
$ oc describe multi-networkpolicy <policy_name> -n <namespace>ここでは、以下のようになります。
<policy_name>- 検査するマルチネットワークポリシーの名前を指定します。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールのフォームから、クラスターの任意の namespace でネットワークポリシーを直接表示できます。
21.4.3.5. CLI を使用したマルチネットワークポリシーの削除 リンクのコピーリンクがクリップボードにコピーされました!
namespace のマルチネットワークポリシーを削除できます。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが存在する namespace で作業している。
手順
マルチネットワークポリシーオブジェクトを削除するには、以下のコマンドを入力します。
$ oc delete multi-networkpolicy <policy_name> -n <namespace>ここでは、以下のようになります。
<policy_name>- マルチネットワークポリシーの名前を指定します。
<namespace>- オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
出力例
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールの Actions メニューのポリシーから、クラスターの任意の namespace でネットワークポリシーを直接削除できます。
21.4.3.6. デフォルトのすべてのマルチネットワーク拒否ポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
これは基本的なポリシーであり、他のデプロイメントされたネットワークポリシーの設定によって許可されたネットワークトラフィック以外のすべてのクロス Pod ネットワークをブロックします。この手順では、デフォルトの deny-by-default ポリシーを適用します。
cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが適用される namespace で作業していること。
手順
すべての namespace におけるすべての Pod からの Ingress を拒否する
deny-by-defaultポリシーを定義する次の YAML を作成します。YAML をdeny-by-default.yamlファイルに保存します。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: deny-by-default namespace: default1 annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>2 spec: podSelector: {}3 ingress: []4 次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f deny-by-default.yaml出力例
multinetworkpolicy.k8s.cni.cncf.io/deny-by-default created
21.4.3.7. 外部クライアントからのトラフィックを許可するマルチネットワークポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
deny-by-default ポリシーを設定すると、外部クライアントからラベル app=web を持つ Pod へのトラフィックを許可するポリシーの設定に進むことができます。
cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。
この手順に従って、パブリックインターネットから直接、またはロードバランサーを使用して Pod にアクセスすることにより、外部サービスを許可するポリシーを設定します。トラフィックは、ラベル app=web を持つ Pod にのみ許可されます。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが適用される namespace で作業していること。
手順
パブリックインターネットからのトラフィックが直接、またはロードバランサーを使用して Pod にアクセスできるようにするポリシーを作成します。YAML を
web-allow-external.yamlファイルに保存します。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-external namespace: default annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: policyTypes: - Ingress podSelector: matchLabels: app: web ingress: - {}次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-external.yaml出力例
multinetworkpolicy.k8s.cni.cncf.io/web-allow-external created
このポリシーは、次の図に示すように、外部トラフィックを含むすべてのリソースからのトラフィックを許可します。
21.4.3.8. すべての namespace からアプリケーションへのトラフィックを許可するマルチネットワークポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。
この手順に従って、すべての namespace 内のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを設定します。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが適用される namespace で作業していること。
手順
すべての namespace のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを作成します。YAML を
web-allow-all-namespaces.yamlファイルに保存します。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-all-namespaces namespace: default annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: matchLabels: app: web1 policyTypes: - Ingress ingress: - from: - namespaceSelector: {}2 注記デフォルトでは、
namespaceSelectorの指定を省略した場合、namespace は選択されません。つまり、ポリシーは、ネットワークポリシーがデプロイされている namespace からのトラフィックのみを許可します。次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-all-namespaces.yaml出力例
multinetworkpolicy.k8s.cni.cncf.io/web-allow-all-namespaces created
検証
次のコマンドを入力して、
defaultnamespace で Web サービスを開始します。$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80次のコマンドを実行して、
alpineイメージをsecondarynamespace にデプロイし、シェルを開始します。$ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- shシェルで次のコマンドを実行し、リクエストが許可されていることを確認します。
# wget -qO- --timeout=2 http://web.default予想される出力
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
21.4.3.9. namespace からアプリケーションへのトラフィックを許可するマルチネットワークポリシーの作成 リンクのコピーリンクがクリップボードにコピーされました!
cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。
特定の namespace からラベル app=web を持つ Pod へのトラフィックを許可するポリシーを設定するには、次の手順に従います。以下の場合にこれを行うことができます。
- 運用データベースへのトラフィックを、運用ワークロードがデプロイされている namespace のみに制限します。
- 特定の namespace にデプロイされた監視ツールを有効にして、現在の namespace からメトリクスをスクレイピングします。
前提条件
-
クラスターが、
NetworkPolicyオブジェクトをサポートするネットワークプラグインを使用している (例:mode: NetworkPolicyが設定された OpenShift SDN ネットワークプロバイダー)。このモードは OpenShiftSDN のデフォルトです。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてクラスターにログインしている。 - マルチネットワークポリシーが適用される namespace で作業していること。
手順
ラベルが
purpose=productionの特定の namespace 内にあるすべての Pod からのトラフィックを許可するポリシーを作成します。YAML をweb-allow-prod.yamlファイルに保存します。apiVersion: k8s.cni.cncf.io/v1beta1 kind: MultiNetworkPolicy metadata: name: web-allow-prod namespace: default annotations: k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> spec: podSelector: matchLabels: app: web1 policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: purpose: production2 次のコマンドを入力して、ポリシーを適用します。
$ oc apply -f web-allow-prod.yaml出力例
multinetworkpolicy.k8s.cni.cncf.io/web-allow-prod created
検証
次のコマンドを入力して、
defaultnamespace で Web サービスを開始します。$ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80次のコマンドを実行して、
prodnamespace を作成します。$ oc create namespace prod次のコマンドを実行して、
prodnamespace にラベルを付けます。$ oc label namespace/prod purpose=production次のコマンドを実行して、
devnamespace を作成します。$ oc create namespace dev次のコマンドを実行して、
devnamespace にラベルを付けます。$ oc label namespace/dev purpose=testing次のコマンドを実行して、
alpineイメージをdevnamespace にデプロイし、シェルを開始します。$ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- shシェルで次のコマンドを実行し、リクエストがブロックされていることを確認します。
# wget -qO- --timeout=2 http://web.default予想される出力
wget: download timed out次のコマンドを実行して、
alpineイメージをprodnamespace にデプロイし、シェルを開始します。$ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- shシェルで次のコマンドを実行し、リクエストが許可されていることを確認します。
# wget -qO- --timeout=2 http://web.default予想される出力
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>