第3章 ネットワークポリシー


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

ワークロード間のトラフィックを制限し、アプリケーションのセキュリティーを向上させるには、クラスターの NetworkPolicy オブジェクトを設定します。ネットワークポリシーは、選択された Pod に対して許可される Ingress および送信接続を定義し、名前空間内のアプリケーションを分離するのに役立ちます。

開発者は、クラスター内の Pod へのトラフィックを制限するネットワークポリシーを定義できます。

3.1.1. ネットワークポリシーについて

ワークロード間のトラフィックを制御し、ネットワークの分離性を向上させるには、プロジェクトの NetworkPolicy オブジェクトを設定してください。ネットワークポリシーは、選択した Pod に対して許可される Ingress および送信接続を定義し、クラスター内のアプリケーションのセキュリティーを確保するのに役立ちます。

デフォルトで、プロジェクトのすべての Pod は他の Pod およびネットワークのエンドポイントからアクセスできます。プロジェクトで 1 つ以上の Pod を分離するには、そのプロジェクトで NetworkPolicy オブジェクトを作成し、許可する着信接続を指定します。プロジェクト管理者は独自のプロジェクト内で NetworkPolicy オブジェクトの作成および削除を実行できます。

重要

OpenShift Container Platform 4.22 以降、OpenShift Container Platform は、一部のネームスペースに NetworkPolicy オブジェクトをデフォルトで含めるようになりました。この組み込みにより、全体的なセキュリティーが向上し、コントロールプレーンのコンポーネントがより適切に保護されます。OpenShift Container Platform がデフォルトで独自のネームスペースに含めている NetworkPolicy オブジェクトは変更しないでください。オブジェクトがデフォルトで含まれる名前空間を確認するには、次のコマンドを実行します。

$ oc get networkpolicies --all-namespaces

OpenShift Container Platform 4.22 リリースでは、これらのオブジェクトはすべての OpenShift Container Platform 名前空間に含まれていません。今後の OpenShift Container Platform リリースでは、これらのオブジェクトが追加の名前空間に含まれる可能性があります。

デフォルトでは、プロジェクト内のすべての Pod は、どのネットワークエンドポイントからもアクセス可能です。

Pod が 1 つ以上の NetworkPolicy オブジェクトのセレクターと一致する場合、Pod はそれらの NetworkPolicy オブジェクトの少なくとも 1 つにより許可された接続だけを使用できます。いずれの NetworkPolicy オブジェクトにも選択されていない Pod は、完全にアクセス可能な状態を維持します。

3.1.1.1. 政策の加法性

NetworkPolicy オブジェクトは加算されるものです。つまり、複数の NetworkPolicy オブジェクトを組み合わせて複雑なネットワーク要件を満すことができます。

たとえば、同じプロジェクト内で allow-same-namespace ポリシーと allow-http-and-https ポリシーの両方を定義した場合、role=frontend ラベルを持つ Pod は、どちらかのポリシーで許可されている接続をすべて受け入れます。

これは、Pod が以下を受け入れることを意味します。

  • 同じ名前空間内の Pod からの任意のポートへの接続。
  • 任意のネームスペース内の Pod からのポート 80 および 443 への接続。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-from-router
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          policy-group.network.openshift.io/ingress: ""
  podSelector: {}
  policyTypes:
  - Ingress

policy-group.network.openshift.io/Ingress:"" ラベルは、OVN-Kubernetes をサポートします。

クラスターの攻撃対象領域を縮小し、予測可能なネットワーク動作を確保するために、OpenShift Container Platform は重要なネットワークコンポーネントに対して最小特権ネットワークポリシーを適用します。

クラスター DNS とクラスター Ingress を管理するオペレーターは、それぞれの名前空間にデフォルトのすべて拒否 NetworkPolicy オブジェクトを自動的にインストールおよび維持します。

トラフィックは、以下の名前空間における対象を絞った許可ポリシーを使用して制御されます。

  • DNS コンポーネントの名前空間 (openshift-dns および openshift-dns-operator):

    • 送信は API サーバーと必要な DNS ポートに限定されます。
    • イングレスは、必要不可欠な DNS トラフィックとメトリクスに限定されます。
  • Ingress コンポーネントの名前空間 (openshift-Ingress および openshift-ingress-operator):

    • 送信は API サーバー、DNS ポート、およびルーティングエンドポイントに限定されます。
    • Ingress は HTTP/HTTPS トラフィックとメトリクスに限定されます。
重要

これらの名前空間では、管理対象外の Pod やカスタム Pod を実行しないでください。これらの名前空間はデフォルトで拒否するモデルで動作するため、これらの名前空間で実行されている管理対象外のコンテナーのネットワークトラフィックはすべてブロックされます。

3.1.2. OVN-Kubernetes ネットワークプラグインによるネットワークポリシーの最適化

OVN-Kubernetes のネットワークポリシーを最適化してフロー数を削減し、必要な場合に外部 IP トラフィックを許可する方法を説明します。

ネットワークポリシーを設計する場合は、以下のガイドラインを参照してください。

  • 同じ spec.podSelector 仕様を持つネットワークポリシーの場合、ingress ルールまたは egress ルールを持つ複数のネットワークポリシーを使用するよりも、複数の ingress ルールまたは egress ルールを持つ 1 つのネットワークポリシーを使用する方が効率的です。
  • podSelector または namespaceSelector 仕様に基づくすべての ingress または egress ルールは、number of pods selected by network policy + number of pods selected by ingress or egress rule に比例する数の OVS フローを生成します。そのため、Pod ごとに個別のルールを作成するのではなく、1 つのルールで必要な数の Pod を選択できる podSelector または namespaceSelector 仕様を使用することが推奨されます。

    たとえば、以下のポリシーには 2 つのルールが含まれています。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
      - from:
        - podSelector:
            matchLabels:
              role: backend

    以下のポリシーは、上記と同じ 2 つのルールを 1 つのルールとして表現しています。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: test-network-policy
    spec:
      podSelector: {}
      ingress:
      - from:
        - podSelector:
            matchExpressions:
            - {key: role, operator: In, values: [frontend, backend]}

    同じガイドラインが spec.podSelector 仕様に適用されます。異なるネットワークポリシーに同じ ingress ルールまたは egress ルールがある場合、共通の spec.podSelector 仕様で 1 つのネットワークポリシーを作成する方が効率的な場合があります。たとえば、以下の 2 つのポリシーには異なるルールがあります。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy1
    spec:
      podSelector:
        matchLabels:
          role: db
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend
    ---
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy2
    spec:
      podSelector:
        matchLabels:
          role: client
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend

    以下のネットワークポリシーは、上記と同じ 2 つのルールを 1 つのルールとして表現しています。

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: policy3
    spec:
      podSelector:
        matchExpressions:
        - {key: role, operator: In, values: [db, client]}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              role: frontend

    この最適化は、複数のセレクターを 1 つのセレクターとして表現する場合に限り適用できます。セレクターが異なるラベルに基づいている場合、この最適化は適用できない可能性があります。その場合は、ネットワークポリシーの最適化に特化して新規ラベルをいくつか適用することを検討してください。

3.1.2.1. OVN-Kubernetes の NetworkPolicy CR と外部 IP

OVN-Kubernetes では、NetworkPolicy カスタムリソース (CR) によって厳密な分離ルールが適用されます。サービスが外部 IP を使用して公開されている場合、トラフィックを許可するように明示的に設定されていない限り、ネットワークポリシーによって他の namespace からのアクセスがブロックされる可能性があります。

namespace をまたいで外部 IP へのアクセスを許可するには、必要な namespace からの Ingress を明示的に許可し、指定されたサービスポートへのトラフィックが許可されるようにする NetworkPolicy CR を作成します。必要なポートへのトラフィックを許可しなければ、アクセスが制限される可能性があります。

出力例

  apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    annotations:
    name: <policy_name>
    namespace: openshift-ingress
  spec:
    ingress:
    - ports:
      - port: 80
        protocol: TCP
    - ports:
      - port: 443
        protocol: TCP
    - from:
      - namespaceSelector:
          matchLabels:
          kubernetes.io/metadata.name: <my_namespace>
    podSelector: {}
    policyTypes:
    - Ingress

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

<policy_name>
ポリシーの名前を指定します。
<my_namespace>
ポリシーがデプロイされる namespace の名前を指定します。

詳細は、「ネットワークポリシーについて」を参照してください。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

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

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

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

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

Legal Notice

Theme

© 2026 Red Hat
トップに戻る