3.4. マルチネットワークポリシーの設定


管理者は MultiNetworkPolicy API を使用して、セカンダリーネットワークに接続された Pod のトラフィックを管理する複数のネットワークポリシーを作成できます。たとえば、特定のポート、IP/範囲、またはラベルに基づいてトラフィックを許可または拒否するポリシーを作成できます。

マルチネットワークポリシーを使用すると、クラスター内のセカンダリーネットワーク上のトラフィックを管理できます。これらのポリシーでは、ユーザー定義ネットワークのデフォルトのクラスターネットワークまたはプライマリーネットワークを管理できません。

クラスター管理者は、以下のネットワークタイプのいずれかにマルチネットワークポリシーを設定できます。

  • Single-Root I/O Virtualization (SR-IOV)
  • MAC Virtual Local Area Network (MacVLAN)
  • IPVLAN (IP 仮想ローカルエリアネットワーク)
  • SR-IOV 上のボンディング Container Network Interface (CNI)
  • OVN-Kubernetes セカンダリーネットワーク
注記

SR-IOV セカンダリーネットワークのマルチネットワークポリシーの設定のサポートは、カーネルネットワークインターフェイスコントローラー (NIC) でのみサポートされます。SR-IOV は、データプレーン開発キット (DPDK) アプリケーションではサポートされていません。

3.4.1. マルチネットワークポリシーとネットワークポリシーの違い

MultiNetworkPolicy API は、NetworkPolicy API を実装していますが、いくつかの重要な違いがあります。

  • 以下の場合は、MultiNetworkPolicy API を使用する必要があります。

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    Copy to Clipboard Toggle word wrap
  • 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>
    Copy to Clipboard Toggle word wrap

    ここでは、以下のようになります。

    <namespace_name>
    namespace 名を指定します。
    <network_name>
    ネットワーク割り当て定義の名前を指定します。

3.4.2. クラスターのマルチネットワークポリシーの有効化

クラスター管理者は、クラスターでマルチネットワークポリシーのサポートを有効にすることができます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインする。

手順

  1. 以下の YAML で multinetwork-enable-patch.yaml ファイルを作成します。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      useMultiNetworkPolicy: true
    Copy to Clipboard Toggle word wrap
  2. マルチネットワークポリシーを有効にするようにクラスターを設定します。成功した出力には、ポリシーオブジェクトの名前と パッチ が適用されたステータスが一覧表示されます。

    $ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml
    Copy to Clipboard Toggle word wrap

3.4.3. IPv6 ネットワークでのマルチネットワークポリシーのサポート

ICMPv6 近隣探索プロトコル (NDP) は、デバイスが近隣ノードに関する情報を検出して維持できるようにするための、メッセージとプロセスのセットです。NDP は IPv6 ネットワークで重要な役割を果たし、同じリンク上のデバイス間の対話を促進します。

useMultiNetworkPolicy パラメーターが true に設定されている場合、Cluster Network Operator (CNO) はマルチネットワークポリシーの iptables 実装をデプロイします。

IPv6 ネットワークでマルチネットワークポリシーをサポートするために、Cluster Network Operator は、マルチネットワークポリシーの影響を受けるすべての Pod に次のルールのセットをデプロイします。

マルチネットワークポリシーのカスタムルール

kind: ConfigMap
apiVersion: v1
metadata:
  name: multi-networkpolicy-custom-rules
  namespace: openshift-multus
data:

  custom-v6-rules.txt: |
    # accept NDP
    -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT 
1

    -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT 
2

    # accept RA/RS
    -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT 
3

    -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT 
4
Copy to Clipboard Toggle word wrap

1
このルールは、近隣探索プロトコル (NDP) の一部である ICMPv6 ネイバー要請メッセージの受信を許可します。これらのメッセージは、近隣ノードのリンクレイヤーアドレスを決定するのに役立ちます。
2
このルールは、NDP の一部であり、送信者のリンクレイヤーアドレスに関する情報を提供する、受信 ICMPv6 近隣アドバタイズメントメッセージを許可します。
3
このルールは、ICMPv6 ルーター要請メッセージの受信を許可します。ホストは、これらのメッセージを使用してルーター設定情報を要求します。
4
このルールは、ホストに設定情報を提供する ICMPv6 ルーターアドバタイズメントメッセージの受信を許可します。
注記

これらの事前定義されたルールは編集できません。

これらのルールが集合することで、IPv6 環境でのアドレス解決やルーター通信などを含め、ネットワークが正しく機能するために不可欠な ICMPv6 トラフィックが有効になります。これらのルールが適用され、トラフィックを拒否するマルチネットワークポリシーがあれば、アプリケーションで接続の問題が発生することは考えられません。

3.4.4. マルチネットワークポリシーの使用

クラスター管理者は、マルチネットワークポリシーを作成、編集、表示、および削除することができます。

3.4.4.1. 前提条件

  • クラスターのマルチネットワークポリシーサポートを有効にしている。

3.4.4.2. CLI を使用したマルチネットワークポリシーの作成

マルチネットワークポリシーを作成し、クラスターの namespace に許可される Ingress または Egress ネットワークトラフィックを記述する詳細なルールを定義することができます。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが適用される namespace で作業していること。

手順

  1. ポリシールールを作成します。

    1. <policy_name>.yaml ファイルを作成します。

      $ touch <policy_name>.yaml
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <policy_name>
      マルチネットワークポリシーのファイル名を指定します。
    2. 作成したばかりのファイルで、以下の例のようなマルチネットワークポリシーを定義します。

      すべての 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:<namespace_name>/<network_name>
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <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: {}
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <network_name>
      ネットワーク割り当て定義の名前を指定します。

      特定の namespace から 1 つの Pod への Ingress トラフィックを許可する

      このポリシーは、namespacey で実行されている 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
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <network_name>
      ネットワーク割り当て定義の名前を指定します。

      サービスへのトラフィックを制限する

      このポリシーを適用すると、app=bookstorerole=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
        Copy to Clipboard Toggle word wrap

        ここでは、以下のようになります。

        <network_name>
        ネットワーク割り当て定義の名前を指定します。
  2. マルチネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

    $ oc apply -f <policy_name>.yaml -n <namespace>
    Copy to Clipboard Toggle word wrap

    ここでは、以下のようになります。

    <policy_name>
    マルチネットワークポリシーのファイル名を指定します。
    <namespace>
    オプションのパラメーター。現在の namespace 以外の namespace にオブジェクトを定義した場合、namespace を指定してパラメーターを指定します。

    成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

注記

cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールのフォームから、クラスターの任意の namespace でネットワークポリシーを直接作成できます。

3.4.4.3. マルチネットワークポリシーの編集

namespace のマルチネットワークポリシーを編集できます。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが存在する namespace で作業している。

手順

  1. オプション: namespace のマルチネットワークポリシーオブジェクトをリスト表示するには、以下のコマンドを入力します。

    $ oc get multi-networkpolicy
    Copy to Clipboard Toggle word wrap

    ここでは、以下のようになります。

    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
  2. マルチネットワークポリシーオブジェクトを編集します。

    • マルチネットワークポリシーの定義をファイルに保存した場合は、ファイルを編集して必要な変更を加えてから、以下のコマンドを入力します。

      $ oc apply -n <namespace> -f <policy_file>.yaml
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
      <policy_file>
      ネットワークポリシーを含むファイルの名前を指定します。
    • マルチネットワークポリシーオブジェクトを直接更新する必要がある場合、以下のコマンドを入力できます。

      $ oc edit multi-networkpolicy <policy_name> -n <namespace>
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <policy_name>
      ネットワークポリシーの名前を指定します。
      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
  3. マルチネットワークポリシーオブジェクトが更新されていることを確認します。

    $ oc describe multi-networkpolicy <policy_name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    ここでは、以下のようになります。

    <policy_name>
    マルチネットワークポリシーの名前を指定します。
    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
注記

cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールの Actions メニューのポリシーから、クラスターの任意の namespace でネットワークポリシーを直接編集できます。

3.4.4.4. CLI を使用したマルチネットワークポリシーの表示

namespace のマルチネットワークポリシーを検査できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが存在する namespace で作業している。

手順

  • namespace のマルチネットワークポリシーをリスト表示します。

    • namespace で定義されたマルチネットワークポリシーオブジェクトを表示するには、以下のコマンドを実行します。

      $ oc get multi-networkpolicy
      Copy to Clipboard Toggle word wrap
    • オプション: 特定のマルチネットワークポリシーを検査するには、以下のコマンドを入力します。

      $ oc describe multi-networkpolicy <policy_name> -n <namespace>
      Copy to Clipboard Toggle word wrap

      ここでは、以下のようになります。

      <policy_name>
      検査するマルチネットワークポリシーの名前を指定します。
      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
注記

cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールのフォームから、クラスターの任意の namespace でネットワークポリシーを直接表示できます。

3.4.4.5. CLI を使用したマルチネットワークポリシーの削除

namespace のマルチネットワークポリシーを削除できます。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが存在する namespace で作業している。

手順

  • マルチネットワークポリシーオブジェクトを削除するには、以下のコマンドを入力します。成功した出力には、ポリシーオブジェクトの名前と 削除され たステータスが一覧表示されます。

    $ oc delete multi-networkpolicy <policy_name> -n <namespace>
    Copy to Clipboard Toggle word wrap

    ここでは、以下のようになります。

    <policy_name>
    マルチネットワークポリシーの名前を指定します。
    <namespace>
    オプションのパラメーター。現在の namespace 以外の namespace にオブジェクトを定義した場合、namespace を指定してパラメーターを指定します。

    成功した出力には、ポリシーオブジェクトの名前と 削除され たステータスが一覧表示されます。

注記

cluster-admin 権限で Web コンソールにログインする場合、YAML で、または Web コンソールの Actions メニューのポリシーから、クラスターの任意の namespace でネットワークポリシーを直接削除できます。

3.4.4.6. デフォルトのすべてのマルチネットワーク拒否ポリシーの作成

このポリシーは、デプロイされた他のネットワークポリシーの設定によって許可されたネットワークトラフィックと、ホストネットワークを使用する Pod 間のトラフィック以外のすべての Pod 間ネットワークをブロックします。この手順では、my-project namespace に deny-by-default ポリシーを適用することにより、強力な拒否ポリシーを強制します。

警告

トラフィック通信を許可する NetworkPolicy カスタムリソース (CR) を設定しない場合、次のポリシーによってクラスター全体で通信問題が発生する可能性があります。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが適用される namespace で作業していること。

手順

  1. すべての 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: my-project 
    1
    
      annotations:
        k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name> 
    2
    
    spec:
      podSelector: {} 
    3
    
      policyTypes: 
    4
    
      - Ingress 
    5
    
      ingress: [] 
    6
    Copy to Clipboard Toggle word wrap
    1
    ポリシーをデプロイする namespace を指定します。たとえば、my-project namespace です。
    2
    namespace プロジェクトの名前と、それに続くネットワークアタッチメント定義名を指定します。
    3
    このフィールドが空の場合、設定はすべての Pod と一致します。したがって、ポリシーは my-project namespace 内のすべての Pod に適用されます。
    4
    NetworkPolicy が関連するルールタイプのリストを指定します。
    5
    Ingress 専用の policyTypes を指定します。
    6
    Ingress ルールを指定します。指定しない場合は、すべての Pod へのすべての着信トラフィックがドロップされます。
  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

    $ oc apply -f deny-by-default.yaml
    Copy to Clipboard Toggle word wrap

    成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

3.4.4.7. 外部クライアントからのトラフィックを許可するマルチネットワークポリシーの作成

deny-by-default ポリシーを設定すると、外部クライアントからラベル app=web を持つ Pod へのトラフィックを許可するポリシーの設定に進むことができます。

注記

cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。

この手順に従って、パブリックインターネットから直接、またはロードバランサーを使用して Pod にアクセスすることにより、外部サービスを許可するポリシーを設定します。トラフィックは、ラベル app=web を持つ Pod にのみ許可されます。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが適用される namespace で作業していること。

手順

  1. パブリックインターネットからのトラフィックが直接、またはロードバランサーを使用して 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:
        - {}
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

    $ oc apply -f web-allow-external.yaml
    Copy to Clipboard Toggle word wrap

    成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。このポリシーは、次の図に示すように、外部トラフィックを含むすべてのリソースからのトラフィックを許可します。

注記

cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。

この手順に従って、すべての namespace 内のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを設定します。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが適用される namespace で作業していること。

手順

  1. すべての 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: web 
    1
    
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {} 
    2
    Copy to Clipboard Toggle word wrap
    1
    デフォルトの namespace の app:web Pod にのみポリシーを適用します。
    2
    すべての namespace のすべての Pod を選択します。
    注記

    デフォルトでは、ポリシーオブジェクトに namespaceSelector パラメーターを指定しないと、namespace は選択されません。これは、ポリシーがネットワークポリシーがデプロイされる namespace からのトラフィックのみを許可することを意味します。

  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

    $ oc apply -f web-allow-all-namespaces.yaml
    Copy to Clipboard Toggle word wrap

    成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

検証

  1. 次のコマンドを入力して、default namespace で Web サービスを開始します。

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、alpine イメージを secondary namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  3. シェルで次のコマンドを実行し、サービスが要求を許可していることを確認します。

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    予想される出力

    <!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>
    Copy to Clipboard Toggle word wrap

注記

cluster-admin ロールを持つユーザーでログインしている場合、クラスター内の任意の namespace でネットワークポリシーを作成できます。

特定の namespace からラベル app=web を持つ Pod へのトラフィックを許可するポリシーを設定するには、次の手順に従います。以下の場合にこれを行うことができます。

  • 実稼働データベースへのトラフィックを、運用ワークロードがデプロイされている namespace のみに制限します。
  • 特定の namespace にデプロイされた監視ツールを有効にして、現在の namespace からメトリクスをスクレイピングします。

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしている。
  • マルチネットワークポリシーが適用される namespace で作業していること。

手順

  1. ラベルが 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: web 
    1
    
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production 
    2
    Copy to Clipboard Toggle word wrap
    1
    デフォルトの namespace の app:web Pod にのみポリシーを適用します。
    2
    ラベルが purpose=production の namespace 内にある Pod のみにトラフィックを制限します。
  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

    $ oc apply -f web-allow-prod.yaml
    Copy to Clipboard Toggle word wrap

    成功した出力には、ポリシーオブジェクトの名前と 作成された ステータスが一覧表示されます。

検証

  1. 次のコマンドを入力して、default namespace で Web サービスを開始します。

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、prod namespace を作成します。

    $ oc create namespace prod
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、prod namespace にラベルを付けます。

    $ oc label namespace/prod purpose=production
    Copy to Clipboard Toggle word wrap
  4. 次のコマンドを実行して、dev namespace を作成します。

    $ oc create namespace dev
    Copy to Clipboard Toggle word wrap
  5. 次のコマンドを実行して、dev namespace にラベルを付けます。

    $ oc label namespace/dev purpose=testing
    Copy to Clipboard Toggle word wrap
  6. 次のコマンドを実行して、alpine イメージを dev namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  7. シェルで次のコマンドを実行し、ブロックされた要求の理由を確認します。たとえば、予期される出力状態は wget: download timed out となっています。

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap
  8. 次のコマンドを実行して、alpine イメージを prod namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
    Copy to Clipboard Toggle word wrap
  9. シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。

    # wget -qO- --timeout=2 http://web.default
    Copy to Clipboard Toggle word wrap

    予想される出力

    <!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>
    Copy to Clipboard Toggle word wrap

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat