17.2. プライマリーネットワーク


17.2.1. ユーザー定義ネットワークについて

重要

UserDefinedNetwork はテクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。

Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。

ユーザー定義ネットワーク(UDN)を実装する前に、OpenShift Container Platform の OVN-Kubernetes CNI プラグインはプライマリーまたは メイン ネットワーク上のレイヤー 3 トポロジーのみをサポートしていました。Kubernetes の設計原則により、すべての Pod はメインネットワークに割り当てられ、すべての Pod が IP アドレスで相互に通信し、Pod 間のトラフィックはネットワークポリシーに基づいて制限されます。

UDN は、カスタムレイヤー 2、レイヤー 3、および localnet ネットワークセグメントを有効にすることで、Kubernetes Pod ネットワークのデフォルトのレイヤー 3 トポロジーの柔軟性およびセグメンテーション機能を改善します。ここでは、これらのセグメントはすべてデフォルトで分離されます。これらのセグメントは、デフォルトの OVN-Kubernetes CNI プラグインを使用するコンテナー Pod および仮想マシンのプライマリーネットワークまたはセカンダリーネットワークのいずれかとして機能します。udns は、幅広いネットワークアーキテクチャーとトポロジーを有効にし、ネットワークの柔軟性、セキュリティー、およびパフォーマンスを強化します。

注記

プライマリーネットワークとセカンダリーネットワーク両方での Localnet トポロジーのサポートが、OpenShift Container Platform の今後のバージョンで追加される予定です。

クラスター管理者は、UDN を使用して、ClusterUserDefinedNetwork カスタムリソース(CR)を利用することで、クラスターレベルの複数の namespace にまたがる追加のネットワークを作成および定義できます。さらに、クラスター管理者またはクラスターユーザーは、UDN を使用して、UserDefinedNetwork CR を使用して namespace レベルで追加のネットワークを定義できます。

以下の図は、各 namespace には単一のユーザー定義ネットワーク(UDN)が割り当てられており、各 UDN には Pod IP 割り当て用にカスタムサブネットが割り当てられている 4 つのクラスター名前空間を示しています。OVN-Kubernetes は、重複する UDN サブネットを処理します。Kubernetes ネットワークポリシーを使用しない場合、UDN に割り当てられた Pod は、その UDN の他の Pod と通信できます。デフォルトでは、これらの Pod は他の UDN に存在する Pod との通信から分離されます。マイクロセグメント化では、UDN 内でネットワークポリシーを適用できます。namespace に 1 つ以上の UDN を割り当てることができます。これには、namespace に 1 つのプライマリー UDN のみに制限があり、1 つ以上の namespace を UDN に割り当てることができます。

図17.1 UserDefinedNetwork CR を使用した名前空間の分離

ユーザー定義ネットワーク(UDN)での名前空間分離の概念

次のセクションでは、ユーザー定義ネットワークの利点と制限、UserDefinedNetwork カスタムリソースを作成する際のベストプラクティス、カスタムリソースの作成方法、およびお客様のデプロイメントに関連する可能性のある追加設定の詳細についてさらに詳しく説明します。

17.2.1.1. ユーザー定義ネットワークの利点

ユーザー定義ネットワークには次のような利点があります。

  1. セキュリティーのためのネットワーク分離の強化

    • テナントの分離: Red Hat OpenStack Platform (RHOSP) でテナントが分離される方法と同様に、namespace には独自の分離されたプライマリーネットワークを設定できます。これにより、テナント間のトラフィックのリスクが軽減され、セキュリティーが向上します。
  2. ネットワークの柔軟性

    • レイヤー 2 およびレイヤー 3 のサポート: クラスター管理者は、プライマリーネットワークをレイヤー 2 またはレイヤー 3 のネットワークタイプとして設定できます。これにより、プライマリーネットワークにセカンダリーネットワークの柔軟性が提供されます。
  3. 簡素化されたネットワーク管理

    • ネットワーク設定の複雑さの軽減: ユーザー定義ネットワークでは、異なるネットワーク内のワークロードをグループ化することで分離を実現できるため、複雑なネットワークポリシーが不要になります。
  4. 高度な機能

    • 一貫性があり選択可能な IP アドレス指定: ユーザーは、異なる namespace 間とクラスター間で IP サブネットを指定して再利用できるため、一貫性のあるネットワーク環境が実現します。
    • 複数のネットワークのサポート: ユーザー定義のネットワーク機能により、管理者は複数の namespace を単一のネットワークに接続したり、異なる namespace セットごとに個別のネットワークを作成したりできます。
  5. Red Hat OpenStack Platform (RHOSP) からのアプリケーション移行の簡素化

    • ネットワークパリティー: ユーザー定義ネットワークでは、同様のネットワーク分離および設定オプションが提供されるため、OpenStack から OpenShift Container Platform へのアプリケーションの移行が簡素化されます。

開発者と管理者は、カスタムリソースを使用して、namespace スコープのユーザー定義ネットワークを作成できます。主なプロセスは、namespace の作成、カスタムリソースの作成および設定、namespace での Pod の作成です。

17.2.1.2. UserDefinedNetwork カスタムリソースの制限

ユーザー定義ネットワーク (UDN) は高度にカスタマイズ可能なネットワーク設定オプションを提供しますが、クラスター管理者と開発者がこれらのネットワークを実装および管理する際に認識しておくべき制限があります。ユーザー定義ネットワークを実装する前に、次の制限を考慮してください。

  • DNS の制限:

    • Pod の DNS ルックアップは、クラスターのデフォルトネットワーク上の Pod の IP アドレスに解決されます。Pod がユーザー定義ネットワークの一部である場合でも、DNS ルックアップではそのユーザー定義ネットワーク上の Pod の IP アドレスは解決されません。ただし、サービスおよび外部エンティティーの DNS ルックアップは期待どおりに機能します。
    • Pod がプライマリー UDN に割り当てられると、その Pod はクラスターのデフォルトネットワーク上の Kubernetes API (KAPI) および DNS サービスにアクセスできるようになります。
  • 初期ネットワーク割り当て: Pod を作成する前に、namespace とネットワークを作成する必要があります。Pod を含む namespace を新しいネットワークに割り当てたり、既存の namespace に UDN を作成したりすることは、OVN-Kubernetes では受け入れられません。
  • ヘルスチェックの制限: Kubelet ヘルスチェックはクラスターのデフォルトネットワークによって実行されますが、Pod 上のプライマリーインターフェイスのネットワーク接続は確認されません。したがって、デフォルトネットワークでは Pod が正常に見えるものの、プライマリーインターフェイスで接続が切断されるというシナリオが、ユーザー定義ネットワークでは発生する可能性があります。
  • ネットワークポリシーの制限: ユーザー定義の異なるプライマリネットワークに接続された namespace 間のトラフィックを有効にするネットワークポリシーは効果がありません。これらのトラフィックポリシーが有効にならないのは、これらの隔離されたネットワーク間に接続性がないためです。

17.2.1.3. UserDefinedNetwork のベストプラクティス

UserDefinedNetwork (UDN) リソースを設定する前に、ユーザーは次の情報を考慮する必要があります。

  • UDN を設定するために openshift-* namespace を使用しないでください。
  • ユーザー定義ネットワークには 2 つのマスカレード IP アドレスが必要です。必要な数のネットワークを保持できる大きさになるように、マスカレードサブネットを再設定する必要があります。

    重要
    • OpenShift Container Platform 4.17 以降では、クラスターはデフォルトのマスカレードサブネットとして、IPv4 の場合は 169.254.0.0/17、IPv6 の場合は fd69::/112 を使用します。ユーザーはこれらの範囲を避ける必要があります。更新されたクラスターの場合は、デフォルトのマスカレードサブネットに変更がありません。
    • プロジェクト用のユーザー定義ネットワークが設定された後は、クラスターのマスカレードサブネットの変更はサポートされません。UDN を設定した後にマスカレードサブネットを変更しようとすると、ネットワーク接続が中断され、設定の問題が発生する可能性があります。
  • テナントが NetworkAttachmentDefinition (NAD) リソースではなく UserDefinedNetwork リソースを使用していることを確認します。これにより、テナント間でセキュリティー上のリスクが生じる可能性があります。
  • ネットワークセグメンテーションを作成するときは、UDN リソースを使用してユーザー定義のネットワークセグメンテーションを完了できない場合にのみ、NAD リソースを使用する必要があります。
  • UDN のクラスターサブネットとサービス CIDR は、デフォルトのクラスターサブネット CIDR と重複できません。OVN-Kubernetes ネットワークプラグインは、デフォルトのネットワークの参加サブネットとして 100.64.0.0/16 を使用します。UDN joinSubnets フィールドを設定する際にその値を使用しないでください。クラスターのネットワークの任意の場所でデフォルトのアドレス値が使用される場合は、joinSubnets フィールドを設定して上書きする必要があります。詳細は、「UserDefinedNetworks CR の追加設定の詳細」を参照してください。
  • UDN のクラスターサブネットとサービス CIDR は、デフォルトのクラスターサブネット CIDR と重複できません。OVN-Kubernetes ネットワークプラグインは、ネットワークのデフォルトの参加サブネットとして 100.64.0.0/16 を使用します。UDN joinSubnets フィールドを設定するためにその値を使用しないでください。クラスターのネットワークの任意の場所でデフォルトのアドレス値が使用される場合は、joinSubnets フィールドを設定してデフォルト値を上書きする必要があります。詳細は、「UserDefinedNetworks CR の追加設定の詳細」を参照してください。
  • レイヤー 2 トポロジーは、クラスター内のすべてのノードに分散される仮想スイッチを作成します。仮想マシンと Pod は、この仮想スイッチに接続して、これらのコンポーネントがすべて同じサブネット内の相互に通信できるようにします。レイヤー 2 サブネットを指定しない場合は、クラスター内の各 Pod の IP アドレスを手動で設定する必要があります。レイヤー 2 サブネットを指定しない場合、ポートセキュリティーは、メディアアクセス制御(MAC)のスプーフィングのみを防ぐように制限され、IP スプーフィングは含まれません。レイヤー 2 トポロジーは、大規模なネットワーク環境では困難になる単一のブロードキャストドメインを作成します。これにより、トポロジーによってネットワークパフォーマンスが低下するブロードキャストスツームが発生する可能性があります。
  • レイヤー 3 トポロジーは、クラスター内の各ノードに一意のレイヤー 2 セグメントを作成します。レイヤー 3 ルーティングメカニズムは、これらのセグメントを相互接続し、異なるノードでホストされている仮想マシンおよび Pod が相互に通信できるようにします。レイヤー 3 トポロジーは、各ドメインを特定ノードに割り当てることで大規模なブロードキャストドメインを効果的に管理できるため、ブロードキャストトラフィックのスコープが減少します。レイヤー 3 トポロジーを設定するには、cidr パラメーターおよび hostSubnet パラメーターを設定する必要があります。

17.2.1.4. UserDefinedNetwork カスタムリソースの作成

以下の手順では、namespace のスコープのユーザー定義ネットワークを作成します。ユースケースに基づいて、Layer2 トポロジータイプの場合は my-layer-two-udn.yaml の例、Layer3 トポロジータイプの場合は my-layer-three-udn.yaml の例を使用してリクエストを作成します。

手順

  1. Layer2 または Layer3 トポロジータイプのユーザー定義のネットワークの要求を作成します。

    1. 次の例のように、Layer2 トポロジーの要求を定義するには、my-layer-two-udn.yaml などの YAML ファイルを作成します。

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-1 1
        namespace: <some_custom_namespace>
      spec:
        topology: Layer2 2
        layer2: 3
          role: Primary 4
          subnets:
            - "10.0.0.0/24"
            - "2001:db8::/60" 5
      1
      UserDefinedNetwork リソースの名前。これは default にすべきではありません。また、Cluster Network Operator (CNO) によって作成されたグローバル namespace と重複してはなりません。
      2
      topology フィールドはネットワーク設定を記述します。受け入れられる値は Layer2Layer3 です。Layer2 トポロジータイプを指定すると、すべてのノードで共有される 1 つの論理スイッチが作成されます。
      3
      このフィールドは、トポロジー設定を指定します。layer2 または layer3 に指定できます。
      4
      Primary ロールまたは Secondary ロールを指定します。
      5
      Layer2 トポロジータイプの場合、以下は subnet フィールドの設定を指定します。
      • subnets フィールドは任意です。
      • subnets フィールドはタイプが string で、IPv4 と IPv6 の両方の標準 CIDR 形式を受け入れます。
      • subnets フィールドには 1 つまたは 2 つの項目を入力できます。2 つのアイテムは、異なるファミリーに属している必要があります。たとえば、subnets の値は 10.100.0.0/162001:db8::/64 です。
      • Layer2 サブネットは省略できます。省略すると、ユーザーは Pod の IP アドレスを設定する必要があります。結果として、ポートセキュリティーは MAC スプーフィングのみを防止します。
      • ipamLifecycle フィールドが指定されている場合、Layer2subnets フィールドは必須です。
    2. 次の例のように、Layer3 トポロジーの要求を定義するには、my-layer-three-udn.yaml などの YAML ファイルを作成します。

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-2-primary 1
        namespace: <some_custom_namespace>
      spec:
        topology: Layer3 2
        layer3: 3
          role: Primary 4
          subnets: 5
            - cidr: 10.150.0.0/16
              hostSubnet: 24
            - cidr: 2001:db8::/60
              hostSubnet: 64
      # ...
      1
      UserDefinedNetwork リソースの名前。これは default にすべきではありません。また、Cluster Network Operator (CNO) によって作成されたグローバル namespace と重複してはなりません。
      2
      topology フィールドはネットワーク設定を記述します。受け入れられる値は Layer2Layer3 です。Layer3 トポロジータイプを指定すると、ノードごとにレイヤー 2 セグメントが作成され、それぞれに異なるサブネットが割り当てられます。レイヤー 3 ルーティングは、ノードサブネットを相互接続するために使用されます。
      3
      このフィールドは、トポロジー設定を指定します。有効な値は layer2 または layer3 です。
      4
      Primary ロールまたは Secondary ロールを指定します。
      5
      Layer3 トポロジータイプの場合、subnet フィールドの設定の詳細を次に示します。
      • subnets フィールドは必須です。
      • subnets フィールドのタイプは、cidr および hostSubnet です。

        • CIDR は、クラスターの clusterNetwork 設定と同じです。CIDR の IP アドレスはユーザー定義のネットワークの Pod に分散されます。このパラメーターは、文字列値を受け入れます。
        • HostSubnet は、 ノードごとのサブネットの接頭辞を定義します。
        • IPv6 の場合、hostSubnet では /64 の長さのみがサポートされます。
  2. 次のコマンドを実行してリクエストを適用します。

    $ oc apply -f <my_layer_two_udn.yaml>

    ここでは、<my_layer_two_udn.yaml> は、Layer2 または Layer3 設定ファイルの名前です。

  3. 次のコマンドを実行して、リクエストが成功したことを確認します。

    $ oc get userdefinednetworks udn-1 -n <some_custom_namespace> -o yaml

    ここでは、some_custom_namespace は、ユーザー定義ネットワーク用に作成した namespace です。

    出力例

    apiVersion: k8s.ovn.org/v1
    kind: UserDefinedNetwork
    metadata:
      creationTimestamp: "2024-08-28T17:18:47Z"
      finalizers:
      - k8s.ovn.org/user-defined-network-protection
      generation: 1
      name: udn-1
      namespace: some-custom-namespace
      resourceVersion: "53313"
      uid: f483626d-6846-48a1-b88e-6bbeb8bcde8c
    spec:
      layer2:
        role: Primary
        subnets:
        - 10.0.0.0/24
        - 2001:db8::/60
      topology: Layer2
    status:
      conditions:
      - lastTransitionTime: "2024-08-28T17:18:47Z"
        message: NetworkAttachmentDefinition has been created
        reason: NetworkAttachmentDefinitionReady
        status: "True"
        type: NetworkReady

17.2.1.4.1. UserDefinedNetworks CR の追加設定の詳細

次の表では、UDN のオプションの追加設定を説明します。OVN-Kubernetes ネットワークトポロジーに対する明示的な要件がなく、理解していない場合は、これらのフィールドを設定することは推奨しません。

表17.1 UserDefinedNetworks のオプションの設定
フィールド説明

spec.joinSubnets

object

省略すると、プラットフォームは joinSubnets フィールドのデフォルト値を IPv4 の場合は 100.65.0.0/16、IPv6 の場合は fd99::/64 に設定します。クラスターのネットワーク内のどこかでデフォルトのアドレス値が使用されている場合は、joinSubnets フィールドを設定して上書きする必要があります。このフィールドを設定する場合は、クラスターサブネット、default ネットワーククラスターサブネット、マスカレードサブネットなど、クラスター内の他のサブネットと競合しないことを確認してください。

joinSubnets フィールドは、ユーザー定義ネットワーク内の異なるセグメント間のルーティングを設定します。デュアルスタッククラスターでは、IP ファミリーごとに 1 つずつ、合計 2 つのサブネットを設定できます。それ以外の場合は、1 つのサブネットのみが許可されます。このフィールドは Primary ネットワークに対してのみ許可されます。

spec.IPAMLifecycle

object

IPAMLifecycle フィールドは、IP アドレス管理システム (IPAM) を設定します。永続的な IP アドレスを確保するために、仮想ワークロードにこのフィールドを使用する場合があります。このフィールドは、topologylayer2 の場合に使用できます。このフィールドを指定する場合は、subnets フィールドも指定する必要があります。Persistent の値を設定すると、再起動や移行後も仮想ワークロードの IP アドレスが永続的になります。Container Network Interface (CNI) によって割り当てられ、OVN-Kubernetes によって Pod の IP アドレスをプログラムするために使用されます。Pod アノテーションの場合はこれを変更しないでください。

spec.layer2.mtu および spec.layer3.mtu

integer

最大転送単位 (MTU)。デフォルト値は 1400 です。IPv4 の境界は 574 で、IPv6 の境界は 1280 です。

17.2.2. NetworkAttachmentDefinition を使用したプライマリーネットワークの作成

次のセクションでは、NetworkAttachmentDefinition (NAD) リソースを使用して追加のプライマリーネットワークを作成および管理する方法について説明します。

17.2.2.1. 追加のネットワークを管理するためのアプローチ

NAD によって作成された追加ネットワークのライフサイクルは、次のどちらかの方法で管理できます。

  • Cluster Network Operator (CNO) 設定を変更します。この方法を使用すると、CNO によって NetworkAttachmentDefinition オブジェクトが自動的に作成および管理されます。CNO は、オブジェクトのライフサイクルを管理するだけでなく、DHCP によって割り当てられる IP アドレスを使用する追加のネットワークで DHCP が利用可能であることを確認します。
  • YAML マニフェストを適用します。この方法を使用すると、NetworkAttachmentDefinition オブジェクトを作成して追加のネットワークを直接管理できます。この方法では、Pod に追加のネットワークインターフェイスを割り当てるために複数の CNI プラグインを呼び出すことができます。

各アプローチは同時に使用できず、追加のネットワークを管理する場合に 1 つのアプローチしか使用できません。どちらのアプローチでも、追加のネットワークは、お客様が設定した Container Network Interface (CNI) プラグインによって管理されます。

注記

OVN SDN を使用して、Red Hat OpenStack Platform (RHOSP) に複数のネットワークインターフェイスを持つ OpenShift Container Platform ノードをデプロイすると、セカンダリーインターフェイスの DNS 設定がプライマリーインターフェイスの DNS 設定よりも優先される場合があります。その場合は、次のコマンドを実行して、セカンダリーインターフェイスに割り当てられているサブネット ID の DNS ネームサーバーを削除します。

$ openstack subnet set --dns-nameserver 0.0.0.0 <subnet_id>

17.2.2.2. Cluster Network Operator による追加ネットワーク割り当ての作成

Cluster Network Operator (CNO) は追加ネットワークの定義を管理します。作成する追加のネットワークを指定すると、CNO によって NetworkAttachmentDefinition CRD が自動的に作成されます。

重要

Cluster Network Operator によって管理される NetworkAttachmentDefinition CRD は編集しないでください。これを実行すると、追加ネットワークのネットワークトラフィックが中断する可能性があります。

前提条件

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

手順

  1. オプション: 追加のネットワークの namespace を作成します。

    $ oc create namespace <namespace_name>
  2. CNO 設定を編集するには、以下のコマンドを入力します。

    $ oc edit networks.operator.openshift.io cluster
  3. 以下のサンプル CR のように、作成される追加ネットワークの設定を追加して、作成している CR を変更します。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      # ...
      additionalNetworks:
      - name: tertiary-net
        namespace: namespace2
        type: Raw
        rawCNIConfig: |-
          {
            "cniVersion": "0.3.1",
            "name": "tertiary-net",
            "type": "ipvlan",
            "master": "eth1",
            "mode": "l2",
            "ipam": {
              "type": "static",
              "addresses": [
                {
                  "address": "192.168.1.23/24"
                }
              ]
            }
          }
  4. 変更を保存し、テキストエディターを終了して、変更をコミットします。

検証

  • 次のコマンドを実行して、CNO が NetworkAttachmentDefinition CRD を作成したことを確認します。CNO が CRD を作成するまでに遅延が発生する可能性があります。

    $ oc get network-attachment-definitions -n <namespace>

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

    <namespace>
    CNO の設定に追加したネットワーク割り当ての namespace を指定します。

    出力例

    NAME                 AGE
    test-network-1       14m

17.2.2.2.1. ネットワーク追加割り当ての設定

追加のネットワークは、k8s.cni.cncf.io API グループの NetworkAttachmentDefinition API を使用して設定されます。

API の設定は、以下の表で説明されています。

表17.2 NetworkAttachmentDefinition API フィールド
フィールド説明

metadata.name

string

追加のネットワークの名前です。

metadata.namespace

string

オブジェクトが関連付けられる namespace。

spec.config

string

JSON 形式の CNI プラグイン設定。

17.2.2.3. YAML マニフェストを適用した追加のネットワーク割り当ての作成

前提条件

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

手順

  1. 以下の例のように、追加のネットワーク設定を含む YAML ファイルを作成します。

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: next-net
    spec:
      config: |-
        {
          "cniVersion": "0.3.1",
          "name": "work-network",
          "type": "host-device",
          "device": "eth1",
          "ipam": {
            "type": "dhcp"
          }
        }
  2. 追加のネットワークを作成するには、次のコマンドを入力します。

    $ oc apply -f <file>.yaml

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

    <file>
    YAML マニフェストを含むファイルの名前を指定します。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.