3.2. ネットワークポリシーの作成


クラスター管理者は、namespace のネットワークポリシーを作成できます。

3.2.1. サンプル NetworkPolicy オブジェクト

次の設定は、サンプル NetworkPolicy オブジェクトにアノテーションを付けます。

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-27107
spec:
  podSelector:
    matchLabels:
      app: mongodb
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: app
    ports:
    - protocol: TCP
      port: 27017
Copy to Clipboard Toggle word wrap

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

name
NetworkPolicy オブジェクトの名前。
spec.podSelector
ポリシーが適用される Pod を説明するセレクター。ポリシーオブジェクトは NetworkPolicy オブジェクトが定義されるプロジェクトの Pod のみを選択できます。
ingress.from.podSelector
ポリシーオブジェクトが入力トラフィックを許可する Pod に一致するセレクター。セレクターは、NetworkPolicy と同じ namespace にある Pod を照合して検索します。
ingress.ports
トラフィックを受け入れる 1 つ以上の宛先ポートのリスト。

3.2.2. CLI を使用したネットワークポリシーの作成

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

注記

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

前提条件

  • クラスターが、mode: NetworkPolicy が設定された NetworkPolicy オブジェクトをサポートするネットワークプラグイン (OVN-Kubernetes ネットワークプラグインなど) を使用している。
  • OpenShift CLI (oc) がインストールされている。
  • 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 ネットワーキングをブロックします。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []
      Copy to Clipboard Toggle word wrap

      次の設定例では、同じ namespace 内のすべての Pod からの ingress トラフィックを許可します。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-same-namespace
      spec:
        podSelector:
        ingress:
        - from:
          - podSelector: {}
      # ...
      Copy to Clipboard Toggle word wrap

      次の例では、特定の namespace から 1 つの Pod への ingress トラフィックを許可します。このポリシーは、namespace-y で実行されている Pod から pod-a ラベルを持つ Pod へのトラフィックを許可します。

      kind: NetworkPolicy
      apiVersion: networking.k8s.io/v1
      metadata:
        name: allow-traffic-pod
      spec:
        podSelector:
         matchLabels:
            pod: pod-a
        policyTypes:
        - Ingress
        ingress:
        - from:
          - namespaceSelector:
              matchLabels:
                 kubernetes.io/metadata.name: namespace-y
      # ...
      Copy to Clipboard Toggle word wrap

      以下の設定例では、サービスへのトラフィックを制限します。このポリシーは、app=bookstorerole=api の両方のラベルが付いたすべての Pod にラベル app=bookstore を持つ Pod のみがアクセスできることを保証します。この例では、アプリケーションは、ラベル app=bookstore および role=api でマークされた REST API サーバーである可能性があります。

      この設定例は、以下のユースケースに対応します。

      • サービスへのトラフィックを、それを使用する必要がある他のマイクロサービスのみに制限します。
      • データベースへの接続を制限して、それを使用するアプリケーションのみを許可します。

        kind: NetworkPolicy
        apiVersion: networking.k8s.io/v1
        metadata:
          name: api-allow
        spec:
          podSelector:
            matchLabels:
              app: bookstore
              role: api
          ingress:
          - from:
              - podSelector:
                  matchLabels:
                    app: bookstore
        # ...
        Copy to Clipboard Toggle word wrap
  2. ネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。成功した出力には、ポリシーオブジェクトの名前と created ステータスがリスト表示されます。

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

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

    <policy_name>
    ネットワークポリシーファイル名を指定します。
    <namespace>
    オプションのパラメーター。現在の namespace とは異なる namespace でオブジェクトを定義した場合、パラメーターは namespace を指定します。

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

    注記

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

3.2.3. デフォルトの全拒否ネットワークポリシーの作成

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

警告

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

前提条件

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

手順

  1. すべての namespace におけるすべての Pod からの Ingress を拒否する deny-by-default ポリシーを定義する次の YAML を作成します。YAML を deny-by-default.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: deny-by-default
      namespace: my-project
    spec:
      podSelector: {}
      ingress: []
    Copy to Clipboard Toggle word wrap

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

    namespace
    ポリシーをデプロイする namespace を指定します。たとえば、my-project 名前空間です。
    podSelector
    このフィールドが空の場合、設定はすべての Pod と一致します。したがって、ポリシーは my-project namespace 内のすべての Pod に適用されます。
    ingress
    [] は、入力 ルールが指定されていないことを示します。これにより、着信トラフィックがすべての Pod にドロップされます。
  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と created ステータスがリスト表示されます。

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

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

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

注記

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

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

前提条件

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

手順

  1. パブリックインターネットからのトラフィックが直接、またはロードバランサーを使用して Pod にアクセスできるようにするポリシーを作成します。YAML を web-allow-external.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    spec:
      policyTypes:
      - Ingress
      podSelector:
        matchLabels:
          app: web
      ingress:
        - {}
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と created ステータスがリスト表示されます。

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

    このポリシーは、次の図に示すように、外部トラフィックを含むすべてのリソースからのトラフィックを許可します。

すべてのnamespaceのすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを設定できます。

注記

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

前提条件

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

手順

  1. すべての namespace のすべての Pod から特定のアプリケーションへのトラフィックを許可するポリシーを作成します。YAML を web-allow-all-namespaces.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    spec:
      podSelector:
        matchLabels:
          app: web
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {}
    Copy to Clipboard Toggle word wrap

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

    app
    デフォルトの namespace の app:web Pod にのみポリシーを適用します。
    namespaceSelector

    すべての namespace のすべての Pod を選択します。

    注記

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

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

    $ 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

特定の namespace からラベル app=web を持つ Pod へのトラフィックを許可するポリシーを設定できます。この設定は、以下のユースケースで役に立ちます。

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

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

前提条件

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

手順

  1. ラベルが purpose=production の特定の namespace 内にあるすべての Pod からのトラフィックを許可するポリシーを作成します。YAML を web-allow-prod.yaml ファイルに保存します。

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: web-allow-prod
      namespace: default
    spec:
      podSelector:
        matchLabels:
          app: web
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production
    Copy to Clipboard Toggle word wrap

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

    app
    デフォルトの namespace の app:web Pod にのみポリシーを適用します。
    目的
    ラベルが purpose=production の namespace 内にある Pod のみにトラフィックを制限します。
  2. 次のコマンドを入力して、ポリシーを適用します。成功した出力には、ポリシーオブジェクトの名前と created ステータスがリスト表示されます。

    $ 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