複数ネットワーク


OpenShift Container Platform 4.18

OpenShift Container Platform における複数のネットワークインターフェイスと仮想ルーティングの設定と管理

Red Hat OpenShift Documentation Team

概要

このドキュメントでは、OpenShift Container Platform で Virtual Routing and Forwarding を含むプライマリーネットワークとセカンダリーネットワークをセットアップおよび管理する方法を説明します。

第1章 複数ネットワークについて

デフォルトでは、OVN-Kubernetes が OpenShift Container Platform クラスターの Container Network Interface (CNI) として機能します。OpenShift Container Platform の管理者またはユーザーは、OVN-Kubernetes をクラスターのデフォルトの CNI として使用すると、ユーザー定義ネットワーク (UDN) または NetworkAttachmentDefinition (NAD) を活用して、クラスターの通常のネットワークトラフィックすべてを処理する 1 つまたは複数のデフォルトネットワークを作成できます。ユーザー定義ネットワークとネットワークアタッチメント定義は、どちらも次のネットワークタイプとして機能できます。

  • プライマリーネットワーク: Pod のプライマリーネットワークとして機能します。デフォルトでは、Pod のルートが他のネットワーク経由でトラフィックを送信するように設定されていない限り、すべてのトラフィックがプライマリーネットワークを通過します。
  • セカンダリーネットワーク: Pod の、デフォルトではないセカンダリーネットワークとして機能します。セカンダリーネットワークは、特定のトラフィックの種類または目的専用の個別のインターフェイスを提供します。セカンダリーネットワークを使用するように明示的に設定された Pod トラフィックのみが、そのインターフェイスを介してルーティングされます。

ただし、OpenShift Container Platform 管理者は、クラスターのインストール時に、Multus CNI プラグインを活用して、代替のデフォルトのセカンダリー Pod ネットワークを設定できます。Multus を使用すると、ipvlan、macvlan などの複数の CNI プラグインやネットワークアタッチメント定義を一緒に使用して、Pod のセカンダリーネットワークとして機能させることができます。

注記

ユーザー定義ネットワークは、CNI として OVN-Kubernetes が使用されている場合にのみ使用できます。他の CNI での使用はサポートされていません。

利用可能な CNI プラグインに基づいてセカンダリーネットワークを定義し、そのネットワークのうち 1 つ以上を Pod に割り当てることができます。必要に応じて、クラスターに複数のセカンダリーネットワークを定義できます。これにより、スイッチングやルーティングなどのネットワーク機能を提供する Pod を設定する際に柔軟性が得られます。

サポートされている CNI プラグインの完全なリストは、OpenShift Container Platform のセカンダリーネットワーク を参照してください。

ユーザー定義ネットワークの詳細は、ユーザー定義ネットワーク (UDN) について を参照してください。

ネットワークアタッチメント定義の詳細は、NetworkAttachmentDefinition を使用したプライマリーネットワークの作成 を参照してください。

1.1. セカンダリーネットワークの使用シナリオ

データプレーンとコントロールプレーンの分離など、ネットワークの分離が必要な状況で、セカンダリーネットワーク と呼ばれる 2 つ目のネットワークを使用できます。トラフィックの分離は、以下のようなパフォーマンスおよびセキュリティー関連の理由で必要になります。

  1. パフォーマンス

    トラフィック管理: 2 つの異なるプレーンでトラフィックを送信して、各プレーンのトラフィック量を管理できます。

  2. セキュリティー

    ネットワーク分離: セキュリティーを考慮して特別に管理されたネットワークプレーンに機密トラフィックを送信し、テナントまたは顧客間で共有してはならないプライベートデータを分離できます。

クラスターのすべての Pod はクラスター全体のデフォルトネットワークを依然として使用し、クラスター全体での接続性を維持します。すべての Pod には、クラスター全体の Pod ネットワークに割り当てられる eth0 インターフェイスがあります。Pod のインターフェイスは、oc exec -it <pod_name> -- ip a コマンドを使用して表示できます。Multus CNI を使用するセカンダリーネットワークインターフェイスを追加する場合、それらの名前は net1net2、…、netN になります。

セカンダリーネットワークを Pod に割り当てるには、インターフェイスの割り当て方法を定義する設定を作成する必要があります。各インターフェイスは、UserDefinedNetwork カスタムリソース (CR) または NetworkAttachmentDefinition CR のいずれかを使用して指定します。これらの CR のそれぞれにある CNI 設定は、インターフェイスの作成方法を定義します。

UserDefinedNetwork CR の作成の詳細は、ユーザー定義ネットワークについて を参照してください。

NetworkAttachmentDefinition CR の作成の詳細は、NetworkAttachmentDefinition を使用したプライマリーネットワークの作成 を参照してください。

1.2. OpenShift Container Platform のセカンダリーネットワーク

OpenShift Container Platform は、クラスターにセカンダリーネットワークを作成するために使用する以下の CNI プラグインを提供します。

1.3. UserDefinedNetwork および NetworkAttachmentDefinition のサポートマトリックス

UserDefinedNetwork および NetworkAttachmentDefinition カスタムリソース (CR) により、クラスター管理者とユーザーは、カスタマイズ可能なネットワーク設定の作成、独自ネットワークトポロジーの定義、ネットワーク分離の確保、ワークロードの IP アドレスの管理、高度なネットワーク機能の設定を行うことができます。3 番目の CR である ClusterUserDefinedNetwork も使用できます。これにより、管理者はクラスターレベルで複数の namespace にまたがるセカンダリーネットワークを作成および定義できます。

ユーザー定義ネットワークとネットワークアタッチメント定義は、プライマリーおよびセカンダリーネットワークインターフェイスの両方として機能することが可能で、それぞれ layer2 および layer3 のトポロジーをサポートします。3 番目のネットワークトポロジーである Localnet も、セカンダリーネットワークのネットワークアタッチメント定義でサポートされます。

注記

OpenShift Container Platform 4.18 以降では、Localnet トポロジーは UserDefinedNetwork および ClusterUserDefinedNetwork CR では使用できません。これは、セカンダリーネットワークを活用する NetworkAttachmentDefinition CR でのみ使用できます。

次のセクションでは、UserDefinedNetwork および NetworkAttachmentDefinition CR がプライマリーネットワークまたはセカンダリーネットワークとして使用される場合にサポートされる機能について説明します。ClusterUserDefinedNetwork CR 用の別のテーブルも含まれています。

Expand
表1.1 UserDefinedNetwork および NetworkAttachmentDefinition CR のプライマリーネットワークのサポートマトリックス
ネットワーク機能Layer2 トポロジーLayer3 トポロジー

east-west トラフィック

north-south トラフィック

永続的な IP

X

サービス

ルート

X

X

EgressIP リソース

マルチキャスト [1]

X

NetworkPolicy リソース [2]

MultiNetworkPolicy リソース

X

X

  1. マルチキャストは namespace で有効にする必要があり、OVN-Kubernetes ネットワーク Pod 間でのみ使用できます。マルチキャストの詳細は、「プロジェクトでのマルチキャストの有効化」を参照してください。
  2. プライマリーネットワークタイプを使用して UserDefinedNetwork CR を作成する場合、UserDefinedNetwork CR の 後に ネットワークポリシーを作成する必要があります。
Expand
表1.2 UserDefinedNetwork および NetworkAttachmentDefinition CR のセカンダリーネットワークのサポートマトリックス
ネットワーク機能Layer2 トポロジーLayer3 トポロジーLocalnet トポロジー [1]

east-west トラフィック

✓ (NetworkAttachmentDefinition CR のみ)

north-south トラフィック

X

X

✓ (NetworkAttachmentDefinition CR のみ)

永続的な IP

X

✓ (NetworkAttachmentDefinition CR のみ)

サービス

X

X

X

ルート

X

X

X

EgressIP リソース

X

X

X

マルチキャスト

X

X

X

NetworkPolicy リソース

X

X

X

MultiNetworkPolicy リソース

✓ (NetworkAttachmentDefinition CR のみ)

  1. Localnet トポロジーは、UserDefinedNetwork CR では使用できません。NetworkAttachmentDefinition CR のセカンダリーネットワークでのみサポートされます。
Expand
表1.3 ClusterUserDefinedNetwork CR のサポートマトリックス
ネットワーク機能Layer2 トポロジーLayer3 トポロジー

east-west トラフィック

north-south トラフィック

永続的な IP

X

サービス

ルート

X

X

EgressIP リソース

マルチキャスト [1]

X

MultiNetworkPolicy リソース

X

X

NetworkPolicy リソース [2]

  1. マルチキャストは namespace で有効にする必要があり、OVN-Kubernetes ネットワーク Pod 間でのみ使用できます。詳細は、「マルチキャストについて」を参照してください。
  2. プライマリーネットワークタイプを使用して ClusterUserDefinedNetwork CR を作成する場合、UserDefinedNetwork CR の 後に ネットワークポリシーを作成する必要があります。

第2章 プライマリーネットワーク

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

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

Kubernetes 設計は単純なデプロイメントには便利ですが、この Layer 3 トポロジーでは、特に最新のマルチテナントデプロイメントの場合、プライマリーネットワークセグメント設定のカスタマイズが制限されます。

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

注記

cgroupv1 Linux Control Groups (cgroup) を使用するノードは、ユーザー定義ネットワークを作成する前に、cgroupv1 から cgroupv2 に再設定する必要があります。詳細は、Linux cgroup の設定 を参照してください。

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

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

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 スコープのユーザー定義ネットワークを作成できます。プロセスの概要は次のとおりです。

  1. 管理者は、k8s.ovn.org/primary-user-defined-network ラベルを使用して、ユーザー定義ネットワークの namespace を作成します。
  2. UserDefinedNetwork CR は、クラスター管理者またはユーザーによって作成されます。
  3. ユーザーは namespace 内に Pod を作成します。

2.1.2. ユーザー定義ネットワークの制限

ユーザー定義ネットワーク (UDN) は高度にカスタマイズ可能なネットワーク設定オプションを提供しますが、クラスター管理者と開発者がこれらのネットワークを実装および管理する際に認識しておくべき制限があります。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 間のトラフィックを有効にするネットワークポリシーは効果がありません。これらのトラフィックポリシーが有効にならないのは、これらの隔離されたネットワーク間に接続性がないためです。
  • 作成および変更の制限: ClusterUserDefinedNetwork CR および UserDefinedNetwork CR は、作成後に変更することはできません。
  • デフォルトのネットワークサービスアクセス: ユーザー定義ネットワークの Pod は、デフォルトのネットワークから分離されているため、ほとんどのデフォルトのネットワークサービスにアクセスできません。たとえば、ユーザー定義ネットワークの Pod は、現在 OpenShift Container Platform イメージレジストリーにアクセスできません。この制限のため、Source-to-Image ビルドはユーザー定義ネットワークの namespace では機能しません。さらに、Git リポジトリー内のソースコードに基づいてアプリケーションを作成する機能 (oc new-app <command> など) や、Source-to-Image ビルドを使用する OpenShift Container Platform テンプレートからアプリケーションを作成する機能など、他の機能も動作しません。この制限は他の openshift-*.svc サービスにも影響する可能性があります。
  • 接続制限: ユーザー定義ネットワーク上の NodePort サービスは分離が保証されません。たとえば、同じノード上の Pod からサービスへの NodePort トラフィックにはアクセスできませんが、別のノード上の Pod からのトラフィックは成功します。

2.1.3. レイヤー 2 およびレイヤー 3 トポロジー

フラットなレイヤー 2 トポロジーでは、クラスター内のすべてのノードに分散される仮想スイッチを作成します。仮想マシンと Pod はこの仮想スイッチに接続し、これらすべてのコンポーネントが同じサブネット内で相互通信できるようにします。フラットなレイヤー 2 トポロジーは、クラスター内に存在するノード間で仮想マシンのライブマイグレーションを実行する場合に役立ちます。次の図は、ライブマイグレーションのために仮想スイッチを使用する 2 つのノードを含むフラットなレイヤー 2 トポロジーを示しています。

図2.1 コンポーネントの通信に仮想スイッチを使用するフラットなレイヤー 2 トポロジー

レイヤー 2 サブネットを指定しない場合は、クラスター内の各 Pod の IP アドレスを手動で設定する必要があります。レイヤー 2 サブネットを指定しないと、ポートのセキュリティーがメディアアクセスコントロール (MAC) スプーフィングの防止だけに限定され、IP スプーフィングが対象外になります。レイヤー 2 トポロジーでは、単一のブロードキャストドメインが作成されます。しかし、大規模なネットワーク環境では、これにより問題が発生することがあります。ブロードキャストストームが発生して、ネットワークのパフォーマンスが低下する可能性があるためです。

ネットワークの詳細な設定オプションを利用する場合は、レイヤー 2 トポロジーをユーザー定義ネットワーク (UDN) と統合できます。次の図は、各ノードに存在する Pod を含むレイヤー 2 トポロジーで UDN を使用する 2 つのノードを示しています。各ノードには、次の 2 つのインターフェイスが含まれています。

  • ノードインターフェイス。これは、ネットワークコンポーネントをノードに接続するコンピュートノードです。
  • br-ex などの Open vSwitch (OVS) ブリッジ。これは、Pod が相互に通信してリソースを共有できるように、レイヤー 2 OVN スイッチを作成します。

これら 2 つのインターフェイスは、外部スイッチによって接続されています。ゲートウェイまたはルーターにより、外部スイッチとレイヤー 2 OVN スイッチ間のルーティングトラフィックが処理されます。ノード内の仮想マシンと Pod は UDN を使用して相互に通信できます。レイヤー 2 OVN スイッチは、UDN 経由のノードトラフィックを処理します。これにより、あるノードから別のノードへの仮想マシンのライブマイグレーションが可能になります。

図2.2 レイヤー 2 トポロジーを使用するユーザー定義ネットワーク (UDN)

レイヤー 3 トポロジーでは、クラスター内の各ノードに固有のレイヤー 2 セグメントが作成されます。レイヤー 3 ルーティングメカニズムはこれらのセグメントを相互接続し、異なるノードでホストされている仮想マシンと Pod が相互に通信できるようにします。レイヤー 3 トポロジーでは、各ドメインを特定のノードに割り当てることで大規模なブロードキャストドメインを効果的に管理できるため、ブロードキャストトラフィックの範囲は小さくなっています。レイヤー 3 トポロジーを設定するには、cidr および hostSubnet パラメーターを設定する必要があります。

2.1.4. ClusterUserDefinedNetwork CR について

ClusterUserDefinedNetwork (UDN) カスタムリソース (CR) は、管理者のみにクラスタースコープのネットワークセグメンテーションと分離を提供します。

次の図は、クラスター管理者が ClusterUserDefinedNetwork CR を使用してテナント間のネットワーク分離を作成する方法を示しています。このネットワーク設定により、ネットワークを複数の namespace にまたがって構築できるようになります。この図では、udn-1udn-2 という 2 つのユーザー定義ネットワークを作成することでネットワークを分離しています。これらのネットワークは接続されておらず、spec.namespaceSelector.matchLabels フィールドを使用して異なる namespace を選択しています。たとえば、udn-1namespace-1namespace-2 の通信を設定および分離し、udn-2namespace-3namespace-4 の通信を設定および分離します。namespace を分離し、同じ namespace 内の Pod が通信できるようにすることで、分離されたテナント (Tenants 1 と Tenants 2) が作成されます。

図2.3 ClusterUserDefinedNetwork CR を使用したテナント分離

2.1.4.1. ClusterUserDefinedNetwork CR のベストプラクティス

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

  • ClusterUserDefinedNetwork CR はクラスター管理者による使用を目的としているため、管理者以外は使用しないでください。誤って使用すると、デプロイメントでセキュリティー上の問題が発生したり、中断が発生したり、クラスターネットワークが切断されたりする可能性があります。
  • ClusterUserDefinedNetwork CR で default namespace を選択しないでください。分離されず、その結果としてクラスターにセキュリティーリスクが生じる可能性があります。
  • ClusterUserDefinedNetwork CR で openshift-* namespace を選択しないでください。
  • OpenShift Container Platform 管理者は、次のいずれかの条件が満たされると、クラスターのすべての namespace が選択されることに注意する必要があります。

    • matchLabels セレクターが空のままである。
    • matchExpressions セレクターが空のままである。
    • namespaceSelector は初期化されているが、matchExpressions または matchLabel が指定されていない。例: namespaceSelector: {}
  • プライマリーネットワークの場合、ClusterUserDefinedNetwork CR に使用される namespace には、k8s.ovn.org/primary-user-defined-network ラベルが含まれている必要があります。このラベルは更新できず、namespace 作成時にのみ追加できます。k8s.ovn.org/primary-user-defined-network namespace ラベルには次の条件が適用されます。

    • namespace に k8s.ovn.org/primary-user-defined-network ラベルがなく、Pod が作成された場合、Pod はデフォルトのネットワークにアタッチされます。
    • namespace に k8s.ovn.org/primary-user-defined-network ラベルがなく、その namespace に一致するプライマリー ClusterUserDefinedNetwork CR が作成されると、エラーが報告され、ネットワークは作成されません。
    • namespace に k8s.ovn.org/primary-user-defined-network ラベルがなく、プライマリー ClusterUserDefinedNetwork CR がすでに存在する場合、その namespace 内に Pod が作成され、デフォルトのネットワークにアタッチされます。
    • namespace にラベルが あり、プライマリー ClusterUserDefinedNetwork CR が存在しない場合、ClusterUserDefinedNetwork CR が作成されるまで、その namespace に Pod は作成されません。
2.1.4.2. CLI を使用して ClusterUserDefinedNetwork CR を作成する

次の手順では、CLI を使用して ClusterUserDefinedNetwork カスタムリソース (CR) を作成します。ユースケースに基づき、Layer2 トポロジータイプの場合は cluster-layer-two-udn.yaml の例、Layer3 トポロジータイプの場合は cluster-layer-three-udn.yaml の例を使用してリクエストを作成します。

重要
  • ClusterUserDefinedNetwork CR はクラスター管理者による使用を目的としているため、管理者以外は使用しないでください。誤って使用すると、デプロイメントでセキュリティー上の問題が発生したり、中断が発生したり、クラスターネットワークが切断されたりする可能性があります。
  • OpenShift Virtualization は、Layer2 トポロジーのみをサポートします。

前提条件

  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

  1. オプション: プライマリーネットワークを使用する ClusterUserDefinedNetwork CR の場合は、次のコマンドを入力して、k8s.ovn.org/primary-user-defined-network ラベルを持つ namespace を作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: <cudn_namespace_name>
      labels:
        k8s.ovn.org/primary-user-defined-network: ""
    EOF
    Copy to Clipboard Toggle word wrap
  2. Layer2 または Layer3 トポロジータイプのクラスター全体のユーザー定義ネットワークリクエストを作成します。

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

      apiVersion: k8s.ovn.org/v1
      kind: ClusterUserDefinedNetwork
      metadata:
        name: <cudn_name> 
      1
      
      spec:
        namespaceSelector: 
      2
      
          matchLabels: 
      3
      
            "<label_1_key>": "<label_1_value>" 
      4
      
            "<label_2_key>": "<label_2_value>" 
      5
      
        network: 
      6
      
          topology: Layer2 
      7
      
          layer2: 
      8
      
            role: Primary 
      9
      
            subnets:
              - "2001:db8::/64"
              - "10.100.0.0/16" 
      10
      Copy to Clipboard Toggle word wrap
      1
      ClusterUserDefinedNetwork CR の名前。
      2
      クラスター UDN CR が適用される namespace のセットに対するラベルクエリー。標準の Kubernetes MatchLabel セレクターを使用します。デフォルト または openshift-* namespace は指定しないでください。
      3
      matchLabels セレクタータイプを使用します。このセレクタータイプでは、用語が AND 関係で評価されます。
      4 5
      matchLabels セレクタータイプが使用されているため、<label_1_key>=<label_1_value> ラベルと <label_2_key>=<label_2_value> ラベルの両方を含む namespace がプロビジョニングされます。
      6
      ネットワーク設定を記述します。
      7
      topology フィールドはネットワーク設定を記述します。受け入れられる値は Layer2Layer3 です。Layer2 トポロジータイプを指定すると、すべてのノードで共有される 1 つの論理スイッチが作成されます。
      8
      このフィールドは、トポロジー設定を指定します。layer2 または layer3 に指定できます。
      9
      Primary または Secondary を指定します。4.18 でサポートされる role 仕様は Primary のみです。
      10
      Layer2 トポロジータイプの場合、以下は subnet フィールドの設定を指定します。
      • subnets フィールドは任意です。
      • subnets フィールドはタイプが string で、IPv4 と IPv6 の両方の標準 CIDR 形式を受け入れます。
      • subnets フィールドには 1 つまたは 2 つの項目を入力できます。2 つのアイテムは、異なるファミリーに属している必要があります。たとえば、subnets の値は 10.100.0.0/162001:db8::/64 です。
      • Layer2 サブネットは省略できます。省略した場合、ユーザーは Pod の静的 IP アドレスを設定する必要があります。結果として、ポートセキュリティーは MAC スプーフィングのみを防止します。詳細は、「静的 IP アドレスを使用した Pod 設定」を参照してください。
    2. Layer3 トポロジーの要求を定義するには、次の例のように、cluster-layer-three-udn.yaml などの YAML ファイルを作成します。

      apiVersion: k8s.ovn.org/v1
      kind: ClusterUserDefinedNetwork
      metadata:
        name: <cudn_name> 
      1
      
      spec:
        namespaceSelector: 
      2
      
          matchExpressions: 
      3
      
          - key: kubernetes.io/metadata.name 
      4
      
            operator: In 
      5
      
            values: ["<example_namespace_one>", "<example_namespace_two>"] 
      6
      
        network: 
      7
      
          topology: Layer3 
      8
      
          layer3: 
      9
      
            role: Primary 
      10
      
            subnets: 
      11
      
              - cidr: 10.100.0.0/16
                hostSubnet: 24
      Copy to Clipboard Toggle word wrap
      1
      ClusterUserDefinedNetwork CR の名前。
      2
      クラスター UDN が適用される namespace セットに対するラベルクエリー。標準の Kubernetes MatchLabel セレクターを使用します。デフォルト または openshift-* namespace は指定しないでください。
      3
      matchExpressions セレクタータイプを使用します。このセレクタータイプでは、用語が OR 関係で評価されます。
      4
      照合するラベルキーを指定します。
      5
      Operator を指定します。有効な値には、InNotInExistsDoesNotExist などがあります。
      6
      matchExpressions タイプが使用されているため、<example_namespace_one> または <example_namespace_two> のいずれかに一致する namespace がプロビジョニングされます。
      7
      ネットワーク設定を記述します。
      8
      topology フィールドはネットワーク設定を記述します。受け入れられる値は Layer2Layer3 です。Layer3 トポロジータイプを指定すると、ノードごとにレイヤー 2 セグメントが作成され、それぞれに異なるサブネットが割り当てられます。レイヤー 3 ルーティングは、ノードサブネットを相互接続するために使用されます。
      9
      このフィールドは、トポロジー設定を指定します。有効な値は layer2 または layer3 です。
      10
      Primary ロールまたは Secondary ロールを指定します。4.18 でサポートされる role 仕様は Primary のみです。
      11
      Layer3 トポロジータイプの場合、subnet フィールドの設定の詳細を次に示します。
      • subnets フィールドは必須です。
      • subnets フィールドのタイプは、cidr および hostSubnet です。

        • cidr はクラスターのサブネットであり、文字列値を受け入れます。
        • hostSubnet は、クラスターサブネットが分割されるノードサブネット接頭辞を指定します。
        • IPv6 の場合、hostSubnet では /64 の長さのみがサポートされます。
  3. 次のコマンドを実行してリクエストを適用します。

    $ oc create --validate=true -f <example_cluster_udn>.yaml
    Copy to Clipboard Toggle word wrap

    この場合の <example_cluster_udn>.yamlLayer2 または Layer3 設定ファイルの名前です。

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

    $ oc get clusteruserdefinednetwork <cudn_name> -o yaml
    Copy to Clipboard Toggle word wrap

    この場合の <cudn_name> は、クラスター全体のユーザー定義ネットワークに作成した名前です。

    出力例

    apiVersion: k8s.ovn.org/v1
    kind: ClusterUserDefinedNetwork
    metadata:
      creationTimestamp: "2024-12-05T15:53:00Z"
      finalizers:
      - k8s.ovn.org/user-defined-network-protection
      generation: 1
      name: my-cudn
      resourceVersion: "47985"
      uid: 16ee0fcf-74d1-4826-a6b7-25c737c1a634
    spec:
      namespaceSelector:
        matchExpressions:
        - key: custom.network.selector
          operator: In
          values:
          - example-namespace-1
          - example-namespace-2
          - example-namespace-3
      network:
        layer3:
          role: Primary
          subnets:
          - cidr: 10.100.0.0/16
        topology: Layer3
    status:
      conditions:
      - lastTransitionTime: "2024-11-19T16:46:34Z"
        message: 'NetworkAttachmentDefinition has been created in following namespaces:
          [example-namespace-1, example-namespace-2, example-namespace-3]'
        reason: NetworkAttachmentDefinitionReady
        status: "True"
        type: NetworkCreated
    Copy to Clipboard Toggle word wrap

2.1.4.3. Web コンソールを使用した ClusterUserDefinedNetwork CR の作成

OpenShift Container Platform Web コンソールで、Layer2 トポロジーを使用した ClusterUserDefinedNetwork カスタムリソース (CR) を作成できます。

注記

現在、OpenShift Container Platform Web コンソールを使用する場合、Layer3 トポロジーを使用した ClusterUserDefinedNetwork CR を作成することはできません。

前提条件

  • cluster-admin 権限を持つユーザーとして OpenShift Container Platform Web コンソールにアクセスできる。
  • namespace を作成し、k8s.ovn.org/primary-user-defined-network ラベルを適用している。

手順

  1. Administrator パースペクティブから、NetworkingUserDefinedNetworks をクリックします。
  2. ClusterUserDefinedNetwork をクリックします。
  3. Name フィールドで、クラスタースコープの UDN の名前を指定します。
  4. Subnet フィールドに値を指定します。
  5. Project(s) Match Labels フィールドに適切なラベルを追加して、クラスター UDN が適用される namespace を選択します。
  6. Create をクリックします。クラスタースコープの UDN は、ステップ 5 で指定したラベルを含む namespace に配置された Pod のデフォルトプライマリーネットワークとして機能します。

2.1.5. UserDefinedNetwork CR について

UserDefinedNetwork (UDN) カスタムリソース (CR) は、ユーザーと管理者に高度なネットワークのセグメンテーションと分離を提供します。

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

図2.4 UserDefinedNetwork CR を使用した namespace 分離

2.1.5.1. UserDefinedNetwork CR のベストプラクティス

UserDefinedNetwork カスタムリソース (CR) を設定する前に、次の情報を考慮する必要があります。

  • UserDefinedNetwork CR の設定に openshift-* namespace は使用しないでください。
  • デフォルトの namespace に UserDefinedNetwork CR は作成しないでください。分離されず、その結果としてクラスターにセキュリティーリスクが生じる可能性があります。
  • プライマリーネットワークの場合、UserDefinedNetwork CR に使用される namespace には k8s.ovn.org/primary-user-defined-network ラベルが含まれている必要があります。このラベルは更新できず、namespace 作成時にのみ追加できます。k8s.ovn.org/primary-user-defined-network namespace ラベルには次の条件が適用されます。

    • namespace に k8s.ovn.org/primary-user-defined-network ラベルがなく、Pod が作成された場合、Pod はデフォルトのネットワークにアタッチされます。
    • namespace に k8s.ovn.org/primary-user-defined-network ラベルがなく、その namespace に一致するプライマリー UserDefinedNetwork CR が作成されると、ステータスエラーが報告され、ネットワークは作成されません。
    • namespace に k8s.ovn.org/primary-user-defined-network ラベルがなく、プライマリー UserDefinedNetwork CR がすでに存在する場合、その namespace 内に Pod が作成され、デフォルトのネットワークにアタッチされます。
    • namespace にラベルが あり、プライマリー UserDefinedNetwork CR が存在しない場合、UserDefinedNetwork CR が作成されるまで、その namespace に Pod は作成されません。
  • ユーザー定義ネットワークには 2 つのマスカレード IP アドレスが必要です。必要な数のネットワークを保持できる大きさになるように、マスカレードサブネットを再設定する必要があります。

    重要
    • OpenShift Container Platform 4.17 以降では、クラスターはデフォルトのマスカレードサブネットとして、IPv4 の場合は 169.254.0.0/17、IPv6 の場合は fd69::/112 を使用します。ユーザーはこれらの範囲を避ける必要があります。更新されたクラスターの場合は、デフォルトのマスカレードサブネットに変更がありません。
    • プロジェクト用のユーザー定義ネットワークが設定された後は、クラスターのマスカレードサブネットの変更はサポートされません。UserDefinedNetwork CR を設定した後にマスカレードサブネットを変更しようとすると、ネットワーク接続が中断され、設定の問題が発生する可能性があります。
  • テナントが NetworkAttachmentDefinition (NAD) CR ではなく UserDefinedNetwork リソースを使用していることを確認します。これにより、テナント間でセキュリティー上のリスクが生じる可能性があります。
  • ネットワークセグメンテーションを作成するときは、UserDefinedNetwork CR を使用してユーザー定義のネットワークセグメンテーションを完了できない場合にのみ、NetworkAttachmentDefinition CR を使用する必要があります。
  • UserDefinedNetwork CR のクラスターサブネットとサービス CIDR は、デフォルトのクラスターサブネット CIDR と重複できません。OVN-Kubernetes ネットワークプラグインは、ネットワークのデフォルトの結合サブネットとして 100.64.0.0/16 を使用します。この値は、UserDefinedNetwork CR の joinSubnets フィールドの設定値として使用しないでください。クラスターのネットワーク内のどこかでデフォルトのアドレス値が使用されている場合は、joinSubnets フィールドを設定してデフォルト値をオーバーライドする必要があります。詳細は、「ユーザー定義ネットワークの追加設定の詳細」を参照してください。
2.1.5.2. CLI を使用した UserDefinedNetwork CR の作成

次の手順では、namespace スコープの UserDefinedNetwork CR を作成します。ユースケースに基づき、Layer2 トポロジータイプの場合は my-layer-two-udn.yaml の例、Layer3 トポロジータイプの場合は my-layer-three-udn.yaml の例を使用してリクエストを作成します。

前提条件

  • cluster-admin 権限でログインしているか、ロールベースのアクセス制御 (RBAC) の view および edit 権限がある。

手順

  1. オプション: プライマリーネットワークを使用する UserDefinedNetwork CR の場合は、次のコマンドを入力して、k8s.ovn.org/primary-user-defined-network ラベルを持つ namespace を作成します。

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: <udn_namespace_name>
      labels:
        k8s.ovn.org/primary-user-defined-network: ""
    EOF
    Copy to Clipboard Toggle word wrap
  2. 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
      Copy to Clipboard Toggle word wrap
      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
      # ...
      Copy to Clipboard Toggle word wrap
      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 の長さのみがサポートされます。
  3. 次のコマンドを実行してリクエストを適用します。

    $ oc apply -f <my_layer_two_udn>.yaml
    Copy to Clipboard Toggle word wrap

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

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

    $ oc get userdefinednetworks udn-1 -n <some_custom_namespace> -o yaml
    Copy to Clipboard Toggle word wrap

    ここでは、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: NetworkCreated
    Copy to Clipboard Toggle word wrap

2.1.5.3. Web コンソールを使用した UserDefinedNetwork CR の作成

OpenShift Container Platform Web コンソールを使用して、Layer2 トポロジーと Primary ロールを使用した UserDefinedNetwork カスタムリソース (CR) を作成できます。

注記

現在、OpenShift Container Platform Web コンソールを使用する場合、Layer3 トポロジーまたは Secondary ロールを使用した UserDefinedNetwork CR を作成することはできません。

前提条件

  • cluster-admin 権限を持つユーザーとして OpenShift Container Platform Web コンソールにアクセスできる。
  • namespace を作成し、k8s.ovn.org/primary-user-defined-network ラベルを適用している。

手順

  1. Administrator パースペクティブから、NetworkingUserDefinedNetworks をクリックします。
  2. Create UserDefinedNetwork をクリックします。
  3. Project name リストから、以前に作成した namespace を選択します。
  4. Subnet フィールドに値を指定します。
  5. Create をクリックします。ユーザー定義ネットワークは、この namespace で作成する Pod のデフォルトのプライマリーネットワークとして機能します。

2.1.6. ユーザー定義ネットワークの追加設定の詳細

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

  1. ユーザー定義ネットワークのオプション設定
Expand

CUDN のフィールド

UDN のフィールド

説明

spec.network.<topology>.joinSubnets

spec.<topology>.joinSubnets

object

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

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

spec.network.<topology>.ipam.lifecycle

spec.<topology>.ipam.lifecycle

object

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

Persistent の値は、ipam.mode パラメーターが Enabled に設定されている場合にのみ設定できます。

spec.network.<topology>.ipam.mode

spec.network.<topology>.ipam.mode

object

mode パラメーターは、OVN-Kubernetes が IP 設定を管理する範囲を制御します。以下のオプションが利用できます。

Enabled:
有効な場合、OVN-Kubernetes は IP 設定を SDN インフラストラクチャーに適用し、選択したサブネットの IP アドレスを個々の Pod に割り当てます。これはデフォルト設定です。Enabled に設定する場合は、subnets フィールドを定義する必要があります。Enabled はデフォルトの設定です。

Disabled:
無効な場合、OVN-Kubernetes は MAC アドレスのみを割り当て、レイヤー 2 通信を提供します。これにより、ユーザーは IP アドレスを設定できます。Disabled は、レイヤー 2 (セカンダリー) ネットワークでのみ使用できます。IPAM を無効にすると、ネットワークポリシーやサービスなど、IP での Pod 選択に依存する機能が動作しなくなります。さらに、このネットワークに接続されているインターフェイスでは IP ポートセキュリティーも無効になります。spec.ipam.modeDisabled. に設定されている場合、subnets フィールドは空でなければなりません。

spec.network.<topology>.mtu

spec.<topology>.mtu

integer

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

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

<topology>
layer2 または layer3 のいずれかです。

2.1.7. ユーザー定義ネットワークのステータス条件タイプ

次の表は、リソースを記述するときに ClusterUserDefinedNetwork および UserDefinedNetwork CR に返されるステータス条件タイプを説明しています。これらの条件は、デプロイメントのトラブルシューティングに使用できます。

Expand
表2.1 NetworkCreated 条件タイプ (ClusterDefinedNetwork および UserDefinedNetwork CR)
条件タイプステータス理由とメッセージ

NetworkCreated

True

True の場合、次の理由とメッセージが返されます。

理由

メッセージ

NetworkAttachmentDefinitionCreated

'NetworkAttachmentDefinition has been created in following namespaces: [example-namespace-1, example-namespace-2, example-namespace-3]'`

NetworkCreated

False

False の場合、次のいずれかのメッセージが返されます。

理由

メッセージ

SyncError

failed to generate NetworkAttachmentDefinition

SyncError

failed to update NetworkAttachmentDefinition

SyncError

primary network already exist in namespace "<namespace_name>": "<primary_network_name>"

SyncError

failed to create NetworkAttachmentDefinition: create NAD error

SyncError

foreign NetworkAttachmentDefinition with the desired name already exist

SyncError

failed to add finalizer to UserDefinedNetwork

NetworkAttachmentDefinitionDeleted

NetworkAttachmentDefinition is being deleted: [<namespace>/<nad_name>]

Expand
表2.2 NetworkAllocationSucceeded 条件タイプ (UserDefinedNetwork CR)
条件タイプステータス理由とメッセージ

NetworkAllocationSucceeded

True

True の場合、次の理由とメッセージが返されます。

理由

メッセージ

NetworkAllocationSucceeded

Network allocation succeeded for all synced nodes.

NetworkAllocationSucceeded

False

False の場合、次のメッセージが返されます。

理由

メッセージ

InternalError

Network allocation failed for at least one node: [<node_name>], check UDN events for more info.

2.1.8. ユーザー定義のネットワーク Pod でデフォルトのネットワークポートを開く

デフォルトでは、ユーザー定義ネットワーク (UDN) 上の Pod はデフォルトネットワークから分離されています。つまり、モニタリングサービス (Prometheus または Alertmanager) や OpenShift Container Platform イメージレジストリーを実行しているデフォルトのネットワーク Pod は、UDN Pod への接続を開始できません。

デフォルトのネットワーク Pod がユーザー定義のネットワーク Pod に接続できるようにするには、k8s.ovn.org/open-default-ports アノテーションを使用できます。このアノテーションは、デフォルトネットワークからのアクセス用に、ユーザー定義ネットワーク Pod 上の特定のポートを開きます。

次の Pod 仕様では、デフォルトネットワークからのポート 80 での着信 TCP 接続とポート 53 での UDP トラフィックが許可されます。

apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.ovn.org/open-default-ports: |
      - protocol: tcp
        port: 80
      - protocol: udp
        port: 53
# ...
Copy to Clipboard Toggle word wrap
注記

開いているポートは、UDN ネットワーク IP ではなく、Pod のデフォルトネットワーク IP でアクセスできます。

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

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

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

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>
    Copy to Clipboard Toggle word wrap
  2. CNO 設定を編集するには、以下のコマンドを入力します。

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  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"
                }
              ]
            }
          }
    Copy to Clipboard Toggle word wrap
  4. 変更を保存し、テキストエディターを終了して、変更をコミットします。

検証

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

    $ oc get network-attachment-definitions -n <namespace>
    Copy to Clipboard Toggle word wrap

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

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

    出力例

    NAME                 AGE
    test-network-1       14m
    Copy to Clipboard Toggle word wrap

2.2.2.1. プライマリーネットワークアタッチメントの設定

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

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

Expand
表2.3 NetworkAttachmentDefinition API フィールド
フィールド説明

metadata.name

string

プライマリーネットワークの名前。

metadata.namespace

string

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

spec.config

string

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

2.2.3. YAML マニフェストを適用したプライマリーネットワークアタッチメントの作成

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • NAD のデプロイ先となる namespace で作業している。

手順

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

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: next-net
    spec:
      config: |-
        {
          "cniVersion": "0.3.1",
          "name": "work-network",
          "namespace": "namespace2", 
    1
    
          "type": "host-device",
          "device": "eth1",
          "ipam": {
            "type": "dhcp"
          }
        }
    Copy to Clipboard Toggle word wrap
    1
    オプション: NAD が適用される namespace を指定できます。NAD のデプロイ先となる namespace で作業している場合、この仕様は必要ありません。
  2. プライマリーネットワークを作成するには、次のコマンドを入力します。

    $ oc apply -f <file>.yaml
    Copy to Clipboard Toggle word wrap

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

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

第3章 セカンダリーネットワーク

3.1. OVN-Kubernetes でのセカンダリーネットワークの作成

クラスター管理者は、NetworkAttachmentDefinition (NAD) リソースを使用して、クラスターのセカンダリーネットワークを設定できます。

注記

セカンダリーネットワークとしてのユーザー定義ネットワークのサポートが、OpenShift Container Platform の今後のバージョンで追加される予定です。

3.1.1. OVN-Kubernetes セカンダリーネットワークの設定

Red Hat OpenShift Networking OVN-Kubernetes ネットワークプラグインを使用すると、Pod のセカンダリーネットワークインターフェイスを設定できます。セカンダリーネットワークインターフェイスを設定するには、NetworkAttachmentDefinition カスタムリソース定義 (CRD) で設定を定義する必要があります。

注記

Pod およびマルチネットワークポリシーの作成は、ノード内の OVN-Kubernetes コントロールプレーンエージェントが関連する network-attachment-definition CRD を処理するまで、保留状態のままになる場合があります。

OVN-Kubernetes セカンダリーネットワークは、レイヤー 2、レイヤー 3、または localnet トポロジーで設定できます。これらのトポロジーでサポートされる機能の詳細は、「UserDefinedNetwork および NetworkAttachmentDefinition のサポートマトリックス」を参照してください。

次のセクションでは、OVN-Kubernetes で現在セカンダリーネットワークに許可されている各トポロジーの設定例を示します。

注記

ネットワーク名は一意である必要があります。たとえば、同じネットワークを参照する異なる設定を持つ複数の NetworkAttachmentDefinition CRD の作成はサポートされていません。

3.1.1.1. OVN-Kubernetes セカンダリーネットワークのサポート対象プラットフォーム

次のサポート対象プラットフォームで OVN-Kubernetes セカンダリーネットワークを使用できます。

  • ベアメタル
  • IBM Power®
  • IBM Z®
  • IBM® LinuxONE
  • VMware vSphere
  • Red Hat OpenStack Platform (RHOSP)
3.1.1.2. OVN-Kubernetes ネットワークプラグインの JSON 設定テーブル

次の表は、OVN-Kubernetes CNI ネットワークプラグインの設定パラメーターを示しています。

Expand
表3.1 OVN-Kubernetes ネットワークプラグインの JSON 設定テーブル
フィールド説明

cniVersion

string

CNI 仕様のバージョン。必要な値は 0.3.1 です。

name

string

ネットワークの名前。このネットワークは namespace スコープではありません。たとえば、l2-network という名前のネットワークは、別の namespace に存在する NetworkAttachmentDefinition カスタムリソース (CR) によって参照できます。この設定により、別の namespace で NetworkAttachmentDefinition CR を使用する Pod が同じセカンダリーネットワークを介して通信できるようになります。ただし、NetworkAttachmentDefinition CR は、topologysubnetsmtuexcludeSubnetsvlanID などの同じネットワーク固有のパラメーターを共有する必要があります。vlanID パラメーターは、topology フィールドが localnet に設定されている場合にのみ適用されます。

type

string

設定する CNI プラグインの名前。この値は ovn-k8s-cni-overlay に設定する必要があります。

topology

string

ネットワークのトポロジー設定。layer2 または localnet のいずれかである必要があります。

subnets

string

クラスター全体のネットワークに使用するサブネット。

"topology":"layer2" デプロイメントでは、IPv6 (2001:DBB::/64) およびデュアルスタック (192.168.100.0/24,2001:DBB::/64) サブネットがサポートされています。

省略した場合、ネットワークを実装する論理スイッチはレイヤー 2 通信のみを提供し、ユーザーは Pod の IP アドレスを設定する必要があります。ポートセキュリティーは、MAC スプーフィングのみを防止します。

mtu

string

最大伝送単位 (MTU)。この値を設定しなかった場合、Cluster Network Operator (CNO) が、プライマリーネットワークインターフェイスのアンダーレイ MTU、Geneve (Generic Network Virtualization Encapsulation) などの Pod ネットワークのオーバーレイ MTU、および IPsec などの有効な機能のバイト容量の差を計算して、デフォルトの MTU 値を設定します。

netAttachDefName

string

この設定が含まれるネットワークアタッチメント定義 CRD のメタデータの namespacename。たとえば、この設定が namespace ns1 内の NetworkAttachmentDefinition CRD で l2-network という名前で定義されている場合、このフィールドは ns1/l2-network に設定する必要があります。

excludeSubnets

string

CIDR と IP アドレスのコンマ区切りのリスト。IP アドレスは割り当て可能な IP アドレスプールから削除され、Pod に渡されることはありません。

vlanID

integer

トポロジーが localnet に設定されている場合、指定された VLAN タグがこのセカンダリーネットワークからのトラフィックに割り当てられます。デフォルトでは、VLAN タグは割り当てられません。

3.1.1.3. マルチネットワークポリシーとの互換性

k8s.cni.cncf.io API グループの MultiNetworkPolicy カスタムリソース定義 (CRD) によって提供されるマルチネットワークポリシー API は、OVN-Kubernetes セカンダリーネットワークと互換性があります。ネットワークポリシーを定義する場合、使用できるネットワークポリシールールは、OVN-Kubernetes セカンダリーネットワークが subnets フィールドを定義しているかどうかによって異なります。詳細は、次の表を参照してください。

Expand
表3.2 subnets CNI 設定に基づいてサポートされるマルチネットワークポリシーセレクター
subnets フィールドの指定許可されたマルチネットワークポリシーセレクター

はい

  • podSelectornamespaceSelector
  • ipBlock

いいえ

  • ipBlock

MultiNetworkPolicy オブジェクトで k8s.v1.cni.cncf.io/policy-for アノテーションを使用することで、NetworkAttachmentDefinition (NAD) カスタムリソース (CR) を指定できます。NAD CR は、ポリシーを適用するネットワークを定義します。次のマルチネットワークポリシーの例は、blue2 という名前のセカンダリーネットワークのセカンダリーネットワーク CNI 設定で subnets フィールドが定義されている場合にのみ有効です。

Pod セレクターを使用するマルチネットワークポリシーの例

apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
  name: allow-same-namespace
  annotations:
    k8s.v1.cni.cncf.io/policy-for: blue2 
1

spec:
  podSelector:
  ingress:
  - from:
    - podSelector: {}
Copy to Clipboard Toggle word wrap

次の例では、ipBlock ネットワークポリシーセレクターを使用します。これは、OVN-Kubernetes セカンダリーネットワークに対して常に有効です。

IP ブロックセレクターを使用するマルチネットワークポリシーの例

apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
  name:  ingress-ipblock
  annotations:
    k8s.v1.cni.cncf.io/policy-for: default/flatl2net
spec:
  podSelector:
    matchLabels:
      name: access-control
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.200.0.0/30
Copy to Clipboard Toggle word wrap

3.1.1.4. localnet スイッチドトポロジーの設定

スイッチド localnet トポロジーは、ネットワークアタッチメント定義 (NAD) として作成されたワークロードを、クラスター全体の論理スイッチを介して物理ネットワークに相互接続します。

セカンダリーネットワークを ovs-bridge にマッピングして、OVN-Kubernetes セカンダリーネットワークとして使用する必要があります。ブリッジマッピングにより、ネットワークトラフィックが物理ネットワークに到達できるようになります。ブリッジマッピングは、インターフェイスラベルとも呼ばれる物理ネットワーク名を、Open vSwitch (OVS) で作成されたブリッジに関連付けます。

nmstate.io/v1 API グループの一部である NodeNetworkConfigurationPolicy (NNCP) オブジェクトを作成して、宣言的にマッピングを作成できます。この API は NMState Operator によって提供されます。この API を使用すると、指定した nodeSelector 式 (node-role.kubernetes.io/worker: '' など) に一致するノードにブリッジマッピングを適用できます。この宣言的なアプローチにより、NMState Operator は、ノードセレクターによって指定されたすべてのノードにセカンダリーネットワーク設定を自動的かつ透過的に適用します。

セカンダリーネットワークを接続する場合、既存の br-ex ブリッジを使用することも、新しいブリッジを作成することもできます。どのアプローチを使用するかは、特定のネットワークインフラストラクチャーによって異なります。次のアプローチを検討してください。

  • ノードにネットワークインターフェイスが 1 つしか含まれていない場合は、既存のブリッジを使用する必要があります。このネットワークインターフェイスは OVN-Kubernetes によって所有および管理されているため、br-ex ブリッジから削除したり、インターフェイス設定を変更したりしないでください。ネットワークインターフェイスを削除または変更すると、クラスターネットワークは正しく動作しなくなります。
  • ノードに複数のネットワークインターフェイスが含まれている場合は、別のネットワークインターフェイスを新しいブリッジに接続して、セカンダリーネットワークに使用できます。このアプローチでは、プライマリークラスターネットワークからトラフィックが分離されます。

次の例では、localnet1 ネットワークが br-ex ブリッジにマッピングされています。

ブリッジを共有するためのマッピングの例

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: mapping 
1

spec:
  nodeSelector:
    node-role.kubernetes.io/worker: '' 
2

  desiredState:
    ovn:
      bridge-mappings:
      - localnet: localnet1 
3

        bridge: br-ex 
4

        state: present 
5
Copy to Clipboard Toggle word wrap

1 1
設定オブジェクトの名前。
2
ノードネットワーク設定ポリシーを適用するノードを指定するノードセレクター。
3
トラフィックが OVS ブリッジに転送されるセカンダリーネットワークの名前。このセカンダリーネットワークは、OVN-Kubernetes セカンダリーネットワークを定義する NetworkAttachmentDefinition CRD の spec.config.name フィールドの名前と一致する必要があります。
4
ノード上の OVS ブリッジの名前。この値は、state: present を指定する場合にのみ必要です。
5
マッピングの状態。ブリッジを追加する場合は present、ブリッジを削除する場合は absent である必要があります。デフォルト値は present です。

次の JSON の例では、localnet1 という名前の localnet セカンダリーネットワークを設定します。mtu パラメーターの値は、br-ex ブリッジインターフェイスにマッピングされるセカンダリーネットワークインターフェイスに設定された MTU 値と一致する必要があることに注意してください。

{
  "cniVersion": "0.3.1",
  "name": "localnet1",
  "type": "ovn-k8s-cni-overlay",
  "topology":"localnet",
  "physicalNetworkName": "localnet1",
  "subnets": "202.10.130.112/28",
  "vlanID": 33,
  "mtu": 1500,
  "netAttachDefName": "ns1/localnet-network",
  "excludeSubnets": "10.100.200.0/29"
}
Copy to Clipboard Toggle word wrap

次の例では、localnet2 ネットワークインターフェイスが ovs-br1 ブリッジに接続されています。この接続を使って、ネットワークインターフェイスを OVN-Kubernetes ネットワークプラグインでセカンダリーネットワークとして利用できるようになります。

複数のインターフェイスを持つノードのマッピング例

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: ovs-br1-multiple-networks 
1

spec:
  nodeSelector:
    node-role.kubernetes.io/worker: '' 
2

  desiredState:
    interfaces:
    - name: ovs-br1 
3

      description: |-
        A dedicated OVS bridge with eth1 as a port
        allowing all VLANs and untagged traffic
      type: ovs-bridge
      state: up
      bridge:
        allow-extra-patch-ports: true
        options:
          stp: false
          mcast-snooping-enable: true 
4

        port:
        - name: eth1 
5

    ovn:
      bridge-mappings:
      - localnet: localnet2 
6

        bridge: ovs-br1 
7

        state: present 
8
Copy to Clipboard Toggle word wrap

1
設定オブジェクトの名前を指定します。
2
ノードネットワーク設定ポリシーが適用されるノードを識別するノードセレクターを指定します。
3
クラスタートラフィック用に OVN-Kubernetes によって使用されるデフォルトのブリッジとは別に動作する新しい OVS ブリッジを指定します。
4
マルチキャストスヌーピングを有効にするかどうかを指定します。マルチキャストスヌーピングを有効にすると、ネットワークデバイスがすべてのネットワークメンバーにマルチキャストトラフィックをフラッディングすることを防止します。デフォルトでは、OVS ブリッジはマルチキャストスヌーピングを有効にしません。デフォルト値は false です。
5
新しい OVS ブリッジに関連付けるホストシステム上のネットワークデバイスを指定します。
6
トラフィックを OVS ブリッジに転送するセカンダリーネットワークの名前を指定します。この名前は、OVN-Kubernetes セカンダリーネットワークを定義する NetworkAttachmentDefinition CRD の spec.config.name フィールドの値と一致する必要があります。
7
ノード上の OVS ブリッジの名前を指定します。値は、state: present が設定されている場合にのみ必要です。
8
マッピングの状態を指定します。有効な値は、ブリッジを追加する場合は present、ブリッジを削除する場合は absent です。デフォルト値は present です。

次の JSON の例では、localnet2 という名前の localnet セカンダリーネットワークを設定します。mtu パラメーターの値は、eth1 セカンダリーネットワークインターフェイスに設定された MTU 値と一致する必要があることに注意してください。

{
  "cniVersion": "0.3.1",
  "name": "localnet2",
  "type": "ovn-k8s-cni-overlay",
  "topology":"localnet",
  "physicalNetworkName": "localnet2",
  "subnets": "202.10.130.112/28",
  "vlanID": 33,
  "mtu": 1500,
  "netAttachDefName": "ns1/localnet-network",
  "excludeSubnets": "10.100.200.0/29"
}
Copy to Clipboard Toggle word wrap
3.1.1.4.1. レイヤー 2 スイッチドトポロジーの設定

スイッチド (レイヤー 2) トポロジーネットワークは、クラスター全体の論理スイッチを介してワークロードを相互接続します。この設定は、IPv6 およびデュアルスタックデプロイメントに使用できます。

注記

レイヤー 2 スイッチドトポロジーネットワークでは、クラスター内の Pod 間のデータパケットの転送のみが許可されます。

次の JSON 例では、スイッチドセカンダリーネットワークを設定します。

{
  "cniVersion": "0.3.1",
  "name": "l2-network",
  "type": "ovn-k8s-cni-overlay",
  "topology":"layer2",
  "subnets": "10.100.200.0/24",
  "mtu": 1300,
  "netAttachDefName": "ns1/l2-network",
  "excludeSubnets": "10.100.200.0/29"
}
Copy to Clipboard Toggle word wrap
3.1.1.5. セカンダリーネットワーク用の Pod の設定

k8s.v1.cni.cncf.io/networks アノテーションを使用して、セカンダリーネットワーク割り当てを指定する必要があります。

次の例では、このガイドに示されている割り当て設定ごとに 1 つずつ、2 つのセカンダリー割り当てを持つ Pod をプロビジョニングします。

apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.v1.cni.cncf.io/networks: l2-network
  name: tinypod
  namespace: ns1
spec:
  containers:
  - args:
    - pause
    image: k8s.gcr.io/e2e-test-images/agnhost:2.36
    imagePullPolicy: IfNotPresent
    name: agnhost-container
Copy to Clipboard Toggle word wrap
3.1.1.6. 静的 IP アドレスを使用して Pod を設定する

次の例では、静的 IP アドレスを使用して Pod をプロビジョニングします。

注記
  • セカンダリーネットワークアタッチメント (namespace スコープのオブジェクト) がレイヤー 2 または localnet トポロジーを使用している場合にのみ、Pod のセカンダリーネットワークアタッチメントの IP アドレスを指定できます。
  • Pod の静的 IP アドレスを指定できるのは、割り当て設定にサブネットが含まれていない場合のみです。
apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.v1.cni.cncf.io/networks: '[
      {
        "name": "l2-network", 
1

        "mac": "02:03:04:05:06:07", 
2

        "interface": "myiface1", 
3

        "ips": [
          "192.0.2.20/24"
          ] 
4

      }
    ]'
  name: tinypod
  namespace: ns1
spec:
  containers:
  - args:
    - pause
    image: k8s.gcr.io/e2e-test-images/agnhost:2.36
    imagePullPolicy: IfNotPresent
    name: agnhost-container
Copy to Clipboard Toggle word wrap
1
ネットワークの名前。この値は、すべての NetworkAttachmentDefinition CRD にわたって一意である必要があります。
2
インターフェイスに割り当てられる MAC アドレス。
3
Pod 用に作成されるネットワークインターフェイスの名前。
4
ネットワークインターフェイスに割り当てられる IP アドレス。

3.2. 他の CNI プラグインを使用したセカンダリーネットワークの作成

次のセクションでは、セカンダリーネットワーク用の特定の設定フィールドを説明します。

3.2.1. ブリッジセカンダリーネットワークの設定

次のオブジェクトは、Bridge CNI プラグインの設定パラメーターを説明します。

Expand
表3.3 Bridge CNI プラグイン JSON 設定オブジェクト
フィールド説明

cniVersion

string

CNI 仕様のバージョン。値 0.3.1 が必要です。

name

string

CNO 設定に以前に指定した name パラメーターの値。

type

string

設定する CNI プラグインの名前: bridge

ipam

object

IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。

bridge

string

オプション: 使用する仮想ブリッジの名前を指定します。ブリッジインターフェイスがホストに存在しない場合は、これが作成されます。デフォルト値は cni0 です。

ipMasq

boolean

オプション: 仮想ネットワークから外すトラフィックの IP マスカレードを有効にするには、true に設定します。すべてのトラフィックの送信元 IP アドレスは、ブリッジの IP アドレスに書き換えられます。ブリッジに IP アドレスがない場合は、この設定は影響を与えません。デフォルト値は false です。

isGateway

boolean

オプション: IP アドレスをブリッジに割り当てるには true に設定します。デフォルト値は false です。

isDefaultGateway

boolean

オプション: ブリッジを仮想ネットワークのデフォルトゲートウェイとして設定するには、true に設定します。デフォルト値は false です。isDefaultGatewaytrue に設定される場合、isGateway も自動的に true に設定されます。

forceAddress

boolean

オプション: 仮想ブリッジの事前に割り当てられた IP アドレスの割り当てを許可するには、true に設定します。false に設定される場合、重複サブセットの IPv4 アドレスまたは IPv6 アドレスが仮想ブリッジに割り当てられるとエラーが発生します。デフォルト値は false です。

hairpinMode

boolean

オプション: 仮想ブリッジが受信時に使用した仮想ポートでイーサネットフレームを送信できるようにするには、true に設定します。このモードは、Reflective Relay (リフレクティブリレー) としても知られています。デフォルト値は false です。

promiscMode

boolean

オプション: ブリッジで無作為検出モード (Promiscuous Mode) を有効にするには、true に設定します。デフォルト値は false です。

vlan

string

オプション: 仮想 LAN (VLAN) タグを整数値として指定します。デフォルトで、VLAN タグは割り当てません。

preserveDefaultVlan

string

オプション: デフォルトの VLAN をブリッジに接続されている veth 側で保持する必要があるか示します。デフォルトは true です。

vlanTrunk

list

オプション: VLAN トランクタグを割り当てます。デフォルト値は none です。

mtu

integer

オプション: 最大転送単位 (MTU) を指定された値に設定します。デフォルト値はカーネルによって自動的に設定されます。

enabledad

boolean

オプション: コンテナー側の veth の重複アドレス検出を有効にします。デフォルト値は false です。

macspoofchk

boolean

オプション: MAC スプーフィングチェックを有効にして、コンテナーから発信されるトラフィックをインターフェイスの MAC アドレスに制限します。デフォルト値は false です。

注記

VLAN パラメーターは、veth のホスト側に VLAN タグを設定し、ブリッジインターフェイスで vlan_filtering 機能を有効にします。

注記

L2 ネットワークのアップリンクを設定するには、次のコマンドを使用してアップリンクインターフェイスで VLAN を許可する必要があります。

$  bridge vlan add vid VLAN_ID dev DEV
Copy to Clipboard Toggle word wrap
3.2.1.1. ブリッジ CNI プラグインの設定例

次の例では、bridge-net という名前のセカンダリーネットワークを設定します。

{
  "cniVersion": "0.3.1",
  "name": "bridge-net",
  "type": "bridge",
  "isGateway": true,
  "vlan": 2,
  "ipam": {
    "type": "dhcp"
    }
}
Copy to Clipboard Toggle word wrap

3.2.2. Bond CNI セカンダリーネットワークの設定

Bond Container Network Interface (Bond CNI) を使用すると、複数のネットワークインターフェイスを、コンテナー内の 1 つの論理的な "ボンディングされた" インターフェイスに集約できます。これにより、ネットワークの冗長性とフォールトトレランスが向上します。このプラグインを使用したボンディングでは、SR-IOV Virtual Function (VF) のみがサポートされます。

次の表は、Bond CNI プラグインの設定パラメーターを示しています。

Expand
表3.4 Bond CNI プラグインの JSON 設定オブジェクト
フィールド説明

name

string

この CNI ネットワークアタッチメント定義に付ける名前を指定します。この名前は、コンテナー内のインターフェイスを識別および参照するために使用されます。

cniVersion

string

CNI 仕様のバージョン。

type

string

設定する CNI プラグインの名前を指定します (bond)。

miimon

string

Address Resolution Protocol (ARP) のリンク監視頻度をミリ秒単位で指定します。このパラメーターは、集約されたインターフェイスの可用性を確認するために、ボンディングインターフェイスが ARP 要求を送信する頻度を定義します。

mtu

integer

オプション: ボンディングの最大転送単位 (MTU) を指定します。デフォルトは 1500 です。

failOverMac

integer

オプション: ボンディングの failOverMac 設定を指定します。デフォルトは 0 です。

mode

string

ボンディングポリシーを指定します。

linksInContainer

boolean

オプション: ボンディング対象のネットワークインターフェイスが、ボンディングの開始時に、コンテナーのネットワーク namespace 内に直接作成され、使用可能な状態になっていることを前提とするかどうかを指定します。デフォルトの false の場合、CNI プラグインはボンディングの作成を試みる前に、ホストシステム上でこれらのインターフェイスを検索します。

links

object

ボンディングするインターフェイスを指定します。

ipam

object

IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。

3.2.2.1. Bond CNI プラグインの設定例

次の例では、bond-net1 という名前のセカンダリーネットワークを設定します。

{
 "type": "bond",
 "cniVersion": "0.3.1",
 "name": "bond-net1",
 "mode": "active-backup",
 "failOverMac": 1,
 "linksInContainer": true,
 "miimon": "100",
 "mtu": 1500,
 "links": [
       {"name": "net1"},
       {"name": "net2"}
   ],
  "ipam": {
        "type": "host-local",
        "subnet": "10.56.217.0/24",
        "routes": [{
        "dst": "0.0.0.0/0"
        }],
        "gateway": "10.56.217.1"
    }
}
Copy to Clipboard Toggle word wrap

3.2.3. ホストデバイスのセカンダリーネットワークの設定

注記

devicehwaddrkernelpath、または pciBusID のいずれかのパラメーターを設定してネットワークデバイスを指定します。

以下のオブジェクトは、ホストデバイス CNI プラグインの設定パラメーターを説明しています。

Expand
表3.5 ホストデバイス CNI プラグイン JSON 設定オブジェクト
フィールド説明

cniVersion

string

CNI 仕様のバージョン。値 0.3.1 が必要です。

name

string

CNO 設定に以前に指定した name パラメーターの値。

type

string

設定する CNI プラグインの名前: host-device

device

string

オプション: eth0 などのデバイスの名前。

hwaddr

string

オプション: デバイスハードウェアの MAC アドレス。

kernelpath

string

オプション: /sys/devices/pci0000:00/0000:00:1f.6 などの Linux カーネルデバイス。

pciBusID

string

オプション: 0000:00:1f.6 などのネットワークデバイスの PCI アドレスを指定します。

3.2.3.1. ホストデバイス設定例

次の例では、hostdev-net という名前のセカンダリーネットワークを設定します。

{
  "cniVersion": "0.3.1",
  "name": "hostdev-net",
  "type": "host-device",
  "device": "eth1"
}
Copy to Clipboard Toggle word wrap

3.2.4. VLAN セカンダリーネットワークの設定

次のオブジェクトは、VLAN、vlan、CNI プラグインの設定パラメーターを示しています。

Expand
表3.6 VLAN CNI プラグイン JSON 設定オブジェクト
フィールド説明

cniVersion

string

CNI 仕様のバージョン。値 0.3.1 が必要です。

name

string

CNO 設定に以前に指定した name パラメーターの値。

type

string

設定する CNI プラグインの名前: vlan

master

string

ネットワーク割り当てに関連付けるイーサネットインターフェイス。master が指定されない場合、デフォルトのネットワークルートのインターフェイスが使用されます。

vlanId

integer

VLAN の ID を設定します。

ipam

object

IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。

mtu

integer

オプション: 最大転送単位 (MTU) を指定された値に設定します。デフォルト値はカーネルによって自動的に設定されます。

dns

integer

オプション: 返される DNS 情報。たとえば、DNS ネームサーバーの優先順位順リストなどです。

linkInContainer

boolean

オプション: master インターフェイスがコンテナーネットワーク namespace にあるか、メインネットワーク namespace にあるかを指定します。コンテナー namespace の master インターフェイスの使用を要求するには、値を true に設定します。

重要

vlan 設定を持つ NetworkAttachmentDefinition カスタムリソース定義 (CRD) は、ノード内の単一の Pod でのみ使用できます。CNI プラグインは、同じ master インターフェイス上に同じ vlanId を持つ vlan サブインターフェイスを複数作成できないためです。

3.2.4.1. VLAN 設定例

次の例は、vlan-net という名前のセカンダリーネットワークを含む vlan 設定を示しています。

{
  "name": "vlan-net",
  "cniVersion": "0.3.1",
  "type": "vlan",
  "master": "eth0",
  "mtu": 1500,
  "vlanId": 5,
  "linkInContainer": false,
  "ipam": {
      "type": "host-local",
      "subnet": "10.1.1.0/24"
  },
  "dns": {
      "nameservers": [ "10.1.1.1", "8.8.8.8" ]
  }
}
Copy to Clipboard Toggle word wrap

3.2.5. IPVLAN セカンダリーネットワークの設定

次のオブジェクトは、IPVLAN、ipvlan、CNI プラグインの設定パラメーターを示しています。

Expand
表3.7 IPVLAN CNI プラグイン JSON 設定オブジェクト
フィールド説明

cniVersion

string

CNI 仕様のバージョン。値 0.3.1 が必要です。

name

string

CNO 設定に以前に指定した name パラメーターの値。

type

string

設定する CNI プラグインの名前: ipvlan

ipam

object

IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。これは、プラグインが連鎖している場合を除き必要です。

mode

string

オプション: 仮想ネットワークの操作モードを指定します。この値は、l2l3、または l3s である必要があります。デフォルト値は l2 です。

master

string

オプション: ネットワーク割り当てに関連付けるイーサネットインターフェイスを指定します。master が指定されない場合、デフォルトのネットワークルートのインターフェイスが使用されます。

mtu

integer

オプション: 最大転送単位 (MTU) を指定された値に設定します。デフォルト値はカーネルによって自動的に設定されます。

linkInContainer

boolean

オプション: master インターフェイスがコンテナーネットワーク namespace にあるか、メインネットワーク namespace にあるかを指定します。コンテナー namespace の master インターフェイスの使用を要求するには、値を true に設定します。

重要
  • ipvlan オブジェクトは、仮想インターフェイスが master インターフェイスと通信することを許可しません。したがって、コンテナーは ipvlan インターフェイスを使用してホストに到達できません。コンテナーが、Precision Time Protocol (PTP) をサポートするネットワークなど、ホストへの接続を提供するネットワークに参加していることを確認してください。
  • 1 つの master インターフェイスを、macvlanipvlan の両方を同時に使用するように設定することはできません。
  • インターフェイスに依存できない IP 割り当てスキームの場合、ipvlan プラグインは、このロジックを処理する以前のプラグインと連鎖させることができます。master が省略された場合、前の結果にはスレーブにする ipvlan プラグインのインターフェイス名が 1 つ含まれていなければなりません。ipam が省略された場合、ipvlan インターフェイスの設定には前の結果が使用されます。
3.2.5.1. IPVLAN CNI プラグインの設定例

次の例では、ipvlan-net という名前のセカンダリーネットワークを設定します。

{
  "cniVersion": "0.3.1",
  "name": "ipvlan-net",
  "type": "ipvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "l3",
  "ipam": {
    "type": "static",
    "addresses": [
       {
         "address": "192.168.10.10/24"
       }
    ]
  }
}
Copy to Clipboard Toggle word wrap

3.2.6. MACVLAN セカンダリーネットワークの設定

以下のオブジェクトは、MAC 仮想 LAN (MACVLAN) Container Network Interface (CNI) プラグインの設定パラメーターを説明しています。

Expand
表3.8 MACVLAN CNI プラグイン JSON 設定オブジェクト
フィールド説明

cniVersion

string

CNI 仕様のバージョン。値 0.3.1 が必要です。

name

string

CNO 設定に以前に指定した name パラメーターの値。

type

string

設定する CNI プラグインの名前: macvlan

ipam

object

IPAM CNI プラグインの設定オブジェクト。プラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。

mode

string

オプション: 仮想ネットワークのトラフィックの可視性を設定します。bridgepassthruprivate、または vepa のいずれかである必要があります。値が指定されない場合、デフォルト値は bridge になります。

master

string

オプション: 新しく作成された macvlan インターフェイスに関連付けるホストネットワークインターフェイス。値が指定されていない場合は、デフォルトのルートインターフェイスが使用されます。

mtu

integer

オプション: 指定された値への最大転送単位 (MTU)。デフォルト値はカーネルによって自動的に設定されます。

linkInContainer

boolean

オプション: master インターフェイスがコンテナーネットワーク namespace にあるか、メインネットワーク namespace にあるかを指定します。コンテナー namespace の master インターフェイスの使用を要求するには、値を true に設定します。

注記

プラグイン設定の master キーを指定する場合は、競合の可能性を回避するために、プライマリーネットワークプラグインに関連付けられているものとは異なる物理ネットワークインターフェイスを使用してください。

3.2.6.1. MACVLAN CNI プラグイン設定の例

次の例では、macvlan-net という名前のセカンダリーネットワークを設定します。

{
  "cniVersion": "0.3.1",
  "name": "macvlan-net",
  "type": "macvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "bridge",
  "ipam": {
    "type": "dhcp"
    }
}
Copy to Clipboard Toggle word wrap

3.2.7. TAP セカンダリーネットワークの設定

以下のオブジェクトは、TAP CNI プラグインの設定パラメーターを説明しています。

Expand
表3.9 TAP CNI プラグイン JSON 設定オブジェクト
フィールド説明

cniVersion

string

CNI 仕様のバージョン。値 0.3.1 が必要です。

name

string

CNO 設定に以前に指定した name パラメーターの値。

type

string

設定する CNI プラグインの名前: tap

mac

string

オプション: インターフェイスの指定された MAC アドレスを要求します。

mtu

integer

オプション: 最大転送単位 (MTU) を指定された値に設定します。デフォルト値はカーネルによって自動的に設定されます。

selinuxcontext

string

オプション: タップデバイスに関連付ける SELinux コンテキスト。

注記

OpenShift Container Platform には、値 system_u:system_r:container_t:s0 が必要です。

multiQueue

boolean

オプション: マルチキューを有効にするには true に設定します。

owner

integer

オプション: タップデバイスを所有するユーザー。

group

integer

オプション: タップデバイスを所有するグループ。

bridge

string

オプション: タップデバイスを既存のブリッジのポートとして設定します。

3.2.7.1. Tap 設定の例

次の例では、mynet という名前のセカンダリーネットワークを設定します。

{
 "name": "mynet",
 "cniVersion": "0.3.1",
 "type": "tap",
 "mac": "00:11:22:33:44:55",
 "mtu": 1500,
 "selinuxcontext": "system_u:system_r:container_t:s0",
 "multiQueue": true,
 "owner": 0,
 "group": 0
 "bridge": "br1"
}
Copy to Clipboard Toggle word wrap
3.2.7.2. TAP CNI プラグインの SELinux ブール値の設定

container_t SELinux コンテキストを使用してタップデバイスを作成するには、Machine Config Operator (MCO) を使用してホスト上で container_use_devices ブール値を有効にします。

前提条件

  • OpenShift CLI (oc) がインストールされている。

手順

  1. 次の詳細を含む、setsebool-container-use-devices.yaml などの名前の新しい YAML ファイルを作成します。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 99-worker-setsebool
    spec:
      config:
        ignition:
          version: 3.2.0
        systemd:
          units:
          - enabled: true
            name: setsebool.service
            contents: |
              [Unit]
              Description=Set SELinux boolean for the TAP CNI plugin
              Before=kubelet.service
    
              [Service]
              Type=oneshot
              ExecStart=/usr/sbin/setsebool container_use_devices=on
              RemainAfterExit=true
    
              [Install]
              WantedBy=multi-user.target graphical.target
    Copy to Clipboard Toggle word wrap
  2. 次のコマンドを実行して、新しい MachineConfig オブジェクトを作成します。

    $ oc apply -f setsebool-container-use-devices.yaml
    Copy to Clipboard Toggle word wrap
    注記

    MachineConfig オブジェクトに変更を適用すると、変更が適用された後、影響を受けるすべてのノードが正常に再起動します。この更新が適用されるまでに、時間がかかる場合があります。

  3. 次のコマンドを実行して、変更が適用されていることを確認します。

    $ oc get machineconfigpools
    Copy to Clipboard Toggle word wrap

    予想される出力

    NAME        CONFIG                                                UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master      rendered-master-e5e0c8e8be9194e7c5a882e047379cfa      True      False      False      3              3                   3                     0                      7d2h
    worker      rendered-worker-d6c9ca107fba6cd76cdcbfcedcafa0f2      True      False      False      3              3                   3                     0                      7d
    Copy to Clipboard Toggle word wrap

    注記

    すべてのノードが更新され、準備完了状態になっている必要があります。

3.2.8. セカンダリーネットワークで route-override プラグインを使用してルートを設定する

次のオブジェクトは、route-override CNI プラグインの設定パラメーターを示しています。

Expand
表3.10 Route override CNI プラグイン JSON 設定オブジェクト
フィールド説明

type

string

設定する CNI プラグインの名前: route-override

flushroutes

boolean

オプション: 既存ルートをフラッシュするには true に設定します。

flushgateway

boolean

オプション: デフォルトルート、つまりゲートウェイルートをフラッシュするには true に設定します。

delroutes

object

オプション: コンテナー namespace から削除するルートのリストを指定します。

addroutes

object

オプション: コンテナー namespace に追加するルートのリストを指定します。各ルートは、dst フィールドとオプションの gw フィールドを含むディクショナリーです。gw が省略されている場合、プラグインはデフォルトのゲートウェイ値を使用します。

skipcheck

boolean

オプション: check コマンドをスキップするには、これを true に設定します。デフォルトでは、CNI プラグインはコンテナーのライフサイクル中にネットワーク設定を検証します。route-override を使用してルートを動的に変更する場合、このチェックをスキップすると、最終設定に更新されたルートが確実に反映されます。

3.2.8.1. route-override プラグインの設定例

route-override CNI は、親 CNI と連鎖して使用するように設計された CNI タイプです。独立して動作するのではなく、まず親 CNI を利用してネットワークインターフェイスを作成して IP アドレスを割り当てます。その後、ルーティングルールの変更が可能になります。

次の例では、mymacvlan という名前のセカンダリーネットワークを設定します。親 CNI は、eth1 にアタッチされたネットワークインターフェイスを作成し、host-local IPAM を使用して 192.168.1.0/24 の範囲の IP アドレスを割り当てます。これにより route-override CNI が親 CNI に連結され、既存ルートをフラッシュし、192.168.0.0/24 へのルートを削除し、カスタムゲートウェイを使用して 192.168.0.0/24 の新しいルートを追加することで、ルーティングルールが変更されます。

{
    "cniVersion": "0.3.0",
    "name": "mymacvlan",
    "plugins": [
        {
            "type": "macvlan",         
1

            "master": "eth1",
            "mode": "bridge",
            "ipam": {
                "type": "host-local",
                "subnet": "192.168.1.0/24"
            }
        },
        {
            "type": "route-override",    
2

            "flushroutes": true,
            "delroutes": [
                {
                    "dst": "192.168.0.0/24"
                }
            ],
            "addroutes": [
                {
                    "dst": "192.168.0.0/24",
                    "gw": "10.1.254.254"
                }
            ]
        }
    ]
}
Copy to Clipboard Toggle word wrap
1
親 CNI は eth1 にアタッチされたネットワークインターフェイスを作成します。
2
連結された route-override CNI はルーティングルールを変更します。

3.3. Pod をセカンダリーネットワークにアタッチする

クラスターユーザーとして、Pod をセカンダリーネットワークにアタッチできます。

3.3.1. セカンダリーネットワークに Pod を追加する

セカンダリーネットワークに Pod を追加できます。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。

Pod が作成されると、セカンダリーネットワークが Pod にアタッチされます。ただし、Pod がすでに存在する場合は、セカンダリーネットワークをその Pod にアタッチすることはできません。

Pod はセカンダリーネットワークと同じ namespace に存在する必要があります。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • クラスターにログインする。

手順

  1. アノテーションを Pod オブジェクトに追加します。以下のアノテーション形式のいずれかのみを使用できます。

    1. カスタマイズせずにセカンダリーネットワークをアタッチするには、次の形式でアノテーションを追加します。<network> が、Pod に関連付けるセカンダリーネットワークの名前に置き換えます。

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 
      1
      Copy to Clipboard Toggle word wrap
      1
      複数のセカンダリーネットワークを指定するには、各ネットワークをコンマで区切ります。コンマの間にはスペースを入れないでください。同じセカンダリーネットワークを複数回指定した場合、Pod は複数のネットワークインターフェイスをそのネットワークにアタッチします。
    2. カスタマイズしてセカンダリーネットワークをアタッチするには、次の形式でアノテーションを追加します。

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>", 
      1
      
                "namespace": "<namespace>", 
      2
      
                "default-route": ["<default-route>"] 
      3
      
              }
            ]
      Copy to Clipboard Toggle word wrap
      1
      NetworkAttachmentDefinition オブジェクトによって定義されたセカンダリーネットワークの名前を指定します。
      2
      NetworkAttachmentDefinition オブジェクトが定義される namespace を指定します。
      3
      オプション: 192.168.17.1 などのデフォルトルートのオーバーライドを指定します。
  2. Pod を作成するには、以下のコマンドを入力します。<name> を Pod の名前に置き換えます。

    $ oc create -f <name>.yaml
    Copy to Clipboard Toggle word wrap
  3. オプション: アノテーションが Pod CR に存在することを確認するには、<name> を Pod の名前に置き換えて、以下のコマンドを入力します。

    $ oc get pod <name> -o yaml
    Copy to Clipboard Toggle word wrap

    次の例では、example-pod Pod が net1 セカンダリーネットワークにアタッチされています。

    $ oc get pod example-pod -o yaml
    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: macvlan-bridge
        k8s.v1.cni.cncf.io/network-status: |- 
    1
    
          [{
              "name": "ovn-kubernetes",
              "interface": "eth0",
              "ips": [
                  "10.128.2.14"
              ],
              "default": true,
              "dns": {}
          },{
              "name": "macvlan-bridge",
              "interface": "net1",
              "ips": [
                  "20.2.2.100"
              ],
              "mac": "22:2f:60:a5:f8:00",
              "dns": {}
          }]
      name: example-pod
      namespace: default
    spec:
      ...
    status:
      ...
    Copy to Clipboard Toggle word wrap
    1
    k8s.v1.cni.cncf.io/network-status パラメーターは、オブジェクトの JSON 配列です。各オブジェクトは、Pod にアタッチされているセカンダリーネットワークのステータスを表します。アノテーションの値はプレーンテキストの値として保存されます。
3.3.1.1. Pod 固有のアドレスおよびルーティングオプションの指定

Pod をセカンダリーネットワークに割り当てる場合、特定の Pod でそのネットワークに関するその他のプロパティーを指定する必要がある場合があります。これにより、ルーティングの一部を変更することができ、静的 IP アドレスおよび MAC アドレスを指定できます。これを実行するには、JSON 形式のアノテーションを使用できます。

前提条件

  • Pod はセカンダリーネットワークと同じ namespace に存在する必要があります。
  • OpenShift CLI (oc) がインストールされている。
  • クラスターにログインすること。

手順

アドレスおよび/またはルーティングオプションを指定する間に Pod をセカンダリーネットワークに追加するには、以下の手順を実行します。

  1. Pod リソース定義を編集します。既存の Pod リソースを編集する場合は、以下のコマンドを実行してデフォルトエディターでその定義を編集します。<name> を、編集する Pod リソースの名前に置き換えます。

    $ oc edit pod <name>
    Copy to Clipboard Toggle word wrap
  2. Pod リソース定義で、k8s.v1.cni.cncf.io/networks パラメーターを Pod の metadata マッピングに追加します。k8s.v1.cni.cncf.io/networks は、追加のプロパティーを指定するだけでなく、NetworkAttachmentDefinition カスタムリソース (CR) 名を参照するオブジェクトリストの JSON 文字列を受け入れます。

    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' 
    1
    Copy to Clipboard Toggle word wrap
    1
    <network> を、以下の例にあるように JSON オブジェクトに置き換えます。一重引用符が必要です。
  3. 以下の例では、アノテーションで default-route パラメーターを使用して、デフォルトルートを持つネットワーク割り当てを指定します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
        {
          "name": "net1"
        },
        {
          "name": "net2", 
    1
    
          "default-route": ["192.0.2.1"] 
    2
    
        }]'
    spec:
      containers:
      - name: example-pod
        command: ["/bin/bash", "-c", "sleep 2000000000000"]
        image: centos/tools
    Copy to Clipboard Toggle word wrap
    1
    name キーは、Pod に関連付けるセカンダリーネットワークの名前です。
    2
    default-route キーは、ルーティングテーブルに他のルーティングテーブルがない場合に、ルーティングされるトラフィックに使用されるゲートウェイ値を指定します。複数の default-route キーを指定すると、Pod がアクティブでなくなります。

デフォルトのルートにより、他のルートに指定されていないトラフィックがゲートウェイにルーティングされます。

重要

OpenShift Container Platform のデフォルトのネットワークインターフェイス以外のインターフェイスへのデフォルトのルートを設定すると、Pod 間のトラフィックに予想されるトラフィックが別のインターフェイスでルーティングされる可能性があります。

Pod のルーティングプロパティーを確認する場合、oc コマンドを Pod 内で ip コマンドを実行するために使用できます。

$ oc exec -it <pod_name> -- ip route
Copy to Clipboard Toggle word wrap
注記

また、Pod の k8s.v1.cni.cncf.io/network-status を参照して、JSON 形式の一覧のオブジェクトで default-route キーの有無を確認し、デフォルトルートが割り当てられているセカンダリーネットワークを確認することができます。

Pod に静的 IP アドレスまたは MAC アドレスを設定するには、JSON 形式のアノテーションを使用できます。これには、この機能をとくに許可するネットワークを作成する必要があります。これは、CNO の rawCNIConfig で指定できます。

  1. 以下のコマンドを実行して CNO CR を編集します。

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap

以下の YAML は、CNO の設定パラメーターを説明しています。

Cluster Network Operator YAML の設定

name: <name> 
1

namespace: <namespace> 
2

rawCNIConfig: '{ 
3

  ...
}'
type: Raw
Copy to Clipboard Toggle word wrap

1
作成するセカンダリーネットワークアタッチメントの名前を指定します。名前は指定された namespace 内で一意である必要があります。
2
ネットワークの割り当てを作成する namespace を指定します。値を指定しない場合、default の namespace が使用されます。
3
以下のテンプレートに基づく CNI プラグイン設定を JSON 形式で指定します。

以下のオブジェクトは、macvlan CNI プラグインを使用して静的 MAC アドレスと IP アドレスを使用するための設定パラメーターを説明しています。

静的 IP および MAC アドレスを使用した macvlan CNI プラグイン JSON 設定オブジェクト

{
  "cniVersion": "0.3.1",
  "name": "<name>", 
1

  "plugins": [{ 
2

      "type": "macvlan",
      "capabilities": { "ips": true }, 
3

      "master": "eth0", 
4

      "mode": "bridge",
      "ipam": {
        "type": "static"
      }
    }, {
      "capabilities": { "mac": true }, 
5

      "type": "tuning"
    }]
}
Copy to Clipboard Toggle word wrap

1
作成するセカンダリーネットワークアタッチメントの名前を指定します。名前は指定された namespace 内で一意である必要があります。
2
CNI プラグイン設定の配列を指定します。1 つ目のオブジェクトは、macvlan プラグイン設定を指定し、2 つ目のオブジェクトはチューニングプラグイン設定を指定します。
3
CNI プラグインのランタイム設定機能の静的 IP 機能を有効にするために要求が実行されるように指定します。
4
macvlan プラグインが使用するインターフェイスを指定します。
5
CNI プラグインの静的 MAC アドレス機能を有効にするために要求が実行されるように指定します。

上記のネットワーク割り当ては、特定の Pod に割り当てられる静的 IP アドレスと MAC アドレスを指定するキーと共に、JSON 形式のアノテーションで参照できます。

以下を使用して Pod を編集します。

$ oc edit pod <name>
Copy to Clipboard Toggle word wrap

静的 IP および MAC アドレスを使用した macvlan CNI プラグイン JSON 設定オブジェクト

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: '[
      {
        "name": "<name>", 
1

        "ips": [ "192.0.2.205/24" ], 
2

        "mac": "CA:FE:C0:FF:EE:00" 
3

      }
    ]'
Copy to Clipboard Toggle word wrap

1
上記の rawCNIConfig を作成する際に、指定されるように <name> を使用します。
2
サブネットマスクを含む IP アドレスを指定します。
3
MAC アドレスを指定します。
注記

静的 IP アドレスおよび MAC アドレスを同時に使用することはできません。これらは個別に使用することも、一緒に使用することもできます。

セカンダリーネットワークを持つ Pod の IP アドレスと MAC プロパティーを検証するには、oc コマンドを使用して Pod 内で ip コマンドを実行します。

$ oc exec -it <pod_name> -- ip a
Copy to Clipboard Toggle word wrap

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

    出力例

    network.operator.openshift.io/cluster patched
    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

3.5. セカンダリーネットワークから Pod を削除する

クラスターユーザーとして、セカンダリーネットワークから Pod を削除できます。

3.5.1. セカンダリーネットワークから Pod を削除する

Pod を削除することによってのみ、セカンダリーネットワークから Pod を削除できます。

前提条件

  • セカンダリーネットワークが Pod にアタッチされている。
  • OpenShift CLI (oc) がインストールされている。
  • クラスターにログインする。

手順

  • Pod を削除するには、以下のコマンドを入力します。

    $ oc delete pod <name> -n <namespace>
    Copy to Clipboard Toggle word wrap
    • <name> は Pod の名前です。
    • <namespace> は Pod が含まれる namespace です。

3.6. セカンダリーネットワークの編集

クラスター管理者は、既存のセカンダリーネットワークの設定を変更できます。

3.6.1. セカンダリーネットワークアタッチメントの定義を変更する

クラスター管理者は、既存のセカンダリーネットワークに変更を加えることができます。セカンダリーネットワークにアタッチされている既存の Pod は更新されません。

前提条件

  • クラスターのセカンダリーネットワークを設定した。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。

手順

クラスターのセカンダリーネットワークを編集するには、次の手順を実行します。

  1. 以下のコマンドを実行し、デフォルトのテキストエディターで Cluster Network Operator (CNO) CR を編集します。

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  2. additionalNetworks コレクションで、セカンダリーネットワークを変更して更新します。
  3. 変更を保存し、テキストエディターを終了して、変更をコミットします。
  4. オプション: 以下のコマンドを実行して、CNO が NetworkAttachmentDefinition オブジェクトを更新していることを確認します。<network-name> は、表示するセカンダリーネットワークの名前に置き換えます。CNO が NetworkAttachmentDefinition オブジェクトを更新して変更内容が反映されるまでに遅延が生じる可能性があります。

    $ oc get network-attachment-definitions <network-name> -o yaml
    Copy to Clipboard Toggle word wrap

    たとえば、以下のコンソールの出力は net1 という名前の NetworkAttachmentDefinition オブジェクトを表示します。

    $ oc get network-attachment-definitions net1 -o go-template='{{printf "%s\n" .spec.config}}'
    { "cniVersion": "0.3.1", "type": "macvlan",
    "master": "ens5",
    "mode": "bridge",
    "ipam":       {"type":"static","routes":[{"dst":"0.0.0.0/0","gw":"10.128.2.1"}],"addresses":[{"address":"10.128.2.100/23","gateway":"10.128.2.1"}],"dns":{"nameservers":["172.30.0.10"],"domain":"us-west-2.compute.internal","search":["us-west-2.compute.internal"]}} }
    Copy to Clipboard Toggle word wrap

3.7. セカンダリーネットワークでの IP アドレス割り当ての設定

次のセクションでは、セカンダリーネットワークの IP アドレスの割り当てを設定する方法の手順と情報を提供します。

3.7.1. ネットワークアタッチメントの IP アドレス割り当ての設定

セカンダリーネットワークでは、Dynamic Host Configuration Protocol (DHCP) や静的割り当てなど、さまざまな割り当て方法をサポートする IP アドレス管理 (IPAM) CNI プラグインを使用して IP アドレスを割り当てることができます。

IP アドレスの動的割り当てを担当する DHCP IPAM CNI プラグインは、2 つの異なるコンポーネントを使用して動作します。

  • CNI プラグイン: Kubernetes ネットワークスタックと統合して IP アドレスを要求および解放する役割を担います。
  • DHCP IPAM CNI デーモン: 環境内の既存の DHCP サーバーと連携して IP アドレス割り当て要求を処理する DHCP イベントのリスナー。このデーモン自体は DHCP サーバーでは ありません

IPAM 設定で type: dhcp を必要とするネットワークの場合は、次の点を確認してください。

  • DHCP サーバーが環境内で利用可能かつ実行されている。DHCP サーバーはクラスターの外部にあり、お客様の既存のネットワークインフラストラクチャーの一部である必要があります。
  • DHCP サーバーが、ノードに IP アドレスを提供するように適切に設定されている。

環境内で DHCP サーバーが利用可能でない場合は、代わりに Whereabouts IPAM CNI プラグインを使用することを推奨します。Whereabouts CNI は、外部 DHCP サーバーを必要とせずに同様の IP アドレス管理機能を提供します。

注記

外部 DHCP サーバーがない場合、または静的 IP アドレス管理が望ましい場合は、Whereabouts CNI プラグインを使用してください。Whereabouts プラグインには、古くなった IP アドレスの割り当てを管理するためのリコンサイラーデーモンが含まれています。

コンテナーの有効期間中、DHCP リースを定期的に更新する必要があるため、別のデーモンである DHCP IPAM CNI デーモンが必要です。DHCP IPAM CNI デーモンをデプロイするには、セカンダリーネットワーク設定の一部としてこのデーモンのデプロイをトリガーするように Cluster Network Operator (CNO) 設定を変更します。

3.7.1.1. 静的 IP アドレス割り当ての設定

以下の表は、静的 IP アドレスの割り当ての設定を説明しています。

Expand
表3.11 ipam 静的設定オブジェクト
フィールド説明

type

string

IPAM のアドレスタイプ。値 static が必要です。

addresses

array

仮想インターフェイスに割り当てる IP アドレスを指定するオブジェクトの配列。IPv4 と IPv6 の IP アドレスの両方がサポートされます。

routes

array

Pod 内で設定するルートを指定するオブジェクトの配列です。

dns

array

オプション: DNS の設定を指定するオブジェクトの配列です。

addresses の配列には、以下のフィールドのあるオブジェクトが必要です。

Expand
表3.12 ipam.addresses[] 配列
フィールド説明

address

string

指定する IP アドレスおよびネットワーク接頭辞。たとえば、10.10.21.10/24 を指定すると、セカンダリーネットワークに IP アドレスの 10.10.21.10 が割り当てられ、ネットマスクは 255.255.255.0 になります。

gateway

string

Egress ネットワークトラフィックをルーティングするデフォルトのゲートウェイ。

Expand
表3.13 ipam.routes[] 配列
フィールド説明

dst

string

CIDR 形式の IP アドレス範囲 (192.168.17.0/24、またはデフォルトルートの 0.0.0.0/0)。

gw

string

ネットワークトラフィックがルーティングされるゲートウェイ。

Expand
表3.14 ipam.dns オブジェクト
フィールド説明

nameservers

array

DNS クエリーの送信先となる 1 つ以上の IP アドレスの配列。

domain

array

ホスト名に追加するデフォルトのドメイン。たとえば、ドメインが example.com に設定されている場合、example-host の DNS ルックアップクエリーは example-host.example.com として書き換えられます。

search

array

DNS ルックアップのクエリー時に非修飾ホスト名に追加されるドメイン名の配列 (例: example-host)。

静的 IP アドレス割り当ての設定例

{
  "ipam": {
    "type": "static",
      "addresses": [
        {
          "address": "191.168.1.7/24"
        }
      ]
  }
}
Copy to Clipboard Toggle word wrap

3.7.1.2. 動的 IP アドレス (DHCP) 割り当ての設定

Pod は、作成時に元の DHCP リースを取得します。リースは、クラスターで実行している最小限の DHCP サーバーデプロイメントで定期的に更新する必要があります。

重要

イーサネットネットワークアタッチメントの場合、SR-IOV Network Operator は DHCP サーバーデプロイメントを作成しません。Cluster Network Operator は最小限の DHCP サーバーデプロイメントを作成します。

DHCP サーバーのデプロイメントをトリガーするには、以下の例にあるように Cluster Network Operator 設定を編集して shim ネットワーク割り当てを作成する必要があります。

shim ネットワーク割り当ての定義例

apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  additionalNetworks:
  - name: dhcp-shim
    namespace: default
    type: Raw
    rawCNIConfig: |-
      {
        "name": "dhcp-shim",
        "cniVersion": "0.3.1",
        "type": "bridge",
        "ipam": {
          "type": "dhcp"
        }
      }
  # ...
Copy to Clipboard Toggle word wrap

次の表は、DHCP による動的 IP アドレス割り当ての設定パラメーターを示しています。

Expand
表3.15 ipam DHCP 設定オブジェクト
フィールド説明

type

string

IPAM のアドレスタイプ。値 dhcp が必要です。

以下の JSON の例は、DHCP を使用した動的 IP アドレスの割り当ての設定を説明しています。

動的 IP アドレス (DHCP) 割り当ての設定例

{
  "ipam": {
    "type": "dhcp"
  }
}
Copy to Clipboard Toggle word wrap

3.7.1.3. Whereabouts を使用した動的 IP アドレス割り当ての設定

Whereabouts CNI プラグインにより、DHCP サーバーを使用せずに IP アドレスをセカンダリーネットワークに動的に割り当てることができます。

また、Whereabouts CNI プラグインは、重複する IP アドレス範囲と、別々の NetworkAttachmentDefinition CRD 内で同じ CIDR 範囲を複数回設定することをサポートしています。これにより、マルチテナント環境での柔軟性と管理機能が向上します。

3.7.1.3.1. 動的 IP アドレス設定オブジェクト

以下の表は、Whereabouts を使用した動的 IP アドレス割り当ての設定オブジェクトを説明しています。

Expand
表3.16 ipam whereabouts 設定オブジェクト
フィールド説明

type

string

IPAM のアドレスタイプ。値 whereabouts が必要です。

range

string

IP アドレスと範囲を CIDR 表記。IP アドレスは、この範囲内のアドレスから割り当てられます。

exclude

array

オプション: CIDR 表記の IP アドレスと範囲 (0 個以上) のリスト。除外されたアドレス範囲内の IP アドレスは割り当てられません。

network_name

string

オプション: 同じ範囲の IP アドレスを共有する場合でも、Pod の各グループまたはドメインが独自の IP アドレスセットを取得するようにします。このフィールドを設定することは、特にマルチテナント環境でネットワークを分離して整理しておく場合に重要です。

3.7.1.3.2. Whereabouts を使用した動的 IP アドレス割り当て設定

次の例は、Whereabouts を使用する動的アドレス割り当て設定を示しています。

whereabouts 動的 IP アドレスの割り当て

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/27",
    "exclude": [
       "192.0.2.192/30",
       "192.0.2.196/32"
    ]
  }
}
Copy to Clipboard Toggle word wrap

3.7.1.3.3. IP アドレス範囲が重複する場合に Whereabouts を使用した動的 IP アドレス割り当て

次の例は、マルチテナントネットワークで重複する IP アドレスの範囲を使用する、動的な IP アドレスの割り当てを示しています。

NetworkAttachmentDefinition 1

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/29",
    "network_name": "example_net_common", 
1

  }
}
Copy to Clipboard Toggle word wrap

1
オプション: 設定されている場合、NetworkAttachmentDefinition 2network_name と一致する必要があります。

NetworkAttachmentDefinition 2

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/24",
    "network_name": "example_net_common", 
1

  }
}
Copy to Clipboard Toggle word wrap

1
オプション: 設定されている場合、NetworkAttachmentDefinition 1network_name と一致する必要があります。
3.7.1.4. whereabouts-reconciler デーモンセットの作成

Whereabouts reconciler は、Whereabouts IP アドレス管理 (IPAM) ソリューションを使用して、クラスター内の Pod の動的 IP アドレス割り当てを管理します。これにより、各 Pod が指定の IP アドレス範囲から一意の IP アドレスを確実に取得します。また、Pod が削除またはスケールダウンされた場合の IP アドレスの解放も処理します。

注記

動的 IP アドレスの割り当てには、NetworkAttachmentDefinition カスタムリソース定義 (CRD) を使用することもできます。

whereabouts-reconciler デーモンセットは、Cluster Network Operator を通じてセカンダリーネットワークを設定するときに自動的に作成されます。YAML マニフェストからセカンダリーネットワークを設定する場合、これは自動的には作成されません。

whereabouts-reconciler デーモンセットのデプロイをトリガーするには、Cluster Network Operator のカスタムリソース (CR) ファイルを編集して、whereabouts-shim ネットワーク割り当てを手動で作成する必要があります。

whereabouts-reconciler デーモンセットをデプロイするには、次の手順を使用します。

手順

  1. 以下のコマンドを実行して、Network.operator.openshift.io カスタムリソース (CR) を編集します。

    $ oc edit network.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  2. この例で展開されている YAML の additionalNetworks セクションを、カスタムリソース (CR) の spec 定義内に含めます。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    # ...
    spec:
      additionalNetworks:
      - name: whereabouts-shim
        namespace: default
        rawCNIConfig: |-
          {
           "name": "whereabouts-shim",
           "cniVersion": "0.3.1",
           "type": "bridge",
           "ipam": {
             "type": "whereabouts"
           }
          }
        type: Raw
    # ...
    Copy to Clipboard Toggle word wrap
  3. ファイルを保存し、テキストエディターを編集します。
  4. 次のコマンドを実行して、whereabouts-reconciler デーモンセットが正常にデプロイされたことを確認します。

    $ oc get all -n openshift-multus | grep whereabouts-reconciler
    Copy to Clipboard Toggle word wrap

    出力例

    pod/whereabouts-reconciler-jnp6g 1/1 Running 0 6s
    pod/whereabouts-reconciler-k76gg 1/1 Running 0 6s
    pod/whereabouts-reconciler-k86t9 1/1 Running 0 6s
    pod/whereabouts-reconciler-p4sxw 1/1 Running 0 6s
    pod/whereabouts-reconciler-rvfdv 1/1 Running 0 6s
    pod/whereabouts-reconciler-svzw9 1/1 Running 0 6s
    daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 6s
    Copy to Clipboard Toggle word wrap

3.7.1.5. Whereabouts IP リコンサイラーのスケジュールの設定

Whereabouts IPAM CNI プラグインは、IP リコンサイラーを毎日実行します。このプロセスは、IP が枯渇して新しい Pod に IP が割り当てられなくなる状態を避けるために、完了せずに残っている IP 割り当てをクリーンアップします。

IP リコンサイラーを実行する頻度を変更するには、次の手順を使用します。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • whereabouts-reconciler デーモンセットがデプロイされており、whereabouts-reconciler Pod が起動して実行されている。

手順

  1. 次のコマンドを実行して、IP リコンサイラー用の特定の cron 式を使用し、openshift-multus namespace に whereabouts-config という名前の ConfigMap オブジェクトを作成します。

    $ oc create configmap whereabouts-config -n openshift-multus --from-literal=reconciler_cron_expression="*/15 * * * *"
    Copy to Clipboard Toggle word wrap

    この cron 式は、IP リコンサイラーを 15 分ごとに実行するよう指定します。この式は固有の要件に基づいて調整してください。

    注記

    whereabouts-reconciler デーモンセットは、5 つのアスタリスクを含む cron 式パターンのみを使用できます。秒を表すために使用される 6 番目のアスタリスクは、現在サポートされていません。

  2. 次のコマンドを実行して、openshift-multus namespace 内の whereabouts-reconciler デーモンセットおよび Pod に関連するリソースに関する情報を取得します。

    $ oc get all -n openshift-multus | grep whereabouts-reconciler
    Copy to Clipboard Toggle word wrap

    出力例

    pod/whereabouts-reconciler-2p7hw                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-76jk7                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-94zw6                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-mfh68                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-pgshz                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-xn5xz                   1/1     Running   0             4m14s
    daemonset.apps/whereabouts-reconciler          6         6         6       6            6           kubernetes.io/os=linux   4m16s
    Copy to Clipboard Toggle word wrap

  3. 次のコマンドを実行して、設定した間隔で whereabouts-reconciler Pod が IP リコンサイラーを実行していることを確認します。

    $ oc -n openshift-multus logs whereabouts-reconciler-2p7hw
    Copy to Clipboard Toggle word wrap

    出力例

    2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_33_54.1375928161": CREATE
    2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_33_54.1375928161": CHMOD
    2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..data_tmp": RENAME
    2024-02-02T16:33:54Z [verbose] using expression: */15 * * * *
    2024-02-02T16:33:54Z [verbose] configuration updated to file "/cron-schedule/..data". New cron expression: */15 * * * *
    2024-02-02T16:33:54Z [verbose] successfully updated CRON configuration id "00c2d1c9-631d-403f-bb86-73ad104a6817" - new cron expression: */15 * * * *
    2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/config": CREATE
    2024-02-02T16:33:54Z [debug] event not relevant: "/cron-schedule/..2024_02_02_16_26_17.3874177937": REMOVE
    2024-02-02T16:45:00Z [verbose] starting reconciler run
    2024-02-02T16:45:00Z [debug] NewReconcileLooper - inferred connection data
    2024-02-02T16:45:00Z [debug] listing IP pools
    2024-02-02T16:45:00Z [debug] no IP addresses to cleanup
    2024-02-02T16:45:00Z [verbose] reconciler success
    Copy to Clipboard Toggle word wrap

3.7.1.6. デュアルスタック IP アドレスを動的に割り当てる設定の作成

デュアルスタックの IP アドレスの割り当ては、ipRanges パラメーターで設定できます。

  • IPv4 アドレス
  • IPv6 アドレス
  • 複数の IP アドレスの割り当て

手順

  1. typewhereabouts に設定します。
  2. 以下の例のように、ipRanges を使用して IP アドレスを割り当てます。

    cniVersion: operator.openshift.io/v1
    kind: Network
    =metadata:
      name: cluster
    spec:
      additionalNetworks:
      - name: whereabouts-shim
        namespace: default
        type: Raw
        rawCNIConfig: |-
          {
           "name": "whereabouts-dual-stack",
           "cniVersion": "0.3.1,
           "type": "bridge",
           "ipam": {
             "type": "whereabouts",
             "ipRanges": [
                      {"range": "192.168.10.0/24"},
                      {"range": "2001:db8::/64"}
                  ]
           }
          }
    Copy to Clipboard Toggle word wrap
  3. ネットワークを Pod にアタッチします。詳細は、「セカンダリーネットワークへの Pod の追加」を参照してください。
  4. すべての IP アドレスが割り当てられていることを確認します。
  5. 以下のコマンドを実行して、IP アドレスがメタデータとして割り当てられることを確認します。

    $ oc exec -it mypod -- ip a
    Copy to Clipboard Toggle word wrap

3.8. コンテナーネットワーク namespace での master インターフェイスの設定

次のセクションでは、master インターフェイスに基づいて MAC-VLAN、IP-VLAN、および VLAN サブインターフェイスを作成および管理する方法の手順と情報を提供します。

3.8.1. コンテナーネットワーク namespace での master インターフェイスの設定について

コンテナー namespace に存在する master インターフェイスに基づいて、MAC-VLAN、IP-VLAN、または VLAN サブインターフェイスを作成できます。別のネットワークアタッチメント定義 CRD で、Pod ネットワーク設定の一部として master インターフェイスを作成することもできます。

コンテナー namespace の master インターフェイスを使用するには、NetworkAttachmentDefinition CRD のサブインターフェイス設定に存在する linkInContainer パラメーターに true を指定する必要があります。

3.8.1.1. SR-IOV VF 上で複数の VLAN を作成する

この機能を利用するユースケースの例として、SR-IOV VF に基づいて複数の VLAN を作成することが挙げられます。これを行うには、まず SR-IOV ネットワークを作成し、次に VLAN インターフェイスのネットワーク割り当てを定義します。

次の例は、この図に示されているセットアップを設定する方法を示しています。

図3.1 VLAN の作成

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • SR-IOV Network Operator がインストールされている。

手順

  1. 次のコマンドを使用して、Pod をデプロイする専用のコンテナー namespace を作成します。

    $ oc new-project test-namespace
    Copy to Clipboard Toggle word wrap
  2. SR-IOV ノードポリシーを作成します。

    1. SriovNetworkNodePolicy オブジェクトを作成してから、YAML を sriov-node-network-policy.yaml ファイルに保存します。

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
       name: sriovnic
       namespace: openshift-sriov-network-operator
      spec:
       deviceType: netdevice
       isRdma: false
       needVhostNet: true
       nicSelector:
         vendor: "15b3" 
      1
      
         deviceID: "101b" 
      2
      
         rootDevices: ["00:05.0"]
       numVfs: 10
       priority: 99
       resourceName: sriovnic
       nodeSelector:
          feature.node.kubernetes.io/network-sriov.capable: "true"
      Copy to Clipboard Toggle word wrap
      注記

      deviceType: netdevice を設定した SR-IOV ネットワークノードポリシーの設定例は、Mellanox ネットワークインターフェイスカード (NIC) 向けに特別に調整されています。

      1
      SR-IOV ネットワークデバイスのベンダーの 16 進数コード。15b3 の値は Mellanox NIC に関連付けられています。
      2
      SR-IOV ネットワークデバイスのデバイスの 16 進数コード。
    2. 以下のコマンドを実行して YAML を適用します。

      $ oc apply -f sriov-node-network-policy.yaml
      Copy to Clipboard Toggle word wrap
      注記

      ノードの再起動が必要なため、YAML の適用には時間がかかる場合があります。

  3. SR-IOV ネットワークを作成します。

    1. 次の CR の例のように、追加のセカンダリー SR-IOV ネットワーク割り当て用の SriovNetwork カスタムリソース (CR) を作成します。YAML を sriov-network-attachment.yaml ファイルとして保存します。

      apiVersion: sriovnetwork.openshift.io/v1
      kind: SriovNetwork
      metadata:
       name: sriov-network
       namespace: openshift-sriov-network-operator
      spec:
       networkNamespace: test-namespace
       resourceName: sriovnic
       spoofChk: "off"
       trust: "on"
      Copy to Clipboard Toggle word wrap
    2. 以下のコマンドを実行して YAML を適用します。

      $ oc apply -f sriov-network-attachment.yaml
      Copy to Clipboard Toggle word wrap
  4. VLAN セカンダリーネットワークを作成します。

    1. 以下の YAML の例を使用して、vlan100-additional-network-configuration.yaml という名前のファイルを作成します。

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        name: vlan-100
        namespace: test-namespace
      spec:
        config: |
          {
            "cniVersion": "0.4.0",
            "name": "vlan-100",
            "plugins": [
              {
                "type": "vlan",
                "master": "ext0", 
      1
      
                "mtu": 1500,
                "vlanId": 100,
                "linkInContainer": true, 
      2
      
                "ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]}
              }
            ]
          }
      Copy to Clipboard Toggle word wrap
      1
      VLAN 設定では master 名を指定する必要があります。これは Pod ネットワークアノテーションで設定できます。
      2
      linkInContainer パラメーターを指定する必要があります。
    2. 以下のコマンドを実行して、YAML ファイルを適用します。

      $ oc apply -f vlan100-additional-network-configuration.yaml
      Copy to Clipboard Toggle word wrap
  5. 前に指定したネットワークを使用して、Pod 定義を作成します。

    1. 次の YAML の例を使用して、pod-a.yaml という名前のファイルを作成します。

      注記

      以下のマニフェストには 2 つのリソースが含まれています。

      • セキュリティーラベルのある namespace
      • 適切なネットワークアノテーションを含む Pod 定義
      apiVersion: v1
      kind: Namespace
      metadata:
        name: test-namespace
        labels:
          pod-security.kubernetes.io/enforce: privileged
          pod-security.kubernetes.io/audit: privileged
          pod-security.kubernetes.io/warn: privileged
          security.openshift.io/scc.podSecurityLabelSync: "false"
      ---
      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx-pod
        namespace: test-namespace
        annotations:
          k8s.v1.cni.cncf.io/networks: '[
            {
              "name": "sriov-network",
              "namespace": "test-namespace",
              "interface": "ext0" 
      1
      
            },
            {
              "name": "vlan-100",
              "namespace": "test-namespace",
              "interface": "ext0.100"
            }
          ]'
      spec:
        securityContext:
          runAsNonRoot: true
        containers:
          - name: nginx-container
            image: nginxinc/nginx-unprivileged:latest
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            ports:
              - containerPort: 80
            seccompProfile:
              type: "RuntimeDefault"
      Copy to Clipboard Toggle word wrap
      1
      VLAN インターフェイスの master として使用される名前。
    2. 以下のコマンドを実行して、YAML ファイルを適用します。

      $ oc apply -f pod-a.yaml
      Copy to Clipboard Toggle word wrap
  6. 次のコマンドを実行して、test-namespace 内の nginx-pod に関する詳細情報を取得します。

    $ oc describe pods nginx-pod -n test-namespace
    Copy to Clipboard Toggle word wrap

    出力例

    Name:         nginx-pod
    Namespace:    test-namespace
    Priority:     0
    Node:         worker-1/10.46.186.105
    Start Time:   Mon, 14 Aug 2023 16:23:13 -0400
    Labels:       <none>
    Annotations:  k8s.ovn.org/pod-networks:
                    {"default":{"ip_addresses":["10.131.0.26/23"],"mac_address":"0a:58:0a:83:00:1a","gateway_ips":["10.131.0.1"],"routes":[{"dest":"10.128.0.0...
                  k8s.v1.cni.cncf.io/network-status:
                    [{
                        "name": "ovn-kubernetes",
                        "interface": "eth0",
                        "ips": [
                            "10.131.0.26"
                        ],
                        "mac": "0a:58:0a:83:00:1a",
                        "default": true,
                        "dns": {}
                    },{
                        "name": "test-namespace/sriov-network",
                        "interface": "ext0",
                        "mac": "6e:a7:5e:3f:49:1b",
                        "dns": {},
                        "device-info": {
                            "type": "pci",
                            "version": "1.0.0",
                            "pci": {
                                "pci-address": "0000:d8:00.2"
                            }
                        }
                    },{
                        "name": "test-namespace/vlan-100",
                        "interface": "ext0.100",
                        "ips": [
                            "1.1.1.1"
                        ],
                        "mac": "6e:a7:5e:3f:49:1b",
                        "dns": {}
                    }]
                  k8s.v1.cni.cncf.io/networks:
                    [ { "name": "sriov-network", "namespace": "test-namespace", "interface": "ext0" }, { "name": "vlan-100", "namespace": "test-namespace", "i...
                  openshift.io/scc: privileged
    Status:       Running
    IP:           10.131.0.26
    IPs:
      IP:  10.131.0.26
    Copy to Clipboard Toggle word wrap

コンテナー namespace に存在するブリッジ master インターフェイスに基づいてサブインターフェイスを作成できます。サブインターフェイスの作成は、他のタイプのインターフェイスに適用できます。

前提条件

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

手順

  1. 次のコマンドを入力して、Pod のデプロイ先となる専用のコンテナー namespace を作成します。

    $ oc new-project test-namespace
    Copy to Clipboard Toggle word wrap
  2. 次の YAML の例を使用して、bridge-nad.yaml という名前のブリッジ NetworkAttachmentDefinition カスタムリソース定義 (CRD) ファイルを作成します。

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: bridge-network
    spec:
      config: '{
        "cniVersion": "0.4.0",
        "name": "bridge-network",
        "type": "bridge",
        "bridge": "br-001",
        "isGateway": true,
        "ipMasq": true,
        "hairpinMode": true,
        "ipam": {
          "type": "host-local",
          "subnet": "10.0.0.0/24",
          "routes": [{"dst": "0.0.0.0/0"}]
        }
      }'
    Copy to Clipboard Toggle word wrap
  3. 次のコマンドを実行して、NetworkAttachmentDefinition CRD を OpenShift Container Platform クラスターに適用します。

    $ oc apply -f bridge-nad.yaml
    Copy to Clipboard Toggle word wrap
  4. 次のコマンドを入力して、NetworkAttachmentDefinition CRD が正常に作成されたことを確認します。

    $ oc get network-attachment-definitions
    Copy to Clipboard Toggle word wrap

    出力例

    NAME             AGE
    bridge-network   15s
    Copy to Clipboard Toggle word wrap

  5. 以下の YAML の例を使用して、IPVLAN セカンダリーネットワーク設定用に ipvlan-additional-network-configuration.yaml という名前のファイルを作成します。

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: ipvlan-net
      namespace: test-namespace
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "name": "ipvlan-net",
        "type": "ipvlan",
        "master": "net1", 
    1
    
        "mode": "l3",
        "linkInContainer": true, 
    2
    
        "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]}
      }'
    Copy to Clipboard Toggle word wrap
    1
    ネットワークアタッチメントに関連付けるイーサネットインターフェイスを指定します。これはその後、Pod ネットワークアノテーションで設定されます。
    2
    master インターフェイスがコンテナーネットワーク namespace にあることを指定します。
  6. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f ipvlan-additional-network-configuration.yaml
    Copy to Clipboard Toggle word wrap
  7. 次のコマンドを実行して、NetworkAttachmentDefinition CRD が正常に作成されたことを確認します。

    $ oc get network-attachment-definitions
    Copy to Clipboard Toggle word wrap

    出力例

    NAME             AGE
    bridge-network   87s
    ipvlan-net       9s
    Copy to Clipboard Toggle word wrap

  8. 以下の YAML の例を使用して、Pod 定義用に pod-a.yaml という名前のファイルを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-a
      namespace: test-namespace
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
          {
            "name": "bridge-network",
            "interface": "net1" 
    1
    
          },
          {
            "name": "ipvlan-net",
            "interface": "net2"
          }
        ]'
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
      - name: test-pod
        image: quay.io/openshifttest/hello-sdn@sha256:c89445416459e7adea9a5a416b3365ed3d74f2491beb904d61dc8d1eb89a72a4
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: [ALL]
    Copy to Clipboard Toggle word wrap
    1
    IPVLAN インターフェイスの master として使用する名前を指定します。
  9. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f pod-a.yaml
    Copy to Clipboard Toggle word wrap
  10. 以下のコマンドを使用して、Pod が実行されていることを確認します。

    $ oc get pod -n test-namespace
    Copy to Clipboard Toggle word wrap

    出力例

    NAME    READY   STATUS    RESTARTS   AGE
    pod-a   1/1     Running   0          2m36s
    Copy to Clipboard Toggle word wrap

  11. 次のコマンドを実行して、test-namespace 内の pod-a リソースに関するネットワークインターフェイス情報を表示します。

    $ oc exec -n test-namespace pod-a -- ip a
    Copy to Clipboard Toggle word wrap

    出力例

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    3: eth0@if105: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP group default
        link/ether 0a:58:0a:d9:00:5d brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.217.0.93/23 brd 10.217.1.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::488b:91ff:fe84:a94b/64 scope link
           valid_lft forever preferred_lft forever
    4: net1@if107: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
        link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.0.0.2/24 brd 10.0.0.255 scope global net1
           valid_lft forever preferred_lft forever
        inet6 fe80::bcda:bdff:fe7e:f437/64 scope link
           valid_lft forever preferred_lft forever
    5: net2@net1: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
        link/ether be:da:bd:7e:f4:37 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.1/24 brd 10.0.0.255 scope global net2
           valid_lft forever preferred_lft forever
        inet6 fe80::beda:bd00:17e:f437/64 scope link
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

    この出力は、ネットワークインターフェイス net2 が物理インターフェイス net1 に関連付けられていることを示しています。

3.9. 追加ネットワークの削除

クラスター管理者は、追加のネットワーク割り当てを削除できます。

3.9.1. セカンダリーネットワークアタッチメントの定義を削除する

クラスター管理者は、セカンダリーネットワークを OpenShift Container Platform クラスターから削除できます。セカンダリーネットワークは、アタッチされているどの Pod からも削除されません。

前提条件

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

手順

クラスターからセカンダリーネットワークを削除するには、次の手順を実行します。

  1. 以下のコマンドを実行して、デフォルトのテキストエディターで Cluster Network Operator (CNO) を編集します。

    $ oc edit networks.operator.openshift.io cluster
    Copy to Clipboard Toggle word wrap
  2. 削除するセカンダリーネットワークの additionalNetworks コレクションから CNO が作成した設定を削除して、CR を変更します。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      additionalNetworks: [] 
    1
    Copy to Clipboard Toggle word wrap
    1
    additionalNetworks コレクションのセカンダリーネットワークアタッチメントのみの設定マッピングを削除する場合、空のコレクションを指定する必要があります。
  3. クラスターのネットワークからネットワークアタッチメント定義を削除するには、次のコマンドを入力します。

    $ oc delete net-attach-def <name_of_NAD> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <name_of_NAD> は、ネットワークアタッチメント定義の名前に置き換えます。
  4. 変更を保存し、テキストエディターを終了して、変更をコミットします。
  5. オプション: 次のコマンドを実行して、セカンダリーネットワーク CR が削除されたことを確認します。

    $ oc get network-attachment-definition --all-namespaces
    Copy to Clipboard Toggle word wrap

第4章 Virtual Routing and Forwarding

4.1. Virtual Routing and Forwarding について

Virtual Routing and Forwarding (VRF) デバイスと IP ルールを組み合わせることで、Virtual Routing and Forwarding ドメインを作成できます。VRF は、CNF で必要なパーミッションの数を減らし、セカンダリーネットワークのネットワークトポロジーの可視性を強化します。VRF はマルチテナンシー機能を提供するために使用されます。たとえば、この場合、各テナントには固有のルーティングテーブルがあり、異なるデフォルトゲートウェイが必要です。

プロセスは、ソケットを VRF デバイスにバインドできます。バインドされたソケット経由のパケットは、VRF デバイスに関連付けられたルーティングテーブルを使用します。VRF の重要な機能として、これは OSI モデルレイヤー 3 以上にのみ影響を与えるため、LLDP などの L2 ツールは影響を受けません。これにより、ポリシーベースのルーティングなどの優先度の高い IP ルールが、特定のトラフィックを転送する VRF デバイスルールよりも優先されます。

4.1.1. Telecommunications Operator に関する Pod のセカンダリーネットワークの利点

通信のユースケースでは、各 CNF が同じアドレス空間を共有する複数の異なるネットワークに接続される可能性があります。これらのセカンダリーネットワークは、クラスターのメインネットワーク CIDR と競合する可能性があります。CNI VRF プラグインを使用すると、ネットワーク機能は、同じ IP アドレスを使用して異なるユーザーのインフラストラクチャーに接続でき、複数の異なるお客様の分離された状態を維持します。IP アドレスは OpenShift Container Platform の IP スペースと重複します。CNI VRF プラグインは、CNF で必要なパーミッションの数も減らし、セカンダリーネットワークのネットワークトポロジーの可視性を高めます。

第5章 VRF へのセカンダリーネットワークの割り当て

クラスター管理者は、CNI VRF プラグインを使用して、Virtual Routing and Forwarding (VRF) ドメインのセカンダリーネットワークを設定できます。このプラグインが作成する仮想ネットワークは、指定した物理インターフェイスに関連付けられます。

VRF インスタンスでセカンダリーネットワークを使用すると、次の利点があります。

ワークロードの分離
セカンダリーネットワークの VRF インスタンスを設定して、ワークロードトラフィックを分離します。
セキュリティーの向上
VRF ドメイン内の分離されたネットワークパスを通じて、セキュリティーを向上させます。
マルチテナンシーのサポート
各テナントの VRF ドメイン内で、一意のルーティングテーブルを使用したネットワークセグメンテーションを通じて、マルチテナントをサポートします。
注記

VRF を使用するアプリケーションは、特定のデバイスに対してバインドする必要があります。一般的な使用方法として、ソケットに SO_BINDTODEVICE オプションを使用できます。SO_BINDTODEVICE オプションは、渡されたインターフェイス名 (例: eth1) で指定されたデバイスにソケットをバインドします。SO_BINDTODEVICE オプションを使用するには、アプリケーションに CAP_NET_RAW 機能が必要です。

ip vrf exec コマンドを使用した VRF の使用は、OpenShift Container Platform Pod ではサポートされません。VRF を使用するには、アプリケーションを VRF インターフェイスに直接バインドします。

5.1. CNI VRF プラグインを使用してセカンダリーネットワークアタッチメントを作成する

Cluster Network Operator (CNO) は、セカンダリーネットワークの定義を管理します。作成するセカンダリーネットワークを指定する場合、CNO は NetworkAttachmentDefinition カスタムリソース (CR) を自動的に作成します。

注記

Cluster Network Operator が管理する NetworkAttachmentDefinition CR は編集しないでください。これを行うと、セカンダリーネットワーク上のネットワークトラフィックが中断される可能性があります。

CNI VRF プラグインでセカンダリーネットワークアタッチメントを作成するには、以下の手順を実行します。

前提条件

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

手順

  1. 以下のサンプル CR のように、セカンダリーネットワーク割り当て用の Network カスタムリソース (CR) を作成し、追加ネットワークの rawCNIConfig 設定を挿入します。YAML を additional-network-attachment.yaml ファイルとして保存します。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      additionalNetworks:
        - name: test-network-1
          namespace: additional-network-1
          type: Raw
          rawCNIConfig: '{
            "cniVersion": "0.3.1",
            "name": "macvlan-vrf",
            "plugins": [  
    1
    
            {
              "type": "macvlan",
              "master": "eth1",
              "ipam": {
                  "type": "static",
                  "addresses": [
                  {
                      "address": "191.168.1.23/24"
                  }
                  ]
              }
            },
            {
              "type": "vrf", 
    2
    
              "vrfname": "vrf-1",  
    3
    
              "table": 1001   
    4
    
            }]
          }'
    Copy to Clipboard Toggle word wrap
    1
    plugins は一覧である必要があります。リストの最初の項目は、VRF ネットワークのベースとなるセカンダリーネットワークである必要があります。一覧の 2 つ目の項目は、VRF プラグイン設定です。
    2
    typevrf に設定する必要があります。
    3
    vrfname は、インターフェイスが割り当てられた VRF の名前です。これが Pod に存在しない場合は作成されます。
    4
    オプション: table はルーティングテーブル ID です。デフォルトで、tableid パラメーターが使用されます。これが指定されていない場合、CNI は空のルーティングテーブル ID を VRF に割り当てます。
    注記

    VRF は、リソースが netdevice タイプの場合にのみ正常に機能します。

  2. Network リソースを作成します。

    $ oc create -f additional-network-attachment.yaml
    Copy to Clipboard Toggle word wrap
  3. 以下のコマンドを実行して、CNO が NetworkAttachmentDefinition CR を作成していることを確認します。<namespace> を、ネットワーク割り当ての設定時に指定した namespace に置き換えます (例: additional-network-1)。

    $ oc get network-attachment-definitions -n <namespace>
    Copy to Clipboard Toggle word wrap

    出力例

    NAME                       AGE
    additional-network-1       14m
    Copy to Clipboard Toggle word wrap

    注記

    CNO が CR を作成するまでに遅延が生じる可能性があります。

検証

  1. Pod を作成し、その Pod を VRF インスタンスを使用してセカンダリーネットワークに割り当てます。

    1. Pod リソースを定義する YAML ファイルを作成します。

      pod-additional-net.yaml ファイルの例

      apiVersion: v1
      kind: Pod
      metadata:
       name: pod-additional-net
       annotations:
         k8s.v1.cni.cncf.io/networks: '[
             {
                     "name": "test-network-1" 
      1
      
             }
       ]'
      spec:
       containers:
       - name: example-pod-1
         command: ["/bin/bash", "-c", "sleep 9000000"]
         image: centos:8
      Copy to Clipboard Toggle word wrap

      1
      VRF インスタンスを持つセカンダリーネットワークの名前を指定します。
    2. 次のコマンドを実行して、Pod リソースを作成します。

      $ oc create -f pod-additional-net.yaml
      Copy to Clipboard Toggle word wrap

      出力例

      pod/test-pod created
      Copy to Clipboard Toggle word wrap

  2. Pod ネットワークアタッチメントが VRF セカンダリーネットワークに接続されていることを確認します。Pod とのリモートセッションを開始し、次のコマンドを実行します。

    $ ip vrf show
    Copy to Clipboard Toggle word wrap

    出力例

    Name              Table
    -----------------------
    vrf-1             1001
    Copy to Clipboard Toggle word wrap

  3. VRF インターフェイスがセカンダリーインターフェイスのコントローラーであることを確認します。

    $ ip link
    Copy to Clipboard Toggle word wrap

    出力例

    5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode
    Copy to Clipboard Toggle word wrap

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.

Linux® is the registered trademark of Linus Torvalds in the United States and other countries.

Java® is a registered trademark of Oracle and/or its affiliates.

XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.

MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.

Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.

The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.

All other trademarks are the property of their respective owners.

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat