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


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

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

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

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

ワークロード間のトラフィックを制御し、ネットワークの分離を強化するには、プロジェクトの NetworkPolicy オブジェクトを設定します。ネットワークポリシーは、選択された Pod に対して許可される Ingress および Egress の接続を定義し、クラスター内のアプリケーションを保護するために役立ちます。

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

重要

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

$ oc get networkpolicies --all-namespaces

OpenShift Container Platform 4.22 リリースでは、これらのオブジェクトがすべての OpenShift Container Platform の namespace に含まれているわけではありません。今後の OpenShift Container Platform リリースでは、さらに多くの namespace にこれらのオブジェクトが含まれる可能性があります。

デフォルトで、プロジェクトのすべての 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 が以下を受け入れることを意味します。

  • 同じ namespace 内の Pod からの任意のポート上の接続。
  • 任意の namespace の 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 を管理する Operator は、それぞれの namespace にデフォルトの "deny-all" NetworkPolicy オブジェクトを自動的にインストールおよび維持します。

トラフィックは、次の namespace において対象を定めた "allow" ポリシーを使用して制御されます。

  • DNS コンポーネントの namespace (openshift-dns および openshift-dns-operator):

    • Egress は API サーバーと必要な DNS ポートに制限されます。
    • Ingress は重要な DNS トラフィックとメトリクスに制限されます。
  • Ingress コンポーネントの namespace (openshift-ingress および openshift-ingress-operator):

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

これらの namespace では、管理対象外またはカスタムの Pod を実行しないでください。これらの namespace は deny-by-default モデルで動作するため、これらの namespace で実行されている管理対象外コンテナーのネットワークトラフィックはブロックされます。

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
トップに戻る