複数ネットワーク


OpenShift Container Platform 4.20

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

概要

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

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

OpenShift Container Platform の管理者とユーザーは、ユーザー定義ネットワーク (UDN) または NetworkAttachmentDefinition (NAD) を使用して、クラスターの通常のネットワークトラフィックをすべて処理するネットワークを定義できます。

1.1. OVN-K CNI を備えた複数のネットワーク

デフォルトでは、OVN-Kubernetes が OpenShift Container Platform クラスターの Container Network Interface (CNI) として機能します。このネットワークインターフェイスは、管理者がデフォルトネットワークを作成する際に使用するものです。

ユーザー定義ネットワークとネットワークアタッチメント定義は、どちらも次のネットワークタイプとして機能できます。

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

次の図は、物理ネットワークインターフェイス eth0 を使用して 2 つの namespace に接続する、既存のデフォルトネットワークインフラストラクチャーを持つクラスターを示しています。一方の namespace 内の Pod または仮想マシンは、他の namespace 内の Pod または仮想マシンとは独立して実行されます。プライマリーネットワークは 1 つしか作成できません。ただし、各ネームスペースに対して複数のセカンダリーネットワークを作成することは可能です。

図1.1 複数のセカンダリー UDN を持つ namespace を示す図

複数のセカンダリー UDN を持つ namespace を示す図

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

重要

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

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

  • サポートされている CNI プラグインの完全なリストについては、OpenShift Container Platform におけるセカンダリーネットワークを参照してください。
  • ユーザー定義ネットワークの詳細は、ユーザー定義ネットワーク (UDN) についてを参照してください。
  • ネットワークアタッチメント定義の詳細は、NetworkAttachmentDefinition を使用したプライマリーネットワークの作成を参照してください。

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

ユーザー定義ネットワークとネットワークアタッチメント定義を使用すると、ニーズに合わせてカスタマイズされたネットワークを定義および設定できます。

UserDefinedNetwork および NetworkAttachmentDefinition カスタムリソース (CR) を作成することで、クラスター管理者は次のタスクを実行できます。

  • カスタマイズ可能なネットワーク設定を作成する
  • 独自のネットワークトポロジーを定義する
  • ネットワーク分離を確保する
  • ワークロードの IP アドレス管理
  • 高度なネットワーク機能を設定する

ClusterUserDefinedNetwork CR を作成することで、管理者はクラスターレベルで複数の名前空間にまたがるセカンダリーネットワークを作成および定義できます。

ユーザー定義ネットワークとネットワークアタッチメント定義は、プライマリーおよびセカンダリーネットワークインターフェイスの両方として機能し、それぞれ レイヤ 2 および レイヤ 3 の トポロジーをサポートします。

注記

OpenShift Container Platform 4.19 以降、ClusterUserDefinedNetwork CR による Localnet トポロジーの使用が一般提供になりました。この設定は、物理ネットワークを仮想ネットワークに接続する場合に推奨される方法です。または、NetworkAttachmentDefinition CR を使用して、Localnet トポロジーを持つセカンダリーネットワークを作成することもできます。

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

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

east-west トラフィック

north-south トラフィック

永続的な IP

X

サービス

ルート

X

X

EgressIP リソース

マルチキャスト

X

NetworkPolicy リソース

MultinetworkPolicy リソース

X

X

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

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

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 のみ)

Localnet トポロジーは、UserDefinedNetwork CR では使用できません。NetworkAttachmentDefinition CR のセカンダリーネットワークでのみサポートされます。

Expand
表1.3 ClusterUserDefinedNetwork CR のサポートマトリックス
ネットワーク機能Layer2 トポロジーLayer3 トポロジーLocalnet トポロジー

east-west トラフィック

north-south トラフィック

永続的な IP

X

サービス

 

ルート

X

X

 

EgressIP リソース

 

マルチキャスト

X

 

MultinetworkPolicy リソース

X

X

NetworkPolicy リソース

 

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

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

第2章 セカンダリーネットワークのユースケース

データプレーンとコントロールプレーンの分離など、ネットワークの分離が必要な状況では、セカンダリーネットワークを使用できます。

トラフィックの分離は、以下のようなパフォーマンスおよびセキュリティー関連の理由で必要になります。

  • パフォーマンス

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

  • セキュリティー

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

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

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

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

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

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

ユーザー定義ネットワークとネットワークアタッチメント定義を使用すると、ニーズに合わせてカスタマイズされたネットワークを定義および設定できます。

UserDefinedNetwork および NetworkAttachmentDefinition カスタムリソース (CR) を作成することで、クラスター管理者は次のタスクを実行できます。

  • カスタマイズ可能なネットワーク設定を作成する
  • 独自のネットワークトポロジーを定義する
  • ネットワーク分離を確保する
  • ワークロードの IP アドレス管理
  • 高度なネットワーク機能を設定する

ClusterUserDefinedNetwork CR を作成することで、管理者はクラスターレベルで複数の名前空間にまたがるセカンダリーネットワークを作成および定義できます。

ユーザー定義ネットワークとネットワークアタッチメント定義は、プライマリーおよびセカンダリーネットワークインターフェイスの両方として機能し、それぞれ レイヤ 2 および レイヤ 3 の トポロジーをサポートします。

注記

OpenShift Container Platform 4.19 以降、ClusterUserDefinedNetwork CR による Localnet トポロジーの使用が一般提供になりました。この設定は、物理ネットワークを仮想ネットワークに接続する場合に推奨される方法です。または、NetworkAttachmentDefinition CR を使用して、Localnet トポロジーを持つセカンダリーネットワークを作成することもできます。

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

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

east-west トラフィック

north-south トラフィック

永続的な IP

X

サービス

ルート

X

X

EgressIP リソース

マルチキャスト

X

NetworkPolicy リソース

MultinetworkPolicy リソース

X

X

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

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

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 のみ)

Localnet トポロジーは、UserDefinedNetwork CR では使用できません。NetworkAttachmentDefinition CR のセカンダリーネットワークでのみサポートされます。

Expand
表2.3 ClusterUserDefinedNetwork CR のサポートマトリックス
ネットワーク機能Layer2 トポロジーLayer3 トポロジーLocalnet トポロジー

east-west トラフィック

north-south トラフィック

永続的な IP

X

サービス

 

ルート

X

X

 

EgressIP リソース

 

マルチキャスト

X

 

MultinetworkPolicy リソース

X

X

NetworkPolicy リソース

 

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

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

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

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

ユーザー定義ネットワーク (UDN) は、OVN-Kubernetes を拡張し、デフォルトの分離レベルを備えたカスタムのレイヤー 2 およびレイヤー 3 ネットワークセグメントを可能にすることで、マルチテナントデプロイメントやカスタムネットワークアーキテクチャー向けに、ネットワークの柔軟性、セキュリティー、およびセグメンテーション機能を強化します。

3.1.1. ユーザー定義ネットワークの概要

ネットワークのセグメンテーションと分離を保護および改善するために、クラスター管理者は ClusterUserDefinedNetwork カスタムリソース (CR) を使用してクラスターレベルで名前空間にまたがるプライマリーまたはセカンダリーネットワークを作成できます。一方、開発者は UserDefinedNetwork CR を使用して名前空間レベルでセカンダリーネットワークを定義できます。

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

Kubernetes の設計はシンプルなデプロイメントには有用ですが、このレイヤー 3 トポロジーは、特に最新のマルチテナントデプロイメントにおいて、プライマリーネットワークセグメント設定のカスタマイズを制限します。

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

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

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

ユーザー定義ネットワークは、各ネームスペースに独自の分離されたプライマリーネットワークを提供することでテナントの分離を可能にし、テナント間のトラフィックリスクを低減し、複雑なネットワークポリシーが不要になることでネットワーク管理を簡素化します。

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

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

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

    • レイヤー 2 およびレイヤー 3 のサポート: クラスター管理者は、プライマリーネットワークをレイヤー 2 またはレイヤー 3 のネットワークタイプとして設定できます。
  3. 簡素化されたネットワーク管理

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

    • 一貫性があり選択可能な IP アドレス指定: ユーザーは、異なる namespace 間とクラスター間で IP サブネットを指定して再利用できるため、一貫性のあるネットワーク環境が実現します。
    • 複数のネットワークのサポート: ユーザー定義のネットワーク機能により、管理者は複数の namespace を単一のネットワークに接続したり、異なる namespace セットごとに個別のネットワークを作成したりできます。
    • CUDN を介した仮想マシンの到達可能性: BGP ルートアドバタイズメントが有効になっているレイヤ 2 ClusterUserDefinedNetwork に仮想マシン (VM) を接続すると、VM ルートをプロバイダーネットワークに公開し、ルートをインポートして、ノードごとの静的ルートを回避しながら、VM の Ingress および Egress 到達可能性を向上させることができます。
  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 を作成します。

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

ユーザー定義ネットワーク (UDN) を正常にデプロイするには、DNS 解決動作、イメージレジストリーなどのデフォルトネットワークサービスへのアクセス制限、分離されたネットワーク間のネットワークポリシーの制約、および Pod の前に名前空間とネットワークを作成する必要があることなど、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 からのトラフィックは成功します。
  • IP アドレス不足に関する不明瞭なエラーメッセージ: ユーザー定義ネットワークのサブネットで使用可能な IP アドレスが不足すると、新しい Pod の起動に失敗します。この問題が発生すると、次のエラーが返されます: Warning: Failed to create pod sandbox。このエラーメッセージでは、IP 枯渇が原因であることが明確に示されていません。問題を確認するには、OpenShift Container Platform Web コンソールの Pod の namespace にある Events ページを確認します。ここには、サブネット枯渇に関する明示的なメッセージが報告されています。
  • レイヤ 2 出力 IP 制限 (ユーザー定義ネットワーク CR のみ):

    • Egress IP はデフォルトゲートウェイがないと機能しません。
    • Egress IP は Google Cloud では機能しません。
    • Egress IP は複数のゲートウェイでは機能せず、すべてのトラフィックを単一のゲートウェイに転送します。

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

レイヤ 2 トポロジーは、クラスターノード全体に分散された仮想スイッチを作成します。このネットワークトポロジーは、同一サブネット内での仮想マシン (VM) のスムーズなライブマイグレーションを実現します。レイヤー 3 トポロジーは、ノードごとに固有のセグメントを作成し、それらのセグメント間でルーティングを行います。このネットワークトポロジーは、大規模なブロードキャストドメインを効率的に管理します。

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

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

仮想スイッチを使用して node-1 と node-2 の仮想マシンが相互に通信するフラットなレイヤー 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 経由のノードトラフィックを処理します。これにより、あるノードから別のノードへの仮想マシンのライブマイグレーションが可能になります。

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

仮想マシンを node-1 から node-2 に移行するためにレイヤー 2 トポロジーを使用する UDN

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

3.1.5. ClusterUserDefinedNetwork CR について

ClusterUserDefinedNetwork (CUDN) カスタムリソース (CR) は、OpenShift Container Platform においてクラスタースコープのネットワークセグメンテーションと、管理者のみを対象とした分離機能を提供します。このリソースを定義することで、ネットワークトラフィックがクラスター全体に安全に分割されることが保証されます。

次の図は、クラスター管理者が CUDN 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) が作成されます。

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

ユーザー定義ネットワーク (UDN) におけるテナント分離の概念
3.1.5.1. ClusterUserDefinedNetwork CR のベストプラクティス

ClusterUserDefinedNetwork (CUDN) CR のインスタンスを正常に作成およびデプロイするには、管理者は、デフォルトおよび openshift-* 名前空間の使用を避ける、適切な名前空間セレクター設定を使用する、物理ネットワークパラメーターが一致していることを確認するなど、ベストプラクティスに従う必要があります。

以下の詳細は、管理者が CUDN 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 は作成されません。
  • ClusterUserDefinedNetwork CR を使用して localnet トポロジーを作成する場合、管理者向けのベストプラクティスは次のとおりです。

    • CUDN CR を作成するときに、spec.network.physicalNetworkName パラメーターが Open vSwitch (OVS) ブリッジマッピングで設定したパラメーターと一致していることを確認する必要があります。これにより、意図した物理ネットワークのセグメントに確実にブリッジできます。同じブリッジマッピングを使用して複数の CUDN CR をデプロイする場合は、同じ physicalNetworkName パラメーターが使用されていることを確認する必要があります。
    • 物理ネットワークと他のネットワークインターフェイス間のサブネットの重複を避けてください。ネットワークサブネットが重複すると、ルーティングの競合が発生し、ネットワークが不安定になる可能性があります。spec.network.localnet.excludeSubnets パラメーターは、spec.network.localnet.subnets パラメーター利用時の競合を避ける目的で使用されます。
    • 仮想ローカルエリアネットワーク (VLAN) を設定するときは、基盤となる物理インフラストラクチャー (スイッチ、ルーターなど) とノードの両方が VLAN ID (VID) を受け入れるように適切に設定されていることを確認する必要があります。つまり、物理ネットワークインターフェイス (例: eth1) を、物理スイッチ経由で接続する VLAN (例: 20) のアクセスポートとして設定することになります。さらに、物理インターフェイスが OVN-Kubernetes に適切に接続されていることを確認するために、ノード上に OVS ブリッジマッピング (例: eth1) が存在することを確認する必要があります。
3.1.5.2. CLI を使用した ClusterUserDefinedNetwork CR の作成

OpenShift Container Platform でレイヤー 2 またはレイヤー 3 のいずれかをサポートする、複数の名前空間にわたるクラスター全体のネットワークのセグメンテーションと分離を実装するには、CLI を使用して ClusterUserDefinedNetwork CR を作成します。このリソースを定義することで、ネットワークトラフィックがクラスター全体に安全に分割されることが保証されます。

使用事例に基づいて、Layer2 トポロジータイプの場合は cluster-layer-two-udn.yaml の例を、Layer3 トポロジータイプの場合は cluster-layer-three-udn.yaml の例を使用してリクエストを作成してください。

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

前提条件

  • 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
  2. Layer2 または Layer3 トポロジータイプのいずれかに対してクラスター全体のユーザー定義ネットワークを作成します。

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

      apiVersion: k8s.ovn.org/v1
      kind: ClusterUserDefinedNetwork
      metadata:
        name: <cudn_name>
      spec:
        namespaceSelector:
          matchLabels:
            "<label_1_key>": "<label_1_value>"
            "<label_2_key>": "<label_2_value>"
        network:
          topology: Layer2
          layer2:
            role: Primary
            subnets:
              - "2001:db8::/64"
              - "10.100.0.0/16"

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

      名前
      ClusterUserDefinedNetwork CR の名前を指定します。
      namespaceSelector
      CUDN CR が適用される名前空間のセットに対するラベルクエリーを指定します。標準の Kubernetes MatchLabel セレクターを使用します。default または openshift-* namespace は指定しないでください。
      matchLabels
      matchLabels セレクタータイプを使用します。このセレクタータイプでは、用語が AND 関係で評価されます。この例では、CUDN CR は、<label_1_key>=<label_1_value><label_2_key>=<label_2_value> の両方のラベルを含む namespace にデプロイされます。
      network
      ネットワーク設定を記述します。
      topology
      このフィールドはネットワーク設定を記述します。許容される値は Layer2Layer3 です。Layer2 トポロジータイプを指定すると、すべてのノードで共有される 1 つの論理スイッチが作成されます。このフィールドは、トポロジー設定を指定します。layer2 または layer3 に指定できます。
      role
      Primary または Secondary を指定します。4.20 でサポートされる role 仕様は Primary のみです。
      subnets

      Layer2 トポロジータイプの場合、以下の項目はフィールドの設定詳細を指定します。

      • 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>
      spec:
        namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values: ["<example_namespace_one>", "<example_namespace_two>"]
        network:
          topology: Layer3
          layer3:
            role: Primary
            subnets:
              - cidr: 10.100.0.0/16
                hostSubnet: 24

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

      名前
      ClusterUserDefinedNetwork CR の名前を指定します。
      namespaceSelector
      CUDN CR が適用される名前空間のセットに対するラベルクエリーを指定します。標準の Kubernetes MatchLabel セレクターを使用します。default または openshift-* namespace は指定しないでください。matchExpressions セレクタータイプを使用します。このセレクタータイプでは、用語が OR 関係で評価されます。
      Key
      照合するラベルキーを指定します。演算子の値を受け取ります。有効な値には、InNotInExists、および DoesNotExist が含まれます。matchExpressions タイプが使用されているため、<example_namespace_one> または <example_namespace_two> のいずれかに一致する namespace がプロビジョニングされます。
      network
      ネットワーク設定を記述します。
      topology
      topology フィールドはネットワーク設定を記述します。受け入れられる値は Layer2Layer3 です。Layer3 トポロジータイプを指定すると、ノードごとにレイヤー 2 セグメントが作成され、それぞれに異なるサブネットが割り当てられます。レイヤー 3 ルーティングは、ノードサブネットを相互接続するために使用されます。
      role
      Primary または Secondary を指定します。4.20 でサポートされる role 仕様は Primary のみです。
      subnets

      Layer3 トポロジータイプの場合、subnet フィールドの設定の詳細を次に示します。

      • subnets フィールドは必須です。
      • subnets フィールドのタイプは、cidr および hostSubnet です。

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

    $ oc create --validate=true -f <example_cluster_udn>.yaml

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

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

    $ oc get clusteruserdefinednetwork <cudn_name> -o yaml

    この場合の <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

3.1.5.3. Localnet トポロジー用の ClusterUserDefinedNetwork CR の作成

セカンダリーネットワークを物理的なアンダーレイネットワークに接続するために、Localnet トポロジーを展開します。これにより、east-west クラスタートラフィックとクラスター外で実行されているサービスへのアクセスの両方が可能になります。このトポロジータイプでは、クラスターノード上の基盤となる Open vSwitch (OVS) システムの追加設定が必要です。

前提条件

  • cluster-admin 権限を持つユーザーとしてログインしている。
  • Open vSwitch (OVS) ブリッジマッピングを作成して設定し、OVS ブリッジを介して論理 OVN-Kubernetes ネットワークを物理ノードネットワークに関連付けている。詳細は、「localnet スイッチドトポロジーの設定」を参照してください。

手順

  1. Localnet トポロジーを使用してクラスター全体のユーザー定義ネットワークを作成します。

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

      apiVersion: k8s.ovn.org/v1
      kind: ClusterUserDefinedNetwork
      metadata:
        name: <cudn_name>
      spec:
        namespaceSelector:
          matchLabels:
            "<label_1_key>": "<label_1_value>"
            "<label_2_key>": "<label_2_value>"
        network:
          topology: Localnet
          localnet:
            role: Secondary
            physicalNetworkName: test
            ipam: {lifecycle: Persistent}
            subnets: ["192.168.0.0/16", "2001:dbb::/64"]

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

      名前
      ClusterUserDefinedNetwork CR の名前を指定します。
      namespaceSelector
      CUDN CR が適用される名前空間のセットに対するラベルクエリーを指定します。標準の Kubernetes MatchLabel セレクターを使用します。default または openshift-* namespace は指定しないでください。
      matchLabels
      matchLabels セレクタータイプを使用します。このセレクタータイプでは、用語が AND 関係で評価されます。この例では、CUDN CR は、<label_1_key>=<alabel_1_value><label_2_key>=<label_2_value> の 両方のラベルを含む名前空間にデプロイされます。
      network
      ネットワーク設定を記述します。
      topology
      Localnet トポロジータイプを指定すると、1 つのプロバイダーネットワークに直接ブリッジされる 1 つの論理スイッチが作成されます。
      role
      ネットワーク設定の role を指定します。Secondary は、localnet トポロジーでサポートされる唯一の role 仕様です。
      subnets

      Localnet トポロジータイプの場合、subnet フィールドの設定の詳細を次に示します。

      • subnets フィールドは任意です。
      • subnets フィールドはタイプが string で、IPv4 と IPv6 の両方の標準 CIDR 形式を受け入れます。
      • subnets フィールドには 1 つまたは 2 つの項目を入力できます。2 つの項目の場合、異なる IP ファミリーである必要があります。たとえば、subnets の値は 10.100.0.0/162001:db8::/64 です。
      • localnet サブネットは省略できます。省略した場合、ユーザーは Pod の静的 IP アドレスを設定する必要があります。結果として、ポートセキュリティーは MAC スプーフィングのみを防止します。詳細は、「静的 IP アドレスを使用した Pod 設定」を参照してください。
  2. 次のコマンドを実行してリクエストを適用します。

    $ oc create --validate=true -f <example_cluster_udn>.yaml

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

    <example_cluster_udn>.yaml
    Localnet 設定ファイルの名前です。
  3. 次のコマンドを実行して、リクエストが成功したことを確認します。

    $ oc get clusteruserdefinednetwork <cudn_name> -o yaml

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

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

例3.1 出力例

apiVersion: k8s.ovn.org/v1
kind: ClusterUserDefinedNetwork
metadata:
  creationTimestamp: "2025-05-28T19:30:38Z"
  finalizers:
  - k8s.ovn.org/user-defined-network-protection
  generation: 1
  name: cudn-test
  resourceVersion: "140936"
  uid: 7ff185fa-d852-4196-858a-8903b58f6890
spec:
  namespaceSelector:
    matchLabels:
      "1": "1"
      "2": "2"
  network:
    localnet:
      ipam:
        lifecycle: Persistent
      physicalNetworkName: test
      role: Secondary
      subnets:
      - 192.168.0.0/16
      - 2001:dbb::/64
    topology: Localnet
status:
  conditions:
  - lastTransitionTime: "2025-05-28T19:30:38Z"
    message: 'NetworkAttachmentDefinition has been created in following namespaces:
      [test1, test2]'
    reason: NetworkAttachmentDefinitionCreated
    status: "True"
    type: NetworkCreated
3.1.5.4. Web コンソールを使用した ClusterUserDefinedNetwork CR の作成

OpenShift Container Platform でレイヤー 2 接続を備えた分離されたネットワークセグメントを実装するには、Web コンソールを使用して 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 のデフォルトプライマリーネットワークとして機能します。

3.1.6. UserDefinedNetwork CR について

高度なネットワークセグメンテーションと分離を実現するために、ユーザーと管理者は ユーザー定義ネットワーク (UDN) カスタムリソース (CR) を作成します。UDN は、特定のネームスペース内のネットワークトラフィックをきめ細かく制御することを可能にする。

次の図は、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 を割り当てるという制限があります。

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

ユーザー定義ネットワーク (UDN) における namespace 分離の概念
3.1.6.1. UserDefinedNetwork CR のベストプラクティス

UserDefinedNetwork (UDN) CR のインスタンスを正常にデプロイするには、マスカレード IP アドレスの要件に従い、デフォルトおよび openshift-* ネームスペースを回避し、適切なネームスペースセレクター設定を設定し、物理ネットワークパラメーターの一致を確保する必要があります。

以下の詳細は、UDN 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 フィールドを設定してデフォルト値をオーバーライドする必要があります。詳細は、「ユーザー定義ネットワークの追加設定の詳細」を参照してください。
3.1.6.2. CLI を使用した UserDefinedNetwork CR の作成

CLI を使用して UserDefinedNetwork CR を作成し、名前空間スコープのネットワークセグメンテーションと分離を有効にすることで、特定の名前空間内の Pod に対してカスタムのレイヤ 2 またはレイヤ 3 ネットワークトポロジーを定義できるようになります。

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

前提条件

  • クラスター管理者として、名前空間を作成しました。

    • 名前空間を作成する際に、k8s.ovn.org/primary -user-defined-network ラベルも名前空間に適用したことを確認してください。
    • 名前空間を作成した後、ロールベースアクセス制御 (RBAC) の 表示 および 編集 権限を持つユーザーは、その名前空間内に UserDefinedNetwork CR を作成できます。

手順

  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
  2. Layer2 または Layer3 トポロジータイプのいずれかのユーザー定義ネットワークを作成します。

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

      apiVersion: k8s.ovn.org/v1
      kind: UserDefinedNetwork
      metadata:
        name: udn-1
        namespace: <some_custom_namespace>
      spec:
        topology: Layer2
        layer2: 
      1
      
          role: Primary
          subnets:
            - "10.0.0.0/24"
            - "2001:db8::/60"

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

      name
      UserDefinedNetwork リソースの名前。これは default にすべきではありません。また、Cluster Network Operator (CNO) によって作成されたグローバル namespace と重複してはなりません。
      topology
      ネットワーク設定を指定します。許容される値は Layer2Layer3 です。Layer2 トポロジータイプを指定すると、すべてのノードで共有される 1 つの論理スイッチが作成されます。
      role
      Primary ロールまたは Secondary ロールを指定します。
      subnets

      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
        namespace: <some_custom_namespace>
      spec:
        topology: Layer3
        layer3:
          role: Primary
          subnets:
            - cidr: 10.150.0.0/16
              hostSubnet: 24
            - cidr: 2001:db8::/60
              hostSubnet: 64
      # ...

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

      name
      UserDefinedNetwork リソースの名前。これは default にすべきではありません。また、Cluster Network Operator (CNO) によって作成されたグローバル namespace と重複してはなりません。
      topology
      ネットワーク設定を指定します。許容される値は Layer2Layer3 です。Layer2 トポロジータイプを指定すると、すべてのノードで共有される 1 つの論理スイッチが作成されます。
      role
      Primary ロールまたは Secondary ロールを指定します。
      subnets

      Layer3 トポロジータイプの場合、subnet フィールドの設定の詳細を次に示します。

      • subnets フィールドは必須です。
      • subnets フィールドのタイプは、cidr および hostSubnet です。

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

    $ oc apply -f <my_layer_two_udn>.yaml

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

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

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

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

    出力例

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

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

OpenShift Container Platform でレイヤー 2 接続を備えた分離されたネットワークセグメントを実装するには、Web コンソールを使用して UserDefinedNetwork カスタムリソース (CR) を作成します。このリソースを定義することで、クラスターワークロードがデータリンク層で直接通信できるようになります。

注記

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

前提条件

  • クラスター管理者として、名前空間を作成しました。

    • 名前空間を作成する際に、k8s.ovn.org/primary -user-defined-network ラベルも名前空間に適用したことを確認してください。
    • 名前空間を作成した後、ロールベースアクセス制御 (RBAC) の 表示 および 編集 権限を持つユーザーは、その名前空間内に UserDefinedNetwork CR を作成できます。

手順

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

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

デフォルト値がネットワークトポロジーと競合する場合、または永続的な IP アドレス、カスタムゲートウェイ、特定のサブネット設定が必要な場合は、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>.excludeSubnets

spec.<topology>.excludeSubnets

string

subnets フィールドで指定された CIDR から削除する CIDR のリストを指定します。このリスト内の CIDR は、subnets フィールドで指定された少なくとも 1 つのサブネットの範囲内にある必要があります。省略した場合、OVN-Kubernetes は subnets フィールドに指定されたすべての IP アドレスを割り当てます。標準の CIDR 表記を使用する必要があります。たとえば、10.128.0.0/16 などです。subnets フィールドが設定されていない場合、または ipam.mode フィールドが Disabled に設定されている場合は、このフィールドを省略する必要があります。excludeSubnets フィールドに設定できる値は 25 個のみです。

Localnet トポロジーでセカンダリーネットワークをデプロイする場合、サブネット内の IP の重複を防ぐために、物理ネットワークで使用される IP 範囲を excludeSubnets フィールドに明示的にリストする必要があります。

spec.network.layer2.reservedSubnets

spec.layer2.reservedSubnets

object

このオプションフィールドでは、静的 IP 割り当て用に予約されている CIDR のリストを指定します。そのため、静的 IP は自動割り当てから除外されます。省略すると、subnets フィールド内のすべての IP アドレスが自動割り当てに使用できるようになります。リストされた範囲内のすべての IP アドレスは、Pod アノテーションの静的 IP 割り当てを通じてリクエストできます。各アドレスは、subnets フィールドで指定された CIDR 範囲内になければなりません。このフィールドには、25 件までのエントリーを入力できます。形式は標準の CIDR 表記 (例: 10.128.0.0/16) と一致する必要があります。subnets フィールドが設定されていない場合、または ipam.mode フィールドが Disabled の場合、このフィールドを省略する必要があります。ワークロード用に予約されたアドレスのリストを指定します。このフィールドは、今後 Pod がリクエストできる IP アドレスを予約するために使用できます。

spec.network.layer2.infrastructureSubnets

spec.layer2.infrastructureSubnets

object

このオプションフィールドは、OVN-Kubernetes 内部ネットワークインフラストラクチャー用に使用するアドレスを指定します。この範囲内の IP アドレスは、ワークロードに割り当てることができません。省略すると、OVN-Kubernetes はインフラストラクチャーのニーズに合わせて、subnets フィールドから IP アドレスを自動的に割り当てます。reservedSubnets フィールドも指定されている場合、CIDR が重複してはなりません。さらに defaultGatewayIPs フィールドも指定されている場合、デフォルトゲートウェイ IP アドレスはいずれかの CIDR に属している必要があります。各アドレスは、subnets で指定された CIDR 範囲内にある必要があります。許可されるエントリーの最大数は 10 です。形式は標準の CIDR 表記 (例: 10.128.0.0/16) と一致する必要があります。subnets フィールドが設定されていない場合、または ipam.mode フィールドが Disabled の場合、このフィールドを省略する必要があります。

spec.network.layer2.defaultGatewayIPs

spec.layer2.defaultGatewayIPs

object

このフィールドはオプションであり、ゲートウェイにデフォルトで割り当てられたアドレスをオーバーライドする IP アドレスを指定します。デュアルスタッククラスターの場合、許容される値は IPv4 アドレスと IPv6 アドレスの両方です。内部 OVN-Kubernetes トポロジーで使用されるデフォルトのゲートウェイ IP アドレスを指定します。デュアルスタッククラスターでは 2 つの IP アドレス (IP ファミリーごとに 1 つ) を設定できますが、それ以外の場合は 1 つの IP アドレスしか使用できません。このフィールドは、role フィールドが Primary に設定されている場合にのみ許可されます。OVN-Kubernetes ネットワークトポロジーを明確に必要とし、理解している場合を除き、このフィールドを設定することは推奨されません。省略した場合、OVN-Kubernetes はネットワークの subnet フィールドから最初の IP アドレスを割り当てます。

spec.network.<topology>.ipam.lifecycle

spec.layer2.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.<topology>`ipam.mode

object

mode パラメーターは、OVN-Kubernetes が IP 設定を管理する範囲を制御します。以下のオプションが利用可能です。* 有効: 有効にすると、OVN-Kubernetes は SDN インフラストラクチャーに IP 設定を適用し、選択したサブネットから IP アドレスを個々の Pod に割り当てます。これはデフォルト設定です。Enabled に設定する場合は、subnets フィールドを定義する必要があります。Enabled はデフォルトの設定です。* 無効: 無効にすると、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 です。

spec.network.localnet.vlan

該当なし

object

このフィールドはオプションであり、仮想ローカルエリアネットワーク (VLAN) のタグ付けを設定し、物理ネットワークを複数の独立したブロードキャストドメインに分割できるようにします。

spec.network.localnet.vlan.mode

該当なし

object

設定可能な値は Access です。Access の値は、ネットワークインターフェイスが単一の VLAN に属し、すべてのトラフィックが spec.network.localnet.vlan.mode.access.id フィールドで設定された id でラベル付けされます。id は、アクセスポートの VLAN id (VID) を指定します。値は 1 から 4094 までの整数である必要があります。

spec.network.localnet.physicalNetworkName

該当なし

string

物理ネットワークインターフェイスの名前を指定します。指定する値は、Open vSwitch (OVS) ブリッジマッピングで指定した network-name パラメーターと一致する必要があります。

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

<topology>
UserDefinedNetwork CR の場合、layer2 または layer3 のいずれかになります。ClusterUserDefinedNetwork CR の場合、トポロジーは Localnet になることもできます。

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

OpenShift Container Platform でネットワークデプロイメントのトラブルシューティングを行うには、ClusterUserDefinedNetwork および UserDefinedNetwork カスタムリソース (CR) に対して返されるステータス条件タイプを評価します。これらの条件を確認することで、設定エラーを特定し、解決することができます。

Expand
表3.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
表3.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.

Expand
表3.3 ClusterUserDefinedNetwork CR の無効な mtu シナリオタイプ
条件タイプ理由、メッセージ、解決策

invalid mtu

mtu が正しく設定されていない場合、次のいずれかのメッセージが返されます。

理由

メッセージ

解決方法

mtu フィールドが 65536 よりも高く設定されています。

spec.network.localnet.mtu in body should be less than 65536.

mtu フィールドを 65536 未満に設定する必要があります。

mtu フィールドが 576 より低く設定されています。

spec.network.localnet.mtu in body should be greater than or equal to 576.

mtu フィールドを 576 以上に設定する必要があります。

IPv6 サブネットを使用する場合、mtu フィールドは少なくとも 1280 である必要があります。

MTU should be greater than or equal to 1280 when an IPv6 subnet is used

ユーザー定義のネットワーク設定で IPv6 サブネットが定義されている場合は、mtu フィールドを 1280 以上に設定する必要があります。

Expand
表3.4 ClusterUserDefinedNetwork CR の無効な PhysicalNetworkName シナリオタイプ
条件タイプ理由、メッセージ、解決策

invalid PhysicalNetworkName

PhysicalNetworkName が正しく設定されていない場合、次のいずれかのメッセージが返されます。

理由

メッセージ

解決方法

物理ネットワークの名前が設定されていません。

spec.network.localnet.physicalNetworkName: Required value

physicalNetworkName フィールドを設定する必要があります。

物理ネットワークの名前が長さの最小要件を満たしていません。

spec.network.localnet.physicalNetworkName in body should be at least 1 chars long

物理ネットワーク名は 1 文字以上の長さに設定する必要があります。

物理ネットワークの名前が最大文字数 253 文字を超えています。

spec.network.localnet.physicalNetworkName: Too long: may not be more than 253 bytes

物理ネットワーク名の長さは 253 文字を超えないように設定する必要があります。

物理ネットワークの名前には、、, または : を含めることはできません。

physicalNetworkName cannot contain "," or ":" characters.

物理ネットワーク名から , または : を削除する必要があります。

Expand
表3.5 ClusterUserDefinedNetwork CR の無効な role シナリオタイプ
条件タイプ理由、メッセージ、解決策

role unset または role is primary

spec.network.localnet.role が正しく設定されていない場合、次のいずれかのメッセージが返されます。

理由

メッセージ

解決方法

localnet トポロジーに対して role フィールドを設定する必要があります。

spec.network.localnet.role: Required value

role フィールドを設定する必要があります。

Primary は、Localnet トポロジーではサポートされていない値です。

spec.network.localnet.role: Unsupported value: "Primary": supported values: "Secondary"

Localnet トポロジーの role フィールドを、許容される値である Secondary に設定する必要があります。

Expand
表3.6 ClusterUserDefinedNetwork CR の無効な subnets と ipam のシナリオタイプ
条件タイプ理由、メッセージ、解決策

LocalnetInvalidSubnets

spec.network.localnet.subnets または spec.network.localnet.ipam のいずれかが正しく設定されていない場合、次のいずれかのメッセージが返されます。

理由

メッセージ

解決方法

オプションフィールド (subnetsipam.mode) は一緒に設定する必要があります。

Subnets is required with ipam.mode is Enabled or unset, and forbidden otherwise

spec.network.localnet.ipam.mode が明示的に無効化されていない限り、subnets フィールドを設定する必要があります。

このオプションフィールドを使用する場合、spec.network.localnet.subnets には許容可能な値が設定されている必要があります。

The ClusterUserDefinedNetwork "localnet-empty-subnets-fail" is invalid: spec.network.localnet.subnets: Invalid value: 0: spec.network.localnet.subnets in body should have at least 1 items

spec.network.localnet.subnets に設定可能な値を設定する必要があります。設定可能な値は、OpenShift Container Platform が使用するどの Classless Inter-Domain Routing (CIDR) 範囲とも重複しない、IPv4 および IPv6 の CIDR 範囲です。

オプションの spec.network.localnet.excludeSubnets フィールドを使用する場合は、subnet フィールドを設定する必要があります。

excludeSubnets must be unset when subnets is unset

spec.network.localnet.excludeSubnet フィールドを使用する場合は、spec.network.localnet.subnets フィールドを設定する必要があります。

excludeSubnets は、subnets フィールド内の値である必要があります。

excludeSubnets must be subnetworks of the networks specified in the subnets field

excludeSubnets フィールドの値は、subnets フィールド内に設定する必要があります。たとえば、subnets 値が 192.168.100.0/24 で、excludeSubnets 値が 192.168.200.1/32 の場合は無効です。

CIDR 範囲が無効です。

The ClusterUserDefinedNetwork "localnet-subnets-invalid-ipv4-cidr-fail" is invalid: spec.network.localnet.subnets[0]: Invalid value: "string": CIDR is invalid

spec.network.localnet.subnets フィールドに許容される CIDR 範囲を設定する必要があります。設定可能な値は、OpenShift Container Platform によって使用されていない、または予約されていない IPv4 および IPv6 CIDR 範囲です。

ipam.modeEnabled の場合、または IPAM モードが設定されていない場合は、デフォルト値が Enabled であるため、subnets フィールドを設定する必要があります。

Subnets is required with ipam.mode is Enabled or unset, and forbidden otherwise.

spec.network.localnet.ipam.mode が明示的に無効化されていない限り、spec.network.localnet.subnets フィールドを設定する必要があります。

spec.network.localnet.subnets フィールドに 2 つの CIDR 範囲を設定するには、1 つを IPv4 にし、もう 1 つを IPv6 にする必要があります。

Invalid value…​When 2 CIDRs are set, they must be from different IP families.

CIDR 範囲の 1 つを別の IP ファミリーに変更する必要があります。

spec.network.localnet.ipam.modeDisabled ですが、spec.network.localnet.lifecycle の値は Persistent です。

lifecycle Persistent is only supported when ipam.mode is Enabled

オプションフィールド lifecycle の値が Persistent の場合は、ipam.modeEnabled に設定する必要があります。

Expand
表3.7 ClusterUserDefinedNetwork CR の無効な vlan シナリオタイプ
条件タイプ理由、メッセージ、解決策

invalid vlan または invalid mode

spec.network.localnet.vlan が正しく設定されていない場合、次のいずれかのメッセージが返されます。

理由

メッセージ

解決方法

spec.network.localnet.vlan.mode フィールドを設定する必要があります。

spec.network.localnet.vlan.mode: Unsupported value: "Disabled": supported values: "Access

spec.network.localnet.vlan.mode フィールドを Access モードに設定する必要があります。

spec.network.localnet.vlan.modeAccess モードに設定されている場合、spec.network.localnet.vlan フィールドを設定する必要があります。

vlan access config is required when vlan mode is 'Access', and forbidden otherwise.

Access モードを使用する場合は、spec.network.localnet.vlan.mode.access フィールドを設定する必要があります。

Access モードを使用する場合は、spec.network.localnet.vlan.access.id 値を設定する必要があります。

spec.network.localnet.vlan.access.id: Required value

spec.network.localnet.mode.access.id の値を設定する必要があります。

access.id に設定可能な値は 1 以上です。

spec.network.localnet.vlan.access.id in body should be greater than or equal to 1

access.id フィールドには 1 以上の値を設定する必要があります。

access.id に設定可能な値は 4094 以下です。

spec.network.localnet.vlan.access.id in body should be less than or equal to 4094

access.id フィールドには 4094 以下の値を設定する必要があります。

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

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

デフォルトでは、ユーザー定義ネットワーク (UDN) 上の Pod はデフォルトネットワークから分離されています。つまり、モニタリングサービス (Prometheus または Alertmanager) や OpenShift Container Platform イメージレジストリーを実行しているデフォルトのネットワーク Pod は、UDN 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
# ...
注記

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

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

OVN-Kubernetes 以外の CNI プラグイン (IPVLAN や MACVLAN など) を使用する必要がある場合、または高度なネットワークシナリオのために Container Network Interface (CNI) 設定を直接制御する必要がある場合は、NetworkAttachmentDefinition (NAD) リソースを使用してプライマリーネットワークを作成します。

3.2.1. プライマリーネットワークの管理方法

NAD CR によって作成されたプライマリーネットワークのライフサイクルは、Cluster Network Operator (CNO) または YAML マニフェストを通じて管理できます。CNO を使用することでネットワークリソースの自動管理が可能になり、YAML マニフェストを適用することでネットワーク設定を直接制御できます。

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>

3.2.2. Cluster Network Operator によるプライマリーネットワークアタッチメントの作成

Cluster Network Operator (CNO) を使用して作成するプライマリーネットワークを指定すると、CNO は NetworkAttachmentDefinition カスタムリソース定義 (CRD) を自動的に作成し、それを管理します。

重要

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

前提条件

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

手順

  1. オプション: プライマリーネットワークの namespace を作成します。

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

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

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

検証

  • 次のコマンドを実行して、CNO が NetworkAttachmentDefinition CRD を作成したことを確認します。CNO が CRD を作成するまでに遅延が発生する可能性があります。予想される出力には、NAD CRD の名前と作成後の経過時間 (分) が表示されます。

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

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

    <namespace>
    CNO の設定に追加したネットワークアタッチメントの namespace を指定します。

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

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

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

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

metadata.name

string

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

metadata.namespace

string

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

spec.config

string

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

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

NetworkAttachmentDefinition YAML マニフェストを直接適用して、プライマリーネットワークアタッチメントを作成します。これにより、Cluster Network Operator にリソースの自動管理を任せることなく、ネットワーク設定を完全に制御できるようになります。

前提条件

  • 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",
          "type": "host-device",
          "device": "eth1",
          "ipam": {
            "type": "dhcp"
          }
        }
    1. オプション: NAD が適用される namespace を指定できます。NAD をデプロイする名前空間内で作業している場合は、名前空間の 指定は不要です。
  2. プライマリーネットワークを作成するには、次のコマンドを入力します。

    $ oc apply -f <file>.yaml

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

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

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

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

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

4.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 の作成はサポートされていません。

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

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

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

OVN-Kubernetes ネットワークプラグインの JSON 設定オブジェクトには、OVN-Kubernetes CNI ネットワークプラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。

Expand
表4.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 タグは割り当てられません。

physicalNetworkName

string

トポロジーが localnet に設定されている場合、複数のネットワークオーバーレイで同じ物理ネットワークマッピングを再利用できます。OVN オーバーレイが接続する物理ネットワークの名前を指定します。省略した場合、デフォルト値は localnet ネットワークの name になります。異なるネットワークを分離するには、オーバーレイ間で同じ物理ネットワークを共有するときに、異なる VLAN タグが使用されていることを確認します。

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

ネットワークポリシーを定義する場合、使用できるネットワークポリシールールは、OVN-Kubernetes セカンダリーネットワークが subnets フィールドを定義しているかどうかによって異なります。

k8s.cni.cncf.io API グループの MultiNetworkPolicy カスタムリソース定義 (CRD) によって提供されるマルチネットワークポリシー API は、OVN-Kubernetes セカンダリーネットワークと互換性があります。

subnets CNI 設定に基づいてサポートされているマルチネットワークポリシーセレクターの詳細は、次の表を参照してください。

Expand
subnets フィールドの指定許可されているマルチネットワークポリシーセレクター

はい

  • podSelectornamespaceSelector
  • ipBlock

いいえ

  • ipBlock

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

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: {}

次の例では、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

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

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

重要

複数の NAD を作成する場合は、各 NAD が一意の VLAN ID 番号を参照するようにしてください。2 つの NAD が同じ VLAN ID を参照している場合、OVN-Kubernetes ネットワークプラグインでネットワークの問題が発生します。

セカンダリーネットワークを OVN-Kubernetes のセカンダリーネットワークとして使用するには、それを OVS ブリッジにマッピングする必要があります。ブリッジマッピングにより、ネットワークトラフィックが物理ネットワークに到達できるようになります。ブリッジマッピングは、インターフェイスラベルとも呼ばれる物理ネットワーク名を、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 ブリッジから削除したり、インターフェイス設定を変更したりしないでください。ネットワークインターフェイスを削除または変更すると、クラスターネットワークが正常に動作しなくなります。
  • ノードに複数のネットワークインターフェイスが含まれている場合は、別のネットワークインターフェイスを新しいブリッジに接続して、セカンダリーネットワークに使用できます。このアプローチでは、プライマリークラスターネットワークからトラフィックが分離されます。
注記

インストール後のタスクとして、NodeNetworkConfigurationPolicy (NNCP) リソースで br-ex ブリッジまたはその基盤となるインターフェイスの設定変更を行うことはできません。回避策として、ホストまたはスイッチに接続されたセカンダリーネットワークインターフェイスを使用してください。

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

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: mapping
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ''
  desiredState:
    ovn:
      bridge-mappings:
      - localnet: localnet1
        bridge: br-ex
        state: present

詳細は次のとおりです。

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

+ 次の JSON 例は、localnet1 という名前のローカルネットのセカンダリーネットワークを設定します。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"
}

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

apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: ovs-br1-multiple-networks
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ''
  desiredState:
    interfaces:
    - name: ovs-br1
      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
        port:
        - name: eth1
    ovn:
      bridge-mappings:
      - localnet: localnet2
        bridge: ovs-br1
        state: present

詳細は次のとおりです。

+ metadata.name:: 設定オブジェクトの名前を指定します。node-role.kubernetes.io/worker:: ノードネットワーク設定ポリシーが適用されるノードを識別するノードセレクターを指定します。desiredState.interfaces.name:: OVN-Kubernetes がクラスタートラフィックに使用するデフォルトのブリッジとは別に動作する新しい OVS ブリッジを指定します。options.mcast-snooping-enable:: マルチキャストスヌーピングを有効にするかどうかを指定します。マルチキャストスヌーピングを有効にすると、ネットワークデバイスがすべてのネットワークメンバーにマルチキャストトラフィックをフラッディングすることを防止します。デフォルトでは、OVS ブリッジはマルチキャストスヌーピングを有効にしません。デフォルト値は false です。bridge.port.name:: ホストシステム上で新しい OVS ブリッジに関連付けるネットワークデバイスを指定します。ovn.bridge-mappings.localnet:: OVS ブリッジにトラフィックを転送するセカンダリーネットワークの名前を指定します。この名前は、OVN-Kubernetes セカンダリーネットワークを定義する NetworkAttachmentDefinition CRD の spec.config.name フィールドの値と一致する必要があります。ovn.bridge-mappings.bridge:: ノード上の OVS ブリッジの名前を指定します。値は、state: present が設定されている場合にのみ必要です。ovn.bridge-mappings.state:: マッピングの状態を指定します。有効な値は、ブリッジを追加する場合は 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"
}
4.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"
}
4.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
4.1.1.6. 静的 IP アドレスを使用して Pod を設定する

静的 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",
        "mac": "02:03:04:05:06:07",
        "interface": "myiface1",
        "ips": [
          "192.0.2.20/24"
          ]
      }
    ]'
  name: tinypod
  namespace: ns1
spec:
  containers:
  - args:
    - pause
    image: k8s.gcr.io/e2e-test-images/agnhost:2.36
    imagePullPolicy: IfNotPresent
    name: agnhost-container

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

k8s.v1.cni.cncf.io/networks.name
ネットワークの名前。この値は、すべての NetworkAttachmentDefinition CRD にわたって一意である必要があります。
k8s.v1.cni.cncf.io/networks.mac
インターフェイスに割り当てられる MAC アドレス。
k8s.v1.cni.cncf.io/networks.interface
Pod 用に作成されるネットワークインターフェイスの名前。
k8s.v1.cni.cncf.io/networks.ips
ネットワークインターフェイスに割り当てられる IP アドレス。

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

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

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

ブリッジ CNI プラグインの JSON 設定オブジェクトには、ブリッジ CNI プラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

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

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

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
4.2.1.1. ブリッジ CNI プラグインの設定例

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

{
  "cniVersion": "0.3.1",
  "name": "bridge-net",
  "type": "bridge",
  "isGateway": true,
  "vlan": 2,
  "ipam": {
    "type": "dhcp"
    }
}

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

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

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

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

cniVersion

string

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

type

string

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

miimon

string

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

mtu

integer

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

failOverMac

integer

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

mode

string

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

xmitHashPolicy

string

集約されたインターフェイス全体に負荷を分散するための送信ハッシュポリシーを指定します。このパラメーターのデフォルトは layer2 で、layer2layer2+3layer3+4 の値を使用できます。

linksInContainer

boolean

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

links

object

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

ipam

object

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

重要

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

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

4.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"
    }
}

次の例では、bond-tlb-net という名前のセカンダリーネットワークを、xmitHashPolicy 機能を有効にして設定します。

{
 "type": "bond",
 "cniVersion": "0.3.1",
 "name": "bond-tlb-net",
 "mode": "tlb",
 "xmitHashPolicy": "layer2+3",
 "failOverMac": 0,
 "linksInContainer": true,
 "miimon": "100",
 "mtu": 1500,
 "links": [
       {"name": "net1"},
       {"name": "net2"}
   ],
  "ipam": {
        "type": "host-local",
        "subnet": "10.57.218.0/24",
        "routes": [{
        "dst": "0.0.0.0/0"
        }],
        "gateway": "10.57.218.1"
    }
}
  • xmitHashPolicy: このパラメーターは、ボンディング内の net1 および net2 アクティブメンバーインターフェイス間で送信ネットワークトラフィックがどのように分散されるかを決定します。ハッシュアルゴリズムは、レイヤー 2 情報 (具体的には送信元および宛先の MAC アドレス) とレイヤー 3 情報 (送信元および宛先の IP アドレスを含む) を組み合わせます。

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

ホストデバイス CNI プラグインの JSON 設定オブジェクトには、ホストデバイス CNI プラグインの設定パラメーターを記述します。

注記

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

次の表に、設定パラメーターの詳細を示します。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

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 アドレスを指定します。

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

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

{
  "cniVersion": "0.3.1",
  "name": "hostdev-net",
  "type": "host-device",
  "device": "eth1"
}

4.2.4. ダミーデバイスの追加ネットワークの設定

ダミー CNI プラグインはループバックデバイスのように機能します。プラグインは仮想インターフェイスであり、プラグインを使用してパケットを指定された IP アドレスにルーティングできます。ループバックデバイスとは異なり、IP アドレスは任意であり、127.0.0.0/8 のアドレス範囲に制限されません。

ダミーデバイス CNI プラグインの JSON 設定オブジェクトには、ダミー CNI プラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

type

string

設定する CNI プラグインの名前。必要な値は dummy です。

ipam

object

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

4.2.4.1. ダミー設定の例

以下の例では、hostdev-net という名前の追加のネットワークを設定します。

{
  "cniVersion": "0.3.1",
  "name": "dummy-net",
  "type": "dummy",
  "ipam": {
      "type": "host-local",
      "subnet": "10.1.1.0/24"
  }
}

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

VLAN CNI プラグインの JSON 設定オブジェクトには、VLAN、vlan、および CNI プラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

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 サブインターフェイスを複数作成できないためです。

4.2.5.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" ]
  }
}
  • ipam.type.host-local: 指定されたアドレス範囲のセットから IPv4 および IPv6 IP アドレスを割り当てます。IPAM プラグインは、IP アドレスがそのホストで引き続き一意になるように、IP アドレスをホストファイルシステム上にローカルで保存します。

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

IPVLAN CNI プラグインの JSON 設定オブジェクトには、IPVLAN、ipvlan、および CNI プラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

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 インターフェイスの設定には前の結果が使用されます。
4.2.6.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"
       }
    ]
  }
}

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

MACVLAN CNI プラグインの JSON 設定オブジェクトには、MAC Virtual LAN (MACVLAN) Container Network Interface (CNI) プラグインの設定パラメーターを記述します。以下の表では、これらのパラメーターについて説明しています。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

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

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

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

{
  "cniVersion": "0.3.1",
  "name": "macvlan-net",
  "type": "macvlan",
  "master": "eth1",
  "linkInContainer": false,
  "mode": "bridge",
  "ipam": {
    "type": "dhcp"
    }
}

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

TAP CNI プラグインの JSON 設定オブジェクトには、TAP CNI プラグインの設定パラメーターを記述します。以下の表では、これらのパラメーターについて説明しています。

Expand
フィールド説明

cniVersion

string

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

name

string

この CNI ネットワークアタッチメント定義に割り当てられる、必須かつ一意の識別子。これはコンテナーランタイムが適切なネットワーク設定を選択するために使用され、IP アドレス割り当てなどの永続的なリソース状態管理の鍵として機能します。

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

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

4.2.8.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"
}

4.2.9. TAP CNI プラグインの SELinux ブール値の設定

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

前提条件

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

手順

  1. 次の詳細を含む新しい YAML ファイルを作成します。

    例: setsebool-container-use-devices.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

  2. 次のコマンドを実行して、新しい MachineConfig オブジェクトを作成します。

    $ oc apply -f setsebool-container-use-devices.yaml
    注記

    MachineConfig オブジェクトに変更を適用すると、変更の適用後に、影響を受けるすべてのノードがグレースフルに再起動されます。MCO による更新の適用には時間がかかる場合があります。

検証

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

    $ oc get machineconfigpools
    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
    注記

    すべてのノードが Updated および Ready 状態になっている必要があります。

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

ルートオーバーライド CNI プラグインの JSON 設定オブジェクトには、route-override CNI プラグインの設定パラメーターを記述します。次の表にそのパラメーターの詳細を示します。

Expand
フィールド説明

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 を使用してルートを動的に変更する場合、このチェックをスキップすると、最終設定に更新されたルートが確実に反映されます。

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

route-override CNI は、親となる CNI と連結して使用することを前提とした CNI の一種です。この種類の CNI は、独立して動作しません。親 CNI がネットワークインターフェイスを作成して IP アドレスを割り当てることに依存しています。その後に初めて、この CNI はルーティングルールを変更できるようになります。

次の例では、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",
            "master": "eth1",
            "mode": "bridge",
            "ipam": {
                "type": "host-local",
                "subnet": "192.168.1.0/24"
            }
        },
        {
            "type": "route-override",
            "flushroutes": true,
            "delroutes": [
                {
                    "dst": "192.168.0.0/24"
                }
            ],
            "addroutes": [
                {
                    "dst": "192.168.0.0/24",
                    "gw": "10.1.254.254"
                }
            ]
        }
    ]
}

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

"type": "macvlan"
親 CNI は eth1 にアタッチされたネットワークインターフェイスを作成します。
"type": "route-override"
連結された route-override CNI はルーティングルールを変更します。

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

OpenShift Container Platform で、Pod がプライマリークラスターネットワーク以外の追加のネットワークインターフェイスを使用できるようにするには、Pod をセカンダリーネットワークに接続します。セカンダリーネットワークは、ワークロードに対して追加の接続オプションを提供します。

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

OpenShift Container Platform で Pod が追加のネットワークインターフェイスを使用できるようにするには、Pod をセカンダリーネットワークに接続します。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。

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

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

前提条件

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

手順

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

    1. カスタマイズせずにセカンダリーネットワークをアタッチするには、次の形式でアノテーションを追加します。

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]

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

      k8s.v1.cni.cncf.io/networks
      Pod に関連付けるセカンダリーネットワークの名前を指定します。複数のセカンダリーネットワークを指定するには、各ネットワークをコンマで区切ります。コンマの間にはスペースを入れないでください。同じセカンダリーネットワークを複数回指定した場合、Pod は複数のネットワークインターフェイスをそのネットワークにアタッチします。
    2. カスタマイズしてセカンダリーネットワークをアタッチするには、次の形式でアノテーションを追加します。

      metadata:
        annotations:
          k8s.v1.cni.cncf.io/networks: |-
            [
              {
                "name": "<network>",
                "namespace": "<namespace>",
                "default-route": ["<default_route>"]
              }
            ]

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

      <network>
      NetworkAttachmentDefinition オブジェクトによって定義されたセカンダリーネットワークの名前を指定します。
      <namespace>
      NetworkAttachmentDefinition オブジェクトが定義される namespace を指定します。
      < デフォルトルート >
      オプションのパラメーター。デフォルトルートのオーバーライドを指定します (192.168.17.1 など)。
  2. 以下のコマンドを入力して Pod を作成します。

    $ oc create -f <name>.yaml

    <name> を Pod の名前に置き換えます。

  3. オプション: 以下のコマンドを入力して、アノテーションが pod CR に存在することを確認します。<name> を Pod の名前に置き換えます。

    $ oc get pod <name> -o yaml

    次の例では、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: |-
          [{
              "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:
      ...

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

    k8s.v1.cni.cncf.io/network-status
    オブジェクトの JSON 配列を指定します。各オブジェクトは、Pod にアタッチされているセカンダリーネットワークのステータスを表します。アノテーションの値はプレーンテキストの値として保存されます。
4.3.1.1. Pod 固有のアドレスおよびルーティングオプションの指定

OpenShift Container Platform で Pod の静的 IP アドレス、MAC アドレス、およびデフォルトルートを設定するには、JSON 形式のアノテーションを使用して Pod 固有のアドレス指定およびルーティングオプションを設定できます。これらのアノテーションを使用すると、セカンダリーネットワーク上の個々の Pod のネットワーク動作をカスタマイズできます。

前提条件

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

手順

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

    $ oc edit pod <name>
  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>,...]]'
    # ...

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

    <network>
    次の例に示すように、JSON オブジェクトに置き換えます。一重引用符が必要です。

    次の例では、アノテーション内で default-route パラメーターを使用して、デフォルトルートを持つネットワークアタッチメントを指定しています。

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
        {
          "name": "net1"
        },
        {
          "name": "net2",
          "default-route": ["192.0.2.1"]
        }]'
    spec:
      containers:
      - name: example-pod
        command: ["/bin/bash", "-c", "sleep 2000000000000"]
        image: centos/tools

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

    net1net2
    Pod に関連付けるセカンダリーネットワークを定義する NetworkAttachmentDefinition リソースの名前を指定します。
    192.0.2.1
    ルーティングテーブルに他のルーティングテーブルがない場合に、ルーティングされるトラフィックに使用されるゲートウェイ値を指定します。複数の default-route キーを指定すると、Pod がアクティブでなくなります。

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

    重要

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

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

    $ oc exec -it <pod_name> -- ip route
    注記

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

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

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

    $ oc edit networks.operator.openshift.io cluster

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

    Cluster Network Operator YAML の設定

    name: <name>
    namespace: <namespace>
    rawCNIConfig: '{
      ...
    }'
    type: Raw

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

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

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

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

    {
      "cniVersion": "0.3.1",
      "name": "<name>",
      "plugins": [{
          "type": "macvlan",
          "capabilities": { "ips": true },
          "master": "eth0",
          "mode": "bridge",
          "ipam": {
            "type": "static"
          }
        }, {
          "capabilities": { "mac": true },
          "type": "tuning"
        }]
    }

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

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

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

  4. 以下のコマンドを入力して Pod を編集します。

    $ oc edit pod <name>

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

    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
          {
            "name": "<name>",
            "ips": [ "192.0.2.205/24" ],
            "mac": "CA:FE:C0:FF:EE:00"
          }
        ]'

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

    metadata.name
    作成するセカンダリーネットワークアタッチメントの名前を指定します。名前は指定された namespace 内で一意である必要があります。
    metadata.annotations.k8s.v1.cni.cncf.io/ips
    サブネットマスクを含む IP アドレスを指定します。
    metadata.annotations.k8s.v1.cni.cncf.io/mac
    MAC アドレスを指定します。
    注記

    静的 IP アドレスと MAC アドレスを同時に使用する必要はありません。個別に使用することも、組み合わせて使用することもできます。

4.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) アプリケーションではサポートされていません。

4.4.1. マルチネットワークポリシーとネットワークポリシーの違い

MultiNetworkPolicy API は NetworkPolicy API を実装していますが、この 2 つのポリシーには次の重要な違いがあることを必ず理解しておいてください。

  • MultiNetworkPolicy API は、次の設定例に示すように使用する必要があります。

    apiVersion: k8s.cni.cncf.io/v1beta1
    kind: MultiNetworkPolicy
    # ...
  • 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>
    # ...

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

    <namespace_name>
    namespace 名を指定します。
    <network_name>
    ネットワークアタッチメント定義の名前を指定します。

4.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
    # ...
  2. マルチネットワークポリシーを有効にするようにクラスターを設定します。成功した出力には、ポリシーオブジェクトの名前と patched ステータスがリスト表示されます。

    $ oc patch network.operator.openshift.io cluster --type=merge --patch-file=multinetwork-enable-patch.yaml

4.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
    -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
    # accept RA/RS
    -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
    -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT

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

icmpv6-type neighbor-solicitation
このルールは、近隣探索プロトコル (NDP) の一部である ICMPv6 ネイバー要請メッセージの受信を許可します。これらのメッセージは、近隣ノードのリンクレイヤーアドレスを決定するのに役立ちます。
icmpv6-type neighbor-advertisement
このルールは、NDP の一部であり、送信者のリンクレイヤーアドレスに関する情報を提供する、受信 ICMPv6 近隣アドバタイズメントメッセージを許可します。
icmpv6-type router-solicitation
このルールは、ICMPv6 ルーター要請メッセージの受信を許可します。ホストは、これらのメッセージを使用してルーター設定情報を要求します。
icmpv6-type router-advertisement
このルールは、ホストに設定情報を提供する ICMPv6 ルーターアドバタイズメントメッセージの受信を許可します。
注記

これらの事前定義されたルールは編集できません。

これらの一連のルールによって、アドレス解決やルーター通信など、IPv6 環境でネットワークが正しく機能するために不可欠な ICMPv6 トラフィックが有効になります。これらのルールが適用され、トラフィックを拒否するマルチネットワークポリシーがあれば、アプリケーションで接続の問題が発生することは考えられません。

4.4.4. マルチネットワークポリシーの使用

セカンダリーネットワーク上の Pod のネットワークトラフィックの分離とセキュリティーを管理するために、マルチネットワークポリシーを作成、編集、表示、および削除できます。マルチネットワークポリシーを使用する前に、クラスターでマルチネットワークポリシーのサポートを有効にする必要があります。

4.4.4.1. CLI を使用したマルチネットワークポリシーの作成

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

前提条件

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

手順

  1. ポリシールールを作成します。

    1. <policy_name>.yaml ファイルを作成します。

      $ touch <policy_name>.yaml

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

      <policy_name>
      マルチネットワークポリシーのファイル名を指定します。
    2. 作成したファイルにマルチネットワークポリシーを定義します。次の例では、全 namespace 内の全 Pod からの Ingress トラフィックを拒否します。これは基本的なポリシーであり、他のネットワークポリシーの設定によって許可されたクロス Pod トラフィック以外のすべてのクロス Pod ネットワーキングをブロックします。

      apiVersion: k8s.cni.cncf.io/v1beta1
      kind: MultiNetworkPolicy
      endif:: multi[]
      metadata:
        name: deny-by-default
        annotations:
          k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
      spec:
        podSelector: {}
        policyTypes:
        - Ingress
        ingress: []

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

      <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: {}
      # ...

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

      <network_name>

      ネットワークアタッチメント定義の名前を指定します。

      次の例では、特定の namespace から 1 つの Pod への Ingress トラフィックを許可します。このポリシーは 、名前空間 y で実行されている 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
      # ...

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

      <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
        # ...

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

      <network_name>
      ネットワークアタッチメント定義の名前を指定します。
  2. マルチネットワークポリシーオブジェクトを作成するには、以下のコマンドを入力します。正常に処理された場合、ポリシーオブジェクトの名前と 作成 ステータスが表示されます。

    $ oc apply -f <policy_name>.yaml -n <namespace>

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

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

    正常に処理された場合、ポリシーオブジェクトの名前と 作成 ステータスが表示されます。

    注記

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

4.4.4.2. マルチネットワークポリシーの編集

既存のポリシー設定を変更するには、名前空間内のマルチネットワークポリシーを編集します。ポリシーを編集するには、ポリシーファイルを変更して oc apply コマンド で適用するか、oc edit コマンドを直接使用します。

注記

cluster-admin 特権でログインすると、クラスター内の任意のネームスペースのネットワークポリシーを編集できます。Web コンソールでは、YAML 形式で直接ポリシーを編集するか、アクション メニューを使用して編集できます。

前提条件

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

手順

  1. オプション: namespace のマルチネットワークポリシーオブジェクトをリスト表示するには、以下のコマンドを入力します。

    $ oc get multi-network policy -n <namespace>

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

    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
  2. マルチネットワークポリシーオブジェクトを編集します。

    1. マルチネットワークポリシーの定義をファイルに保存した場合は、ファイルを編集して必要な変更を加えてから、以下のコマンドを入力します。

      $ oc apply -n <namespace> -f <policy_file>.yaml

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

      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
      <policy_file>
      ネットワークポリシーを含むファイルの名前を指定します。
    2. マルチネットワークポリシーオブジェクトを直接更新する必要がある場合、以下のコマンドを入力できます。

      $ oc edit multi-network policy <policy_name> -n <namespace>

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

      <policy_name>
      ネットワークポリシーの名前を指定します。
      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
  3. マルチネットワークポリシーオブジェクトが更新されていることを確認します。

    $ oc describe multi-networkpolicy <policy_name> -n <namespace>

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

    <policy_name>
    マルチネットワークポリシーの名前を指定します。
    <namespace>
    オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
4.4.4.3. CLI を使用したマルチネットワークポリシーの表示

namespace のマルチネットワークポリシーを検査できます。

注記

cluster-admin 特権でログインすると、クラスター内の任意のネームスペースのネットワークポリシーを編集できます。Web コンソールでは、YAML 形式で直接ポリシーを編集するか、アクション メニューを使用して編集できます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてクラスターにログインしていること。
  • マルチネットワークポリシーが存在する namespace で作業している。

手順

  1. namespace 内のマルチネットワークポリシーをリスト表示します。

    1. 次のコマンドを入力し、namespace 内に定義されているマルチネットワークポリシーオブジェクトを表示します。

      $ oc get multi-networkpolicy
    2. オプション: 特定のマルチネットワークポリシーを調べるには、次のコマンドを入力します。

      $ oc describe multi-networkpolicy <policy_name> -n <namespace>

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

      <policy_name>
      検査するマルチネットワークポリシーの名前を指定します。
      <namespace>
      オプション: オブジェクトが現在の namespace 以外の namespace に定義されている場合は namespace を指定します。
4.4.4.4. CLI を使用したマルチネットワークポリシーの削除

namespace のマルチネットワークポリシーを削除できます。

注記

cluster-admin 特権でログインすると、クラスター内の任意の名前空間にあるネットワークポリシーを削除できます。Web コンソールでは、YAML 形式で直接ポリシーを削除するか、アクション メニューを使用してポリシーを削除できます。

前提条件

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

手順

  • マルチネットワークポリシーオブジェクトを削除するには、以下のコマンドを入力します。正常に処理された場合、ポリシーオブジェクトの名前と 削除 ステータスが表示されます。

    $ oc delete multi-networkpolicy <policy_name> -n <namespace>

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

    <policy_name>
    マルチネットワークポリシーの名前を指定します。
    <namespace>
    オプションのパラメーター。現在の namespace とは異なる namespace でオブジェクトを定義した場合、パラメーターは namespace を指定します。
4.4.4.5. デフォルトのすべてのマルチネットワーク拒否ポリシーの作成

デフォルトの全拒否マルチネットワークポリシーは、デプロイされた他のネットワークポリシーの設定によって許可されるネットワークトラフィックと、ホストネットワークを使用する Pod 間のトラフィック以外のすべての Pod 間ネットワークをブロックします。この手順では 、my-project 名前空間に デフォルトで拒否する ポリシーを適用することにより、強力な拒否ポリシーを強制します。

警告

トラフィック通信を許可する 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
      annotations:
        k8s.v1.cni.cncf.io/policy-for:<namespace_name>/<network_name>
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress: []

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

    namespace
    ポリシーをデプロイする namespace を指定します。たとえば、my-project という 名前空間。
    annotations
    namespace プロジェクトの名前と、それに続くネットワークアタッチメント定義名を指定します。
    podSelector
    このフィールドが空の場合、設定はすべての Pod と一致します。したがって、このポリシーは my-project 名前空間内のすべての Pod に適用されます。
    policyTypes
    NetworkPolicy が関連付けられるルールタイプのリストを指定します。
    - Ingress
    Ingress のみの policyTypes を指定します。
    ingress
    Ingress ルールを指定します。指定しない場合は、すべての Pod へのすべての着信トラフィックがドロップされます。
  2. 次のコマンドを入力して、ポリシーを適用します。正常に処理された場合、ポリシーオブジェクトの名前と 作成 ステータスが表示されます。

    $ oc apply -f deny-by-default.yaml
4.4.4.6. 外部クライアントからのトラフィックを許可するマルチネットワークポリシーの作成

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:
        - {}
  2. 次のコマンドを入力して、ポリシーを適用します。正常に処理された場合、ポリシーオブジェクトの名前と 作成 ステータスが表示されます。

    $ oc apply -f web-allow-external.yaml

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

    外部クライアントからのトラフィックを許可する

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

注記

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

前提条件

  • クラスターが、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
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector: {}

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

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

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

    注記

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

  2. 次のコマンドを入力して、ポリシーを適用します。正常に処理された場合、ポリシーオブジェクトの名前と 作成 ステータスが表示されます。

    $ oc apply -f web-allow-all-namespaces.yaml

検証

  1. 次のコマンドを入力して、default の名前空間で Web サービスを開始します。

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 次のコマンドを実行して、alpine イメージを secondary 名前空間にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=secondary --rm -i -t --image=alpine -- sh
  3. シェルで次のコマンドを実行し、サービスがリクエストを許可することを確認します。

    # wget -qO- --timeout=2 http://web.default
    <!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>

特定の名前空間から、ラベルが アプリケーション=web の Pod へのトラフィックを許可するポリシーを設定できます。この設定は、次のユースケースで役立ちます。

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

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

前提条件

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

network.openshift.io/policy-group: ingress ラベルをカスタム名前空間またはプロジェクトに適用しないでください。このラベルは Operator が管理し、OpenShift Container Platform のネットワーク機能専用です。システムによって作成された名前空間では、これを変更してはいけません。

このラベルを使用すると、断続的なネットワーク接続の切断、意図しないシステム NetworkPolicies リソースの適用、またはオペレーターが状態を調整しようとする際に設定のずれが発生する可能性があります。カスタムトラフィックグループを作成する場合は、必ず以下の手順に示すように、一意のユーザー定義ラベルを使用してください。

手順

  1. ラベルが Purpose=production の特定の名前空間内のすべての 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
      policyTypes:
      - Ingress
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              purpose: production

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

    app
    デフォルトの名前空間の app:web Pod にのみポリシーを適用します。
    purpose
    ラベルが purpose=production の名前空間内の Pod のみにトラフィックを制限します。
  2. 次のコマンドを入力して、ポリシーを適用します。正常に処理された場合、ポリシーオブジェクトの名前と 作成 ステータスが表示されます。

    $ oc apply -f web-allow-prod.yaml

検証

  1. 次のコマンドを入力して、default の名前空間で Web サービスを開始します。

    $ oc run web --namespace=default --image=nginx --labels="app=web" --expose --port=80
  2. 次のコマンドを実行して、prod namespace を作成します。

    $ oc create namespace prod
  3. 次のコマンドを実行して、prod 名前空間にラベルを付けます。

    $ oc label namespace/prod purpose=production
  4. 次のコマンドを実行して、dev 名前空間を作成します。

    $ oc create namespace dev
  5. 次のコマンドを実行して、dev 名前空間にラベルを付けます。

    $ oc label namespace/dev purpose=testing
  6. 次のコマンドを実行して、alpine イメージを dev 名前空間にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=dev --rm -i -t --image=alpine -- sh
  7. シェルで次のコマンドを実行し、ブロックされた要求の理由を確認します。たとえば、期待される出力は wget: download timed out です

    # wget -qO- --timeout=2 http://web.default
  8. 次のコマンドを実行して、alpine イメージを prod namespace にデプロイし、シェルを開始します。

    $ oc run test-$RANDOM --namespace=prod --rm -i -t --image=alpine -- sh
  9. シェルで次のコマンドを実行し、リクエストが許可されていることを確認します。

    # wget -qO- --timeout=2 http://web.default
    <!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>

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

OpenShift Container Platform で Pod を特定のネットワーク設定から切り離すには、Pod をセカンダリーネットワークから削除します。セカンダリーネットワークへの接続を解除するには、Pod を削除してください。

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

OpenShift Container Platform で Pod を特定のネットワーク設定から切り離すには、Pod をセカンダリーネットワークから削除します。セカンダリーネットワークへの接続を解除するには、oc delete pod コマンドを使用して Pod を削除します。

前提条件

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

手順

  • 以下のコマンドを入力して Pod を削除します。

    $ oc delete pod <name> -n <namespace>

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

    <name>
    Pod の名前を指定します。
    <namespace>
    Pod が含まれる namespace を指定します。

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

OpenShift Container Platform でセカンダリーネットワークのネットワーク設定を更新したり、ネットワークパラメーターを変更したりするには、既存のセカンダリーネットワークの設定を変更できます。変更を適用するには、NetworkAttachmentDefinition カスタムリソースを編集してください。

4.6.1. NetworkAttachmentDefinition カスタムリソースの変更

OpenShift Container Platform のセカンダリーネットワークのネットワーク設定を更新したり、ネットワークパラメーターを変更したりするには、NetworkAttachmentDefinition カスタムリソースを変更します。変更を適用するには、Cluster Network OperatorCR を編集してください。

前提条件

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

手順

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

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

    $ oc get network-attachment-definitions <network_name> -o yaml

    たとえば、以下のコンソールの出力は 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"]}} }

NetworkAttachmentDefinition (NAD) で OVN-Kubernetes の localnet トポロジーを使用すると、物理ネットワークの特定の VLAN ID を Pod のセカンダリーインターフェイスにマッピングできます。

OpenShift Container Platform のクラスターワークロードに複数の VLAN を提供するには、NetworkAttachmentDefinition カスタムリソース (CR) に追加の VLAN を定義します。トランクポートを設定することで、物理ネットワークが仮想インフラストラクチャーと正しく接続され、信頼性の高いトラフィック管理が可能になります。

手順書中の例では、以下の設定を示しています。

  • 物理スイッチポートは、VLAN トランキングを使用して OpenShift Container Platform ノードに接続されます。トランクは、NAD で定義した VLAN のタグ付きトラフィックを伝送します。
  • br-ex は、 仮想ワークロードと物理ワークロードを接続する OVS ブリッジとして機能します。
  • ローカルネット トポロジーを使用することで、特定の VLAN タグを持つ複数の NAD が作成されます。この設定では、トラフィック分離のための特定の VLAN ID を定義します。
  • ネットワーク接続性を向上させる目的で、Pod または仮想マシン (VM) が NAD CR に接続されます。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つユーザーとしてログインしている。
  • NMState Operator をインストールしました。
  • クラスターのインストール時に、br-ex ブリッジインターフェイスを設定しました。

手順

  1. 各 VLAN ごとに NetworkAttachmentDefinition CR を作成します (例: nad-cvlan100.yaml)。OVN-Kubernetes は、NAD ファイルを使用して、Pod または仮想マシンのイーサネットフレームにタグを付けたり、タグを解除したりします。

    設定例

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: vlan-100
      namespace: default
    spec:
      config: |-
        {
          "cniVersion": "0.4.0",
          "name": "localnet-vlan-100",
          "type": "ovn-k8s-cni-overlay",
          "physicalNetworkName": "physnet",
          "topology": "localnet",
          "vlanID": 100,
          "mtu": 1500,
          "netAttachDefName": "default/vlan-100"
        }
    # ...

  2. Pod または仮想マシンを VLAN に接続するには、Pod または仮想マシンの設定で NAD を参照します。

    Pod 設定の例

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        k8s.v1.cni.cncf.io/networks: vlan-100
    # ...

    仮想マシン設定の例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
        template:
            spec:
            networks:
            - multus:
                networkName: vlan-100
                name: secondary-vlan
    # ...

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

Pod がセカンダリーネットワークに接続できるように、セカンダリーネットワークの IP アドレス割り当てを設定できます。

4.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 サーバーはクラスターの外部にあり、そのサーバーがお客様の既存のネットワークインフラストラクチャーに含まれる必要があります。
  • DHCP サーバーが、ノードに IP アドレスを提供するように適切に設定されている。

環境内で DHCP サーバーが利用できない場合は、Whereabouts IPAM CNI プラグインの使用を検討してください。Whereabouts CNI は、外部 DHCP サーバーを必要とせずに同様の IP アドレス管理機能を提供します。

注記

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

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

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

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

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

type

string

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

addresses

array

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

routes

array

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

dns

array

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

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

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

address

string

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

gateway

string

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

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

dst

string

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

gw

string

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

Expand
表4.6 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"
        }
      ]
  }
}

4.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"
        }
      }
  # ...

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

type
クラスターの動的 IP アドレスの割り当てを指定します。
4.7.1.3. Whereabouts を使用した動的 IP アドレス割り当ての設定

Whereabouts CNI プラグインは、DHCP サーバーを使用せずに、セカンダリーネットワークに IP アドレスを動的に割り当てる場合に役立ちます。

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

4.7.1.3.1. 動的 IP アドレス設定パラメーター

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

Expand
表4.7 ipam の whereabouts 設定パラメーター
フィールド説明

type

string

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

range

string

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

exclude

array

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

network_name

string

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

4.7.1.3.2. IP アドレス範囲を除外する Whereabouts による動的 IP アドレス割り当て設定

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

特定の IP アドレス範囲を除外する Whereabouts 動的 IP アドレス割り当て

{
  "ipam": {
    "type": "whereabouts",
    "range": "192.0.2.192/27",
    "exclude": [
       "192.0.2.192/30",
       "192.0.2.196/32"
    ]
  }
}

4.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",
  }
}

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

network_name
オプションのパラメーター。設定されている場合、NetworkAttachmentDefinition 2network_name と一致する必要があります。

NetworkAttachmentDefinition 2

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

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

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

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

注記

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

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

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

手順

  1. 次のコマンドを実行して、Network.operator.openshift.io CR を編集します。

    $ oc edit network.operator.openshift.io cluster
  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
    # ...
  3. ファイルを保存し、テキストエディターを編集します。
  4. 次のコマンドを実行して、whereabouts-reconciler デーモンセットが正常にデプロイされたことを確認します。

    $ oc get all -n openshift-multus | grep whereabouts-reconciler
    pod/whereabouts-reconciler-jnp6g 1/1 Running 0 6s
    pod/whereabouts-reconciler-k76gg 1/1 Running 0 6s
    daemonset.apps/whereabouts-reconciler 6 6 6 6 6 kubernetes.io/os=linux 6s
4.7.1.5. Whereabouts IP リコンサイラーのスケジュールの設定

Whereabouts IPAM CNI プラグインは、IP アドレスリコンサイラーを毎日実行します。このプロセスは、完了せずに残っている IP アドレス割り当てをクリーンアップします。このような割り当てが残ると、IP アドレスが枯渇し、新しい Pod への 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 * * * *"

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

    注記

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

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

    $ oc get all -n openshift-multus | grep whereabouts-reconciler
    pod/whereabouts-reconciler-2p7hw                   1/1     Running   0             4m14s
    pod/whereabouts-reconciler-76jk7                   1/1     Running   0             4m14s
    daemonset.apps/whereabouts-reconciler          6         6         6       6            6           kubernetes.io/os=linux   4m16s
  3. 次のコマンドを実行して、設定した間隔で whereabouts-reconciler Pod が IP リコンサイラーを実行していることを確認します。

    $ oc -n openshift-multus logs whereabouts-reconciler-2p7hw
    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
4.7.1.6. Whereabouts IPAM CNI プラグインの Fast IPAM 設定

Wherabouts は、クラスター全体のレベルで IP アドレスを割り当てる IP アドレス管理 (IPAM) Container Network Interface (CNI) プラグインです。Whereabouts には Dynamic Host Configuration Protocol (DHCP) サーバーは必要ありません。

以下は、一般的な Wherabouts ワークフローを説明しています。

  1. Whereabouts は、192.168.2.0/24 などの Classless Inter-Domain Routing (CIDR) 表記のアドレス範囲を取得し、その範囲内で 192.168.2.1 から 192.168.2.254 などの IP アドレスを割り当てます。
  2. Whereabouts は、CIDR 範囲内の最小値のアドレスである IP アドレスを Pod に割り当て、その Pod の有効期間中、データストア内の IP アドレスを追跡します。
  3. Pod が削除されると、Whereabouts がアドレスを Pod から解放するため、アドレスは割り当て可能になります。

Whereabouts のパフォーマンスを向上させるには、特にクラスター内のノードが大量の Pod を実行している場合は、Fast IPAM 機能を有効化します。

重要

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

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

Fast IPAM 機能は、Whereabouts Controller によって管理される nodeslicepools を使用して、ノードの IP 割り当てを最適化します。

前提条件

  • Cluster Network Operator (CNO) が Whereabouts Controller をデプロイできるように、whereabouts-shim 設定を Network.operator.openshift.io カスタムリソース (CR) に追加している。「Whereabouts リコンサイラーデーモンセットの作成」を参照してください。
  • Fast IPAM 機能が動作するように、NetworkAttachmentDefinition (NAD) と Pod が同じ openshift-multus namesapace に存在することを確認した。

手順

  1. 次のコマンドを入力して、Whereabouts Controller が実行されていることを確認します。

    $ oc get pods -n openshift-multus | grep whereabouts-controller
    whereabouts-controller-5cbfd6c475-fr7d7        1/1     Running            0               22s
    ...
    重要

    Whereabouts Controller が実行されていない場合、Fast IPAM は機能しません。

  2. クラスター用の NAD ファイルを作成し、次の設定例に示すように、Fast IPAM の詳細をファイルに追加します。

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: wb-ipam
      namespace: openshift-multus
    spec:
      config: '{
    	"cniVersion": "0.3.0",
    	"name": "wb-ipam-cni-name",
    	"type": "bridge",
    	"bridge": "cni0",
    	"ipam": {
      	"type": "whereabouts",
      	"range": "10.5.0.0/20",
      	"node_slice_size": "/24"
        }
      }'
    # ...

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

    namespace
    CNO が NAD をデプロイする namespace。
    name
    Whereabouts IPAM CNI プラグインの名前。
    type
    IPAM CNI プラグインのタイプ (whereabouts など)。
    range
    Whereabouts IPAM CNI プラグインが Pod に IP アドレスを割り当てるために使用する IP プールの IP アドレス範囲。
    node_slice_size
    各ノードで使用できる IP アドレスのスライスサイズを設定します。
  3. Whereabouts IPAM CNI プラグインのアノテーションの詳細を Pod の YAML ファイルに追加します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: samplepod
      annotations:
      k8s.v1.cni.cncf.io/networks: openshift-multus/wb-ipam
    spec:
      containers:
      - name: samplecontainer
      command: ["/bin/bash", "-c", "trap : TERM INT; sleep infinity & wait"]
      image: registry.redhat.io/ubi9/ubi-minimal
    # ...

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

    name
    Pod の名前。
    k8s.v1.cni.cncf.io/networks
    openshift-multus namespace に存在する Whereabouts IPAM CNI プラグイン名を参照するアノテーションの詳細。
    - name
    Pod のコンテナーの名前。
    command
    コンテナーのエントリーポイントを定義し、Whereabouts IPAM CNI プラグインでコンテナーの動作を制御します。
  4. クラスター内で実行されているノード上に存在する Pod に NAD ファイル設定を適用します。

    $ oc create -f <NAD_file_name>.yaml

検証

  1. 次のコマンドを入力して、Pod の IP アドレスの詳細を表示します。

    $ oc describe pod <pod_name>
    ...
    k8s.v1.cni.cncf.io/network-status:
      [{
          "name": "ovn-kubernetes",
          "interface": "eth0",
          "ips": [
              "10.128.3.174"
          ],
          "mac": "0a:58:0a:80:03:ae",
          "default": true,
          "dns": {}
      },{
          "name": "openshift-multus/wb-ipam",
          "interface": "net1",
          "ips": [
              "10.5.0.1"
          ],
          "mac": "1a:04:6f:a4:15:3c",
          "dns": {}
      }]
    k8s.v1.cni.cncf.io/networks: openshift-multus/wb-ipam
    ...
  2. 次のコマンドを入力して、Pod にアクセスし、そのインターフェイスを確認します。

    $ oc exec <pod_name> -- ip a
    ...
    3: net1@if439: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 1a:04:6f:a4:15:3c brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.5.0.1/20 brd 10.5.15.255 scope global net1
           valid_lft forever preferred_lft forever
        inet6 fe80::1804:6fff:fea4:153c/64 scope link
           valid_lft forever preferred_lft forever
    ...

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

    inet: Pod は想定どおり、net1 インターフェイス上の 10.5.0.1 IP アドレスに接続されています。

  3. 次のコマンドを入力して、openshift-multus namespace にノードセレクタープールが存在することを確認します。予想される出力には、nodeslicepool などのノードセレクタープールの名前と、32m などの作成時間 (分) が表示されます。

    $ oc get nodeslicepool -n openshift-multus

    出力例

    NAME               AGE
    wb-ipam-cni-name   32m

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

Pod が IPv4 アドレスと IPv6 アドレスの両方で通信できるように、セカンダリーネットワークにデュアルスタック 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"}
                  ]
           }
          }
  3. セカンダリーネットワークを Pod にアタッチします。詳細は、「セカンダリーネットワークへの Pod の追加」を参照してください。

検証

  • 次のコマンドを入力して、Pod のネットワーク namespace 内のネットワークインターフェイスに、すべての IP アドレスが割り当てられていることを確認します。

    $ oc exec -it <pod_name> -- ip a

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

    <podname>
    Pod の名前。

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

master インターフェイスに基づいて、MAC-VLAN、IP-VLAN、および VLAN サブインターフェイスを作成および管理できます。

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

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

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

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

SR-IOV VF に基づいて複数の VLAN を作成できます。この設定では、SR-IOV ネットワークを作成してから、VLAN インターフェイスのネットワークアタッチメントを定義します。

次の図は、SR-IOV VF 上に複数の VLAN を作成するためのセットアッププロセスを示しています。

VLAN の作成

前提条件

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

手順

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

    $ oc new-project test-namespace
  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"
         deviceID: "101b"
         rootDevices: ["00:05.0"]
       numVfs: 10
       priority: 99
       resourceName: sriovnic
       nodeSelector:
          feature.node.kubernetes.io/network-sriov.capable: "true"

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

      vendor
      SR-IOV ネットワークデバイスのベンダーの 16 進数コード。値 15b3 は Mellanox NIC に関連付けられています。
      deviceID

      SR-IOV ネットワークデバイスのデバイスの 16 進数コード。

      注記

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

    2. 次のコマンドを実行して、YAML 設定を適用します。

      $ oc apply -f sriov-node-network-policy.yaml
      注記

      ノードの再起動操作のため、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"
    2. 以下のコマンドを実行して YAML を適用します。

      $ oc apply -f sriov-network-attachment.yaml
  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",
                "mtu": 1500,
                "vlanId": 100,
                "linkInContainer": true,
                "ipam": {"type": "whereabouts", "ipRanges": [{"range": "1.1.1.0/24"}]}
              }
            ]
          }

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

      master
      VLAN 設定では master 名を指定する必要があります。この名前は Pod のネットワークアノテーション内で指定できます。
      linkInContainer
      linkInContainer パラメーターを指定する必要があります。
    2. 以下のコマンドを実行して、YAML ファイルを適用します。

      $ oc apply -f vlan100-additional-network-configuration.yaml
  5. 先ほど指定したネットワークを使用して Pod 定義を作成します。

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

      注記

      このマニフェストの例には次のリソースが含まれています。

      • セキュリティーラベルのある 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"
            },
            {
              "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"

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

      interface
      VLAN インターフェイスの master インターフェイスとして使用される名前。
    2. 以下のコマンドを実行して、YAML ファイルを適用します。

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

    $ oc describe pods nginx-pod -n test-namespace
    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

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

前提条件

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

手順

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

    $ oc new-project test-namespace
  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"}]
        }
      }'
  3. 次のコマンドを実行して、NetworkAttachmentDefinition CRD を OpenShift Container Platform クラスターに適用します。

    $ oc apply -f bridge-nad.yaml
  4. 次のコマンドを入力して、NetworkAttachmentDefinition CRD が正常に作成されたことを確認します。予想される出力には、NAD CRD の名前と作成後の経過時間 (分) が表示されます。

    $ oc get network-attachment-definitions
  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",
        "mode": "l3",
        "linkInContainer": true,
        "ipam": {"type": "whereabouts", "ipRanges": [{"range": "10.0.0.0/24"}]}
      }'

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

    master
    ネットワークアタッチメントに関連付けるイーサネットインターフェイスを指定します。このイーサネットインターフェイスは、後で Pod のネットワークアノテーション内で設定されます。
    linkInContainer
    master インターフェイスがコンテナーネットワークの namespace に存在することを指定します。
  6. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f ipvlan-additional-network-configuration.yaml
  7. 次のコマンドを実行して、NetworkAttachmentDefinition CRD が正常に作成されたことを確認します。予想される出力には、NAD CRD の名前と作成後の経過時間 (分) が表示されます。

    $ oc get network-attachment-definitions
  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]

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

    k8s.v1.cni.cncf.io/networks,interface
    IPVLAN インターフェイスの master として使用する名前を指定します。
  9. 以下のコマンドを実行して、YAML ファイルを適用します。

    $ oc apply -f pod-a.yaml

検証

  1. 以下のコマンドを使用して、Pod が実行されていることを確認します。

    $ oc get pod -n test-namespace
    NAME    READY   STATUS    RESTARTS   AGE
    pod-a   1/1     Running   0          2m36s
  2. 次のコマンドを実行して、test-namespace 内の pod-a リソースに関するネットワークインターフェイス情報を表示します。

    $ oc exec -n test-namespace pod-a -- ip a
    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

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

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

OpenShift Container Platform で未使用のネットワーク設定をクリーンアップしたり、ネットワークリソースを解放したりするには、追加のネットワークアタッチメントを削除できます。セカンダリーネットワークをクラスターから削除するには、NetworkAttachmentDefinition カスタムリソースを削除してください。

4.9.1. セカンダリー NetworkAttachmentDefinition カスタムリソースの削除

OpenShift Container Platform で未使用のネットワーク設定をクリーンアップしたり、ネットワークリソースを解放したりするには、セカンダリー NetworkAttachmentDefinition CR を削除できます。Cluster Network OperatorCR を編集し、NetworkAttachmentDefinition CR を削除して、セカンダリーネットワークをクラスターから削除します。

セカンダリーネットワークがクラスターから削除されても、それが接続されている Pod からは削除されません。

前提条件

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

手順

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

    $ oc edit networks.operator.openshift.io cluster
  2. 削除したいセカンダリーネットワークの additionalNetworks コレクションから CNO が作成した設定を削除することにより、カスタムリソース (CR) を変更します。

    apiVersion: operator.openshift.io/v1
    kind: Network
    metadata:
      name: cluster
    spec:
      additionalNetworks: []

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

    仕様.追加ネットワーク
    additionalNetworks コレクションから削除するセカンダリーネットワークアタッチメントの定義を指定します。additionalNetworks コレクションのセカンダリーネットワークアタッチメントのみの設定マッピングを削除する場合、空のコレクションを指定する必要があります。
  3. 以下のコマンドを入力して、クラスターのネットワークから NetworkAttachmentDefinition CR を削除します。

    $ oc delete net-attach-def <name_of_network_attachment_definition>

    <name_of_network_attachment_definition> を 削除したい NetworkAttachmentDefinition CR の名前に置き換えてください。

  4. 変更を保存し、テキストエディターを終了して、変更をコミットします。
  5. オプション: 次のコマンドを実行して、セカンダリーネットワーク CR が削除されたことを確認します。

    $ oc get network-attachment-definition --all-namespaces

4.10. CNI プラグインチェーンによる高度なユースケース向けマルチネットワーク機能の実現

Container Network Interface (CNI) プラグインのチェーン接続を使用することで、Pod の高度なマルチネットワーク利用を実現できます。

4.10.1. CNI チェーンについて

CNI プラグインのチェーン接続により、Pod は複数のネットワークインターフェイスを使用できるようになります。これにより、トラフィックの分離や、きめ細かなトラフィックポリシーによる優先順位付けルーティングといった高度な設定が可能になります。

CNI プラグインの連鎖接続を利用することで、さまざまな種類のトラフィックを分離し、パフォーマンス、セキュリティー、コンプライアンスの要件を満たすことができ、ネットワーク設計とトラフィック管理における柔軟性が向上します。

これが役立つ可能性のあるシナリオには、以下のようなものがあります。

  • マルチネットワークトポロジー: 必要に応じて、Pod を複数のネットワークに接続し、それぞれに独自のトラフィックポリシーを設定できます。
  • トラフィック分離: 管理、ストレージ、アプリケーションのトラフィック用に個別のネットワークを提供することで、それぞれに適切なセキュリティーおよび QoS 設定が確保されるようにします。
  • カスタムルーティングルール: 特定のトラフィック (たとえば SIP トラフィック) が常に指定されたネットワークインターフェイスを使用し、その他のトラフィックはデフォルトのネットワークに従うようにします。
  • ネットワークパフォーマンスの向上: 特定のトラフィックタイプを優先したり、専用のネットワークインターフェイス経由でトラフィックをルーティングすることで、輻輳を管理したりできます。

4.10.2. route- オーバーライド CNI プラグインを使用したプラグインチェーンの設定

プラグインチェーンを使用すると、複数の CNI プラグインを同じネットワークインターフェイスに順次適用するように設定できます。チェーン内の各プラグインは、順番にインターフェイスを処理します。

プラグイン 配列を使用して NetworkAttachmentDefinition (NAD) を定義すると、最初のプラグインがインターフェイスを作成し、2 番目のプラグインがそのルーティング設定を変更できます。

ルートオーバーライド CNI プラグインは、一般的に、最初のプラグインによって作成されたインターフェイスのルーティング設定を変更するための、チェーン内の 2 番目のプラグインとして使用されます。以下の操作をサポートします。

  • addroutes: 特定の宛先ネットワークへのトラフィックをインターフェイス経由でルーティングするための静的ルートを追加します。
  • delroutes: インターフェイスから特定のルートを削除します。
  • flushroutes: インターフェイスからすべてのルートを削除します。
  • flushgateway: インターフェイスからデフォルトゲートウェイのルートを削除します。

次の例では、カスタムルーティングを設定した別々の VLAN 上にそれぞれ 2 つの追加ネットワークインターフェイスを持つ Pod を設定することで、プラグインチェーン接続の方法を示します。

  • eth1 は192.168.100.0/24 ネットワーク (VLAN 100) 上にあり、10.0.0.0/8 の トラフィックをこのインターフェイス経由でルーティングする静的ルートが設定されています。
  • eth2 は192.168.200.0/24 ネットワーク (VLAN 200) 上にあり、172.16.0.0/12 のトラフィックをこのインターフェイス経由でルーティングする静的ルートが設定されています。

各インターフェイスは、2 つのプラグインのチェーンを使用します。1 つは、VLAN 上にインターフェイスを作成するための macvlan プラグイン、もう 1 つは、特定のトラフィックをそのインターフェイスにルーティングするための静的ルートを追加する route- オーバーライドプラグ インです。

前提条件

  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限を持つアカウントがある。

手順

  1. 以下のコマンドを実行して、サンプル用の名前空間を作成します。

    $ oc create namespace chain-example
  2. 連鎖プラグイン設定を使用して、最初のネットワークアタッチメント定義 (NAD) を作成します。

    1. management.yaml などの YAML ファイルを作成し、VLAN 100 上に新しいインターフェイス eth1 を以下の設定で設定する NAD を定義します。

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        name: management-net
        namespace: chain-example
      spec:
        config: '{
          "cniVersion": "1.0.0",
          "name": "management-net",
          "plugins": [
            {
              "type": "macvlan",
              "master": "br-ex",
              "vlan": 100,
              "mode": "bridge",
              "ipam": {
                "type": "static",
                "addresses": [
                  {
                    "address": "192.168.100.10/24",
                    "gateway": "192.168.100.1"
                  }
                ]
              }
            },
            {
              "type": "route-override",
              "addroutes": [
                {
                  "dst": "10.0.0.0/8",
                  "gw": "192.168.100.1"
                }
              ]
            }
          ]
        }'
  3. 以下のコマンドを実行して NAD を作成します。

    $ oc apply -f management.yaml
  4. 連結プラグイン設定を使用して、2 つ目の NAD を作成します。

    1. sip.yaml などの YAML ファイルを作成し、VLAN 200 上に eth2 という新しいインターフェイスを以下の設定で設定する NAD を定義します。

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        name: sip-net
        namespace: chain-example
      spec:
        config: '{
          "cniVersion": "1.0.0",
          "name": "sip-net",
          "plugins": [
            {
              "type": "macvlan",
              "master": "br-ex",
              "vlan": 200,
              "mode": "bridge",
              "ipam": {
                "type": "static",
                "addresses": [
                  {
                    "address": "192.168.200.10/24",
                    "gateway": "192.168.200.1"
                  }
                ]
              }
            },
            {
              "type": "route-override",
              "addroutes": [
                {
                  "dst": "172.16.0.0/12",
                  "gw": "192.168.200.1"
                }
              ]
            }
          ]
        }'
  5. 以下のコマンドを実行して NAD を作成します。

    $ oc apply -f sip.yaml
  6. pod.yaml などの Pod 定義ファイルを作成し、以下の設定を行うことで、NetworkAttachmentDefinition リソースを Pod にアタッチします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: chain-test-pod
      namespace: chain-example
      labels:
        app: chain-test
      annotations:
        k8s.v1.cni.cncf.io/networks: '[
          { "name": "management-net", "interface": "eth1" },
          { "name": "sip-net", "interface": "eth2" }
        ]'
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
      - name: test-container
        image: registry.access.redhat.com/ubi9/ubi:latest
        command: ["sleep", "infinity"]
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
  7. 以下のコマンドを実行して Pod を作成します。

    $ oc apply -f pod.yaml
  8. 以下のコマンドを使用して、Pod が実行されていることを確認してください。

    $ oc wait --for=condition=Ready pod/chain-test-pod -n chain-example --timeout=120s

    出力例:

    pod/chain-test-pod condition met

検証

  1. 以下のコマンドを実行して、Pod 内のすべてのネットワークインターフェイスとそれらに割り当てられている IP アドレスをリスト表示します。これは、プラグインチェーンによって設定された追加のインターフェイスが Pod に存在することを検証します。

    $ oc exec chain-test-pod -n chain-example -- ip a

    出力例:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
    2: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8901 qdisc noqueue state UP
        link/ether 0a:58:0a:83:02:19 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 10.131.2.25/23 brd 10.131.3.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::858:aff:fe83:219/64 scope link
           valid_lft forever preferred_lft forever
    3: eth1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP qlen 1000
        link/ether aa:25:73:ff:a7:00 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 192.168.100.10/24 brd 192.168.100.255 scope global eth1
           valid_lft forever preferred_lft forever
        inet6 fe80::a825:73ff:feff:a700/64 scope link
           valid_lft forever preferred_lft forever
    4: eth2@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP qlen 1000
        link/ether aa:a4:6c:4e:e8:97 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 192.168.200.10/24 brd 192.168.200.255 scope global eth2
           valid_lft forever preferred_lft forever
        inet6 fe80::a8a4:6cff:fe4e:e897/64 scope link
           valid_lft forever preferred_lft forever

    この出力は、Pod に 3 つのネットワークインターフェイスがあることを示しています。

    • eth0: クラスターネットワークに接続されているデフォルトのインターフェイス。
    • eth1:管理ネットワーク からの最初の追加インターフェイスで、IP アドレスは 192.168.100.10 です。
    • eth2: sip-net からの 2 番目の追加インターフェイス、IP アドレスは 192.168.200.10 です。
  2. ルートオーバーライド プラグインが期待どおりの静的ルートを追加したことを確認するには、次のコマンドを実行します。

    $ oc exec chain-test-pod -n chain-example -- ip route

    出力例:

    default via 10.132.0.1 dev eth0
    10.0.0.0/8 via 192.168.100.1 dev eth1
    10.132.0.0/23 dev eth0 proto kernel scope link src 10.132.1.97
    10.132.0.0/14 via 10.132.0.1 dev eth0
    100.64.0.0/16 via 10.132.0.1 dev eth0
    169.254.0.5 via 10.132.0.1 dev eth0
    172.16.0.0/12 via 192.168.200.1 dev eth2
    172.30.0.0/16 via 10.132.0.1 dev eth0
    192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.10
    192.168.200.0/24 dev eth2 proto kernel scope link src 192.168.200.10

    この出力は、各チェーンの route- オーバーライド プラグインが期待どおりの静的ルートを追加したことを示しています。

    • 10.0.0.0/8 経由 192.168.100.1 dev eth1 の場合、10.0.0.0/8 宛てのトラフィックは、管理ネットワーク ゲートウェイを経由して eth1 にルーティングされます。このルートは 、管理ネットワーク チェーン内の ルートオーバーライド プラグインによって追加されました。
    • 172.16.0.0/12 経由 192.168.200.1 dev eth2 の場合、172.16.0.0/ 12 宛てのトラフィックは、sip-net ゲートウェイを介して eth2 を経由してルーティングされます。このルートは、sip-net チェーン内の route- オーバーライド プラグインによって追加されました。
    • 接続されたサブネットルート (192.168.100.0/24192.168.200.0/24) は macvlan プラグインによって作成され、デフォルトルートはクラスターネットワークインターフェイスである eth0 を使用します。

第5章 Virtual Routing and Forwarding

5.1. Virtual Routing and Forwarding について

仮想ルーティングおよび転送 (VRF) を使用することで、マルチテナント機能を提供できます。たとえば、各テナントが独自のルーティングテーブルを持ち、異なるデフォルトゲートウェイを必要とする場合などです。

VRF は、クラウドネイティブネットワーク機能 (CNF) に必要な権限の数を削減し、セカンダリーネットワークのネットワークトポロジーの可視性を向上させます。VRF デバイスと IP アドレスルールを組み合わせることで、仮想ルーティングおよび転送ドメインを作成する機能を実現できます。

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

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

Container Network Interface (CNI) 仮想ルーティングおよび転送 (VRF) プラグインを使用すると、同じ IP アドレスを使用して、ネットワーク機能を異なるお客様のインフラストラクチャーに接続できます。CNI VRF プラグインを使用することで、異なるお客様を分離することができます。

電気通信のユースケースでは、各 CNF は、同じアドレス空間を共有する多数の異なるネットワークに接続される可能性がある。これらのセカンダリーネットワークは、クラスターのメインネットワーク CIDR と競合する可能性があります。

CNI VRF プラグインを使用すると、IP アドレスは OpenShift Container Platform の IP アドレス空間と重複します。CNI VRF プラグインは、CNF に必要な権限の数を削減し、セカンダリーネットワークのネットワークトポロジーの可視性を向上させます。

第6章 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 インターフェイスに直接バインドします。

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

Cluster Network Operator (CNO) は、セカンダリーネットワークの定義を管理します。クラスタースコープの Network カスタムリソース (CR) でセカンダリーネットワークを指定すると、CNO によって NetworkAttachmentDefinition CR が自動的に作成されます。

注記

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

前提条件

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

手順

  1. 追加のネットワークアタッチメント用の Network CR を作成し、セカンダリーネットワークの rawCNIConfig 設定を挿入します。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": [
            {
              "type": "macvlan",
              "master": "eth1",
              "ipam": {
                  "type": "static",
                  "addresses": [
                  {
                      "address": "191.168.1.23/24"
                  }
                  ]
              }
            },
            {
              "type": "vrf",
              "vrfname": "vrf-1",
              "table": 1001
            }]
          }'

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

    plugins
    リストを指定する必要があります。リストの最初の項目は、VRF ネットワークのベースとなるセカンダリーネットワークである必要があります。リストの 2 番目の項目は VRF プラグインの設定です。
    type
    このパラメーターは vrf に設定する必要があります。
    vrfname
    インターフェイスが割り当てられる VRF の名前。Pod 内に VRF が存在しない場合は、CNI によって VRF が作成されます。
    table

    オプションのパラメーター。ルーティングテーブルの ID を指定します。デフォルトで、tableid パラメーターが使用されます。テーブル ID を指定しない場合は、CNI によって空きルーティングテーブル ID が VRF に割り当てられます。

    注記

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

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

    $ oc create -f additional-network-attachment.yaml
  3. 以下のコマンドを実行して、CNO が NetworkAttachmentDefinition CR を作成していることを確認します。<namespace> を、ネットワークアタッチメントの設定時に指定した namespace (例: additional-network-1) に置き換えます。予想される出力には、NAD CR の名前と作成後の経過時間 (分) が表示されます。

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

    CNO が CR を作成するまでに時間がかかる場合があります。

検証

  1. Pod を作成し、VRF プラグイン設定を含むセカンダリーネットワークにその Pod を割り当てます。

    1. 次の pod-additional-net.yaml ファイルに示すように、Pod リソースを定義する 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

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

      name
      VRF プラグイン設定を含むセカンダリーネットワークの名前を指定します。
    2. 次のコマンドを実行して、Pod リソースを作成します。予想される出力には、Pod リソースの名前と作成期間 (分) が表示されます。

      $ oc create -f pod-additional-net.yaml
  2. Pod ネットワークアタッチメントが VRF セカンダリーネットワークに接続されていることを確認します。Pod とのリモートセッションを開始し、次のコマンドを実行します。予想される出力には、VRF インターフェイスの名前とルーティングテーブル内の一意の ID が表示されます。

    $ ip vrf show
  3. 次のコマンドを入力して、VRF インターフェイスがセカンダリーインターフェイスのコントローラーであることを確認します。

    $ ip link
    5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP mode
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

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

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

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

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

Legal Notice

Theme

© 2026 Red Hat
トップに戻る