ネットワーク機能仮想化環境のデプロイ


Red Hat OpenStack Services on OpenShift 18.0

Red Hat OpenStack Services on OpenShift におけるネットワーク機能仮想化 (NFV) の計画、インストール、および設定

OpenStack Documentation Team

概要

Red Hat OpenStack Services on OpenShift のネットワーク機能仮想化インフラストラクチャー (NFVi) 用の Single Root I/O Virtualization (SR-IOV) と Open vSwitch Data Plane Development Kit (OVS-DPDK) を計画、インストール、および設定します。

Red Hat ドキュメントへのフィードバック (英語のみ)

Red Hat ドキュメントに対するご意見をお聞かせください。ドキュメントの改善点があればお知らせください。

問題の作成 フォームを使用して、Red Hat OpenStack Services on OpenShift (RHOSO) または Red Hat OpenStack Platform (RHOSP) の以前のリリースのドキュメントに関するフィードバックを提供します。RHOSO または RHOSP ドキュメントの問題を作成すると、その問題は RHOSO Jira プロジェクトに記録され、フィードバックの進行状況を追跡できるようになります。

問題の作成 フォームを完了するには、Jira にログインしていることを確認してください。Red Hat Jira アカウントをお持ちでない場合は、https://issues.redhat.com でアカウントを作成できます。

  1. 次のリンクをクリックして、問題の作成 ページを開きます (問題の作成)。
  2. Summary フィールドと Description フィールドに入力します。Description フィールドに、ドキュメントの URL、章またはセクション番号、および問題の詳しい説明を入力します。フォーム内の他のフィールドは変更しないでください。
  3. Create をクリックします。

第1章 Red Hat ネットワーク機能仮想化 (NFV) の理解

ネットワーク機能仮想化 (NFV) は、通信事業者 (CSP) が従来のプロプライエタリーハードウェアの範囲を超えて効率性と俊敏性を高め、運用コストを削減するのに役立つソフトウェアベースのソリューションです。

Red Hat OpenStack Services on OpenShift (RHOSO) 環境で NFV を使用すると、スイッチ、ルーター、ストレージなどのハードウェアデバイス上で実行されるネットワーク機能 (VNF) を標準の仮想化テクノロジーを使用して仮想化する仮想化インフラストラクチャーを実現して、IT とネットワークを融合することができます。

1.1. NFV の利点

Red Hat OpenStack Services on OpenShift (RHOSO) 環境にネットワーク機能仮想化 (NFV) を実装する主な利点は次のとおりです。

  • 需要の変化に対応するために、新しいネットワークサービスの迅速なデプロイと拡張を可能にして、市場投入までの時間を短縮します。
  • サービスの開発者は、実稼動環境で使用する場合と同じプラットフォームを使用して、リソースやプロトタイプを自己管理できるので、イノベーションがサポートされます。
  • セキュリティーやパフォーマンスを犠牲にせず、週/日単位ではなく、時間/分単位で顧客のニーズに対応します。
  • カスタマイズされた高額な設備ではなく、商用オフザシェルフ (COTS) のハードウェアを使用するため、資本支出が削減されます。
  • 運用の合理化と自動化で日常のタスクを最適化することにより、運用コストを削減し、従業員の生産性を向上させます。

1.2. NFV デプロイメントでサポートされる構成

Red Hat は、Data Plane Development Kit (DPDK) と Single Root I/O Virtualization (SR-IOV) を使用して、Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワーク機能仮想化 (NFV) をサポートします。

その他の構成には、次のものがあります。

  • Open vSwitch (OVS) と LACP の組み合わせ
  • ハイパーコンバージドインフラストラクチャー (HCI)

1.3. NFV データプレーンの接続性

ネットワーク機能仮想化 (NFV) を導入し、従来のデバイスを VNF として実装するネットワークベンダーが増えています。これらのネットワークベンダーの大半が仮想マシンに着目していますが、選択した設計に合わせたコンテナーベースのアプローチに注目しているベンダーもあります。Red Hat OpenStack Services on OpenShift (RHOSO) 環境は、主に次の 2 つの理由から、機能豊富で柔軟性に優れています。

  • アプリケーションの即応性: ネットワークベンダーは現在、デバイスを VNF に変換している段階にあります。VNF 市場では、VNF ごとに成熟度レベルは異なっており、即応性に関する共通の障害として、API での RESTful インターフェイスの有効化、データモデルのステートレスへの進化、自動化管理オペレーションの提供などが挙げられます。OpenStack は、すべてに共通のプラットフォームを提供する必要があります。
  • 幅広いユースケース: NFV には、異なるユースケースに対応する多様なアプリケーションが含まれます。たとえば、Virtual Customer Premise Equipment (vCPE) は、ルーティング、ファイアウォール、仮想プライベートネットワーク (VPN)、ネットワークアドレス変換 (NAT) など多くのネットワーク機能を顧客のサイトで提供することを目的としています。Virtual Evolved Packet Core (vEPC) は、Long-Term Evolution (LTE) ネットワークのコアコンポーネントにコスト効果の高いプラットフォームを提供するクラウドアーキテクチャーで、ゲートウェイやモバイルエンドポイントをダイナミックにプロビジョニングして、スマートフォンやその他のデバイスからの増加するデータトラフィック量に対応できるようにします。

    これらのユースケースは、異なるネットワークアプリケーションとプロトコルを使用して実装され、インフラストラクチャーとは異なる接続性、分離、パフォーマンスの特性を必要とします。また、コントロールプレーンのインターフェイスとプロトコル、実際の転送プレーンを分離することが一般的です。OpenStack には、さまざまなデータパスの接続性オプションを提供できるように十分な柔軟性が必要です。

基本的に、仮想マシンにデータプレーンの接続性を提供する一般的なアプローチは 2 種類あります。

  • 直接ハードウェアアクセス: Linux カーネルをバイパスし、Virtual Function (VF) と Physical Function (PF) の両方のパススルーに対して PCI パススルーや Single Root I/O Virtualization (SR-IOV) などのテクノロジーを使用して、物理 NIC への安全な直接メモリーアクセス (DMA) を提供します。
  • 仮想スイッチ (vswitch) の使用: ハイパーバイザーのソフトウェアサービスとして実装されています。仮想マシンは、仮想インターフェイス (vNIC) を使用して vSwitch に接続され、vSwitch は仮想マシン間や仮想マシンと物理ネットワーク間のトラフィックを転送することができます。

高速データパスには、以下のようなオプションがあります。

  • Single Root I/O Virtualization (SR-IOV): 単一の PCI ハードウェアデバイスを複数の仮想 PCI デバイスのように見せる標準のことです。これは、Physical Function (PF) を導入して機能します。PF とは、物理ハードウェアポートと Virtual Function (VF: 仮想マシンに割り当てられた軽量機能) の機能を果たすフル装備の PCIe 機能です。仮想マシンは、VF をハードウェアと直接通信する通常の NIC とみなします。NIC は複数の VF をサポートします。
  • Open vSwitch (OVS): 仮想化サーバー環境内で仮想スイッチとして使用されるように設計されたオープンソースのソフトウェアスイッチです。OVS は、通常の L2-L3 スイッチのケーパビリティーだけでなく、ユーザー定義のオーバーレイネットワーク (例: VXLAN) を作成する OpenFlow などの SDN プロトコルもサポートします。OVS は、物理 NIC を使用する仮想マシン間およびホスト全体のパケットの切り替えに、Linux のカーネルネットワークを使用します。OVS は、iptables/ebtables で Linux ブリッジのオーバーヘッドを回避する接続トラッキング (Conntrack) と内蔵のファイアウォール機能をサポートするようになりました。Red Hat OpenStack Platform 環境の Open vSwitch は、カスタマイズなしに OVS と OpenStack Networking (neutron) を統合できます。
  • Data Plane Development Kit (DPDK): 高速なパケット処理に向けてライブラリーセットや Poll Mode Driver (PMD) で構成されます。DPDK はユーザー空間で大半を実行するように設計されており、アプリケーションが NIC から (または NIC へ) 直接独自のパケット処理を実行できるようになります。DPDK は、レイテンシーを減らし、処理するパケット数を増やすことができます。DPDK Poll Mode Drivers (PMDs) はビジーループで実行され、ホストの NIC ポートやゲストの vNIC ポートにパケットが到着していないかを絶えずスキャンします。
  • DPDK accelerated Open vSwitch (OVS-DPDK): Linux カーネルバイパスと物理 NIC への Direct Memory Access (DMA) を用いた高性能のユーザー空間ソリューションに向け DPDK がバンドルされた Open vSwitch。これは、標準の OVS カーネルデータパスを DPDK ベースのデータパスに置き換えて、内部で DPDK をパケット転送に使用するユーザー空間の vSwitch をホストに構築するという発想になります。このアーキテクチャーの利点は、大半がユーザーに透過的である点です。OpenFlow、OVSDB、コマンドラインなどの公開されるインターフェイスは、ほぼ同じ状態のままになります。

1.4. ETSI NFV アーキテクチャー

欧州電気通信標準化機構 (ETSI: European Telecommunications Standards Institute) は、ヨーロッパの情報通信技術 (ICT: Information and Communications Technology) の標準を開発する独立した標準化組織です。

ネットワーク機能仮想化 (NFV) は、プロプライエタリーのハードウェアデバイスの使用に伴う問題への対処に重点を置いています。NFV を使用すると、ユースケースの要件や経済的な利点によっては、ネットワーク固有の設備をインストールする必要性が軽減されます。ETSI Industry Specification Group for Network Functions Virtualization (ETSI ISG NFV) は、VF を確実にサポートするために必要な要件、リファレンスアーキテクチャー、インフラストラクチャー仕様を設定します。

Red Hat では、通信事業者 (CSP) の IT とネットワークのコンバージェンス実現を支援するオープンソースベースのクラウド最適化ソリューションを提供しています。Red Hat は、Single Root I/O Virtualization (SR-IOV) や Open vSwitch with Data Plane Development Kit (OVS-DPDK) などの NFV 機能を Red Hat OpenStack Services on OpenShift (RHOSO) 環境に追加します。

1.5. NFV ETSI のアーキテクチャーおよびコンポーネント

一般に、Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワーク機能仮想化 (NFV) には、次のコンポーネントがあります。

図1.1 NFV ETSI のアーキテクチャーおよびコンポーネント

NFV ETSI のアーキテクチャーおよびコンポーネント
  • 仮想ネットワーク機能 (VNF): ルーター、ファイアウォール、ロードバランサー、ブロードバンドのゲートウェイ、モバイルパケットのプロセッサー、サービス提供ノード、シグナリング、位置情報サービスなどのネットワーク機能のソフトウェア実装。
  • ネットワーク機能仮想化インフラストラクチャー (NFVi): インフラストラクチャーを設定する物理リソース (Compute、ストレージ、ネットワーク) および仮想化層。このネットワークには、仮想マシン間およびホスト全体でパケットを転送するためのデータパスが含まれます。これにより、基盤のハードウェアの情報を考慮せずに VNF をインストールできます。NFVi は、NFV スタックの基盤を形成します。NFVi は、マルチテナントをサポートし、Virtual Infrastructure Manager (VIM) で管理されます。Enhanced Platform Awareness (EPA) は低レベルの CPU および NIC アクセラレーション機能を VNF に公開し、仮想マシンのパケット転送のパフォーマンス (スループット、レイテンシー、ジッター) を向上させます。
  • NFV Management and Orchestration (MANO): VNF のライフサイクル全体で必要とされる全サービス管理タスクにフォーカスする管理およびオーケストレーション層。MANO の主要な目的は、オペレーターが顧客に提供するネットワーク機能のサービス定義、自動化、エラーの相関関係、監視、ライフサイクル管理を物理インフラストラクチャーから切り離せるようにすることです。このような切り離しを行うには、Virtual Network Function Manager (VNFM) が提供する管理層が追加で必要になります。VNFM は、直接対話するか、VNF ベンダーが提供する Element Management System (EMS) を使用して、仮想マシンのライフサイクルや VNF を管理します。MANO が定義するコンポーネントでもう 1 つ重要なのは、NFVO として知られるオーケストレーターです。NFVO は、最上部のオペレーション/ビジネスサポートシステム (OSS/BSS) や、最下部の VNFM など、さまざまなデータベースやシステムにインターフェイスを提供します。NFVO は、顧客向けの新規サービスを構築する場合、VNFM に対して VNF のインスタンス化をトリガーするよう頼みます (これにより、複数の仮想マシンが作成される場合があります)。
  • オペレーション/ビジネスサポートシステム (OSS/BSS: Operations/Business Support System): オペレーションサポートや請求など必要不可欠なビジネス機能アプリケーションを提供します。OSS/BSS は、NFV に適応する必要があり、レガシーシステムと新規の MANO コンポーネントを統合しています。BSS システムは、サービスサブスクリプションをベースにポリシーを設定して、レポートと請求を管理します。
  • システム管理、自動化、ライフサイクル管理: システム管理、インフラストラクチャーコンポーネントの自動化、および NFVi プラットフォームのライフサイクルを管理します。

1.6. Red Hat NFV のコンポーネント

Red Hat のネットワーク機能仮想化 (NFV) ソリューションには、ETSI モデルの NFV フレームワークのさまざまなコンポーネントとして機能できるさまざまな製品が含まれています。NFV ソリューションには、Red Hat ポートフォリオの次の製品が統合されています。

  • Red Hat OpenStack Services on OpenShift (RHOSO) - IT および NFV ワークロードをサポートします。Enhanced Platform Awareness (EPA) 機能は、SR-IOV や OVS-DPDK をサポートする CPU ピニング、huge page、Non-Uniform Memory Access (NUMA) アフィニティー、ネットワークアダプター (NIC) などを使用して、確定的なパフォーマンスの向上を実現します。
  • Red Hat Enterprise Linux および Red Hat Enterprise Linux Atomic Host: VNF として仮想マシンやコンテナーを作成します。
  • Red Hat Ceph Storage: サービスプロバイダーのワークロードに関するすべてのニーズに対応する弾力性があり、統一された高性能なストレージ層を提供します。
  • Red Hat JBoss Middleware および Red Hat 提供の OpenShift Enterprise: オプションで OSS/BSS コンポーネントの最新化に使用することができます。
  • Red Hat CloudForms: VNF マネージャーを提供し、統合された画面に、VIM や NFVi などの複数のソースのデータを表示することができます。
  • Red Hat Satellite および Red Hat 提供の Ansible: オプションでシステムの管理、自動化、ライフサイクル管理を強化します。

第2章 NFV パフォーマンスに関する考慮事項

ネットワーク機能仮想化 (NFV) ソリューションが有用であるためには、VF が物理実装のパフォーマンス以上である必要があります。Red Hat の仮想化技術は、OpenStack およびクラウドのデプロイメントで一般的に使用されている高フォーマンスの Kernel-based Virtual Machine (KVM) ハイパーバイザーをベースにしています。

Red Hat OpenStack Services on OpenShift (RHOSO) では、ゲスト仮想ネットワーク機能 (VNF) のラインレートのパフォーマンスを実現するために、リソースの分割と微調整を適用するように Compute ノードを設定します。NFV のユースケースにおける主要なパフォーマンス要素は、スループット、レイテンシー、およびジッターです。

Data Plane Development Kit (DPDK) で高速化した仮想マシンを使用して、物理 NIC と仮想マシン間で高速なパケット切り替えを有効にすることができます。Open vSwitch (OVS) には、Data Plane Development Kit (DPDK) のサポートが組み込まれており、vhost-user マルチキューのサポートも含まれているため、スケーラブルなパフォーマンスが実現します。OVS-DPDK は、ゲスト VNF 用のラインレートパフォーマンスを提供します。

Single Root I/O Virtualization (SR-IOV) ネットワークでは、特定ネットワークや仮想マシンのスループット向上など、強化されたパフォーマンスが提供されます。

パフォーマンスチューニングの他の重要な機能には、ヒュージページ、NUMA 調整、ホストの分離、CPU ピニングなどが挙げられます。VNF フレーバーには、パフォーマンス向上のためにヒュージページとエミュレータースレッドの分離が必要です。ホストの分離や CPU ピニングにより、NFV パフォーマンスが向上され、擬似パケットロスが回避されます。

2.1. CPU と NUMA ノード

以前は、x86 システムの全メモリーは、システム内のどの CPU からでも同等にアクセスできていました。これにより、システム内で操作を行う CPU、Uniform Memory Access (UMA) を参照する CPU はどれでも、メモリーのアクセス時間が同じでした。

Non-Uniform Memory Access (NUMA) では、システムメモリーは、特定の CPU またはソケットに割り当てられるノードと呼ばれるゾーンに分割されます。CPU のローカルにあるメモリーには、そのシステムのリモートの CPU に接続されているメモリーにアクセスするよりも高速です。通常、NUMA システム上のソケットにはそれぞれローカルのメモリーノードがあり、別の CPU のローカルにあるノードのメモリーや、全 CPU で共有されるバス上のメモリーよりも、コンテンツに早くアクセスできます。

同様に、物理 NIC は Compute ノードのハードウェア上の PCI スロットに配置されます。これらのスロットは、特定の NUMA ノードに関連付けられる特定の CPU ソケットに接続されます。パフォーマンスを最適化するには、CPU の設定 (SR-IOV または OVS-DPDK) と同じ NUMA ノードにデータパス NIC を接続します。

NUMA を使用しない場合のパフォーマンスへの影響は大きく、一般的に、パフォーマンスの 10 % 以上が影響を受けます。各 CPU ソケットには、仮想化を目的とする個別の CPU として扱われる複数の CPU コアを配置することができます。

ヒント

NUMA の詳細は、What is NUMA and how does it work on Linux? を参照してください。

2.1.1. NUMA ノードの例

以下の図は、2 つのノードからなる NUMA システムの例と、CPU コアとメモリーページが利用可能になる仕組みを示しています。

図2.1 例: 2 ノードの NUMA システム

例: 2 ノードの NUMA システム
注記

Interconnect 経由で利用可能なリモートのメモリーには、NUMA ノード 0 からの VM1 に NUMA ノード 1 の CPU コアがある場合 のみ、アクセスすることができます。この場合、NUMA ノード 1 のメモリーは、VM1 の 3 番目の CPU コアのローカルとして機能します (例: 上記の図では VM1 は CPU4 が割り当てられています) が、それと同時に、同じ仮想マシンの別の CPU コアに対してはリモートメモリーとして機能します。

2.1.2. NUMA 対応のインスタンス

NUMA アーキテクチャーを持つシステム上で NUMA トポロジー認識を使用するように OpenStack 環境を設定することができます。仮想マシン (VM) でゲストオペレーティングシステムを実行する場合は、NUMA トポロジーが 2 つあります。

  • ホストの物理ハードウェアの NUMA トポロジー
  • ゲストオペレーティングシステムに公開される仮想ハードウェアの NUMA トポロジー

仮想ハードウェアを物理ハードウェア NUMA トポロジーに合わせて調整することで、ゲストオペレーティングシステムのパフォーマンスを最適化することができます。

2.2. CPU ピニング

CPU ピニングは、指定のホスト内にある特定の物理 CPU 上で特定の仮想マシンの仮想 CPU を実行する機能のことです。vCPU ピニングでは、ベアメタルシステムへのピニングタスクと同様の利点が得られます。仮想マシンは、ホストのオペレーティングシステムのユーザー空間タスクとして実行されるので、ピニングすることでキャッシュの効率性が向上します。

2.3. huge page

物理メモリーは、ページと呼ばれる連続した一連のリージョンに分割されます。効率化を図るため、システムは、各メモリーバイトにアクセスするのではなく、ページ全体にアクセスしてメモリーを取得します。このような変換を実行するには、システムは、最近使用されたページまたは頻繁に使用されるページの物理から仮想アドレスへのマッピングが含まれるトランスレーションルックアサイドバッファー (TLB: Translation Lookaside Buffers) をチェックします。検索したマッピングが TLB にない場合には、プロセッサーは全ページテーブルで同じ処理を反復して、アドレスマッピングを判断する必要があります。TLB を最適化し、これらの TLB ミス時に発生するパフォーマンスペナルティーを最小限に抑えます。

X86 システムの通常のページサイズは 4 KB ですが、他の大きなページサイズを利用することもできます。ページサイズが大きいと全体的なページ数が少なくなるので、TLB に仮想から物理アドレスへの変換を保管可能なシステムメモリー量が増えることになります。その結果、TLB ミスの可能性が低くなり、パフォーマンスが向上します。ページサイズが大きいと、プロセスはページに割り当てる必要があるため、メモリーを無駄にする可能性が高くなりますが、すべてのメモリーが必要となることはあまりありません。そのため、ページサイズを選択する際には、より大きいページを使用してアクセス時間を速くするか、より小さいページを使用して最大限にメモリーが使用されるようにするかで、トレードオフが生じます。

第3章 NFV の要件

このセクションでは、Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワーク機能仮想化 (NFV) の要件を説明します。

Red Hat は、RHOSO での使用に適したハードウェアを認定しています。詳細は、認定済みハードウェア を参照してください。

3.1. NFV 向けのテスト済み NIC

NFV 向けのテスト済み NIC のリストは、Network Adapter Fast Datapath Feature Support Matrix を参照してください。

NVIDIA (Mellanox) ネットワークインターフェイスを設定する場合を除き、サポート対象の NIC のデフォルトドライバーを使用してください。NVIDIA ネットワークインターフェイスの場合、設定時にカーネルドライバーを指定する必要があります。

この例では、OVS-DPDK ポートが設定されています。使用されている NIC が NVIDIA ConnectX-5 であるため、ドライバーを指定する必要があります。
members
 - type: ovs_dpdk_port
    name: dpdk0
    driver: mlx5_core
    members:
    - type: interface
      name: enp3s0f0

3.2. NUMA ノードのトポロジーの理解

Red Hat OpenStack Services on OpenShift (RHOSO) 環境でネットワーク機能仮想化 (NFV) を使用する場合、CPU とメモリーのリソースを分割して最適なパフォーマンスを得るために、Compute ノードの NUMA トポロジーを理解する必要があります。NUMA 情報を確認するには、以下のいずれかのタスクを実行します。

  • ハードウェアイントロスペクションを有効にして、ベアメタルノードからこの情報を取得する。
  • 各ベアメタルノードにログオンして、手動で情報を収集する。

3.3. NFV BIOS 設定

次の表は、Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワーク機能仮想化 (NFV) に必要な BIOS 設定を示しています。

注記

BIOS で SR-IOV グローバルおよび NIC 設定を有効にする必要があります。有効にしないと、SR-IOV Compute ノードを使用した RHOSO デプロイメントが失敗します。

Expand
表3.1 BIOS 設定
パラメーター設定

C3 Power State

Disabled

C6 Power State

Disabled

MLC Streamer

Enabled

MLC Spatial Prefetcher

Enabled

DCU Data Prefetcher

Enabled

DCA

Enabled

CPU Power and Performance

Performance

Memory RAS and Performance Config → NUMA Optimized

Enabled

Turbo Boost

確定的なパフォーマンスを必要とする NFV デプロイメントでは無効になっています。他のすべてのシナリオで有効です。

VT-d

Intel カードで VFIO 機能が必要な場合には Enabled

NUMA memory interleave

Disabled

intel_idle ドライバーを使用するプロセッサーでは、Red Hat Enterprise Linux は BIOS 設定を無視し、プロセッサーの C ステートを再度有効にすることができます。

カーネルブートコマンドラインでキーと値のペア intel_idle.max_cstate=0 を指定すると、intel_idle を無効にし、代わりに acpi_idle ドライバーを使用できます。

current_driver の内容をチェックして、プロセッサーが acpi_idle ドライバーを使用していることを確認します。

$ cat /sys/devices/system/cpu/cpuidle/current_driver
出力例
acpi_idle
注記

Tuned デーモンの起動に時間がかかるため、ドライバーを変更した後は多少の遅延が発生します。ただし、Tuned のロード後、プロセッサーはより深い C ステートを使用しません。

3.4. NFV でサポートされるドライバー

Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワーク機能仮想化 (NFV) でサポートされるドライバーの完全なリストは、Red Hat OpenStack Platform におけるコンポーネント、プラグイン、およびドライバーのサポート を参照してください。

RHOSO 環境で NFV 向けにテストされた NIC のリストは、NFV 向けのテスト済み NIC を参照してください。

第4章 SR-IOV デプロイメントの計画

Red Hat OpenStack Services on OpenShift (RHOSO) 環境の NFV の Single Root I/O Virtualization (SR-IOV) デプロイメントを最適化するには、SR-IOV が Compute ノードハードウェア (CPU、NUMA ノード、メモリー、NIC) を使用する仕組みを理解することが重要です。この理解は、SR-IOV 設定で使用するパラメーターに必要な値を決定するうえで役立ちます。

SR-IOV パラメーターに対するハードウェアの影響を評価するには、NUMA ノードのトポロジーに関する理解 を参照してください。

4.1. SR-IOV デプロイメント向けの NIC の分割

Red Hat OpenStack Services on OpenShift (RHOSO) 管理ネットワークおよびプロバイダーネットワークに Single Root I/O Virtualization (SR-IOV) Virtual Function (VF) を設定することで、各ホストに必要な NIC の数を減らすことができます。1 つの高速 NIC を複数の VF に分割する場合、NIC をコントロールプレーンおよびデータプレーントラフィックの両方に使用することができます。この機能は、Intel Fortville NIC および Mellanox CX-5 NIC で検証されています。

NIC を分割するには、次の要件に従う必要があります。

  • NIC、そのアプリケーション、VF ゲスト、および OVS が、同じ NUMA Compute ノード上に存在する。

    そうすることで、NUMA 間の操作によるパフォーマンスの低下を防ぐことができます。

  • NIC ファームウェアを更新する。

    Yum または dnf 更新ではファームウェアの更新が完了しない可能性があります。詳細は、ベンダーのドキュメントを参照してください。

重要

ベアメタルのプロビジョニング中に使用される初期設定の一部は、プロビジョニング後に自動的に削除されません。場合によっては、OpenStackDataPlaneNodeSet CR の spec.bareMetalSetTemplate.ctlplaneInterface で指定されているように、プロビジョニングコントロールプレーンインターフェイスに使用される IP アドレスが重複して割り当てられる可能性があります。プロビジョニングされていないノードからの os-net-config データプレーンのデプロイメントで、コントロールプレーンインターフェイス以外のものと同じ NIC を使用し、その NIC をパーティション分割すると、IP アドレスの競合によってデプロイメントが中断される可能性があります。

そのような競合を防ぐには、古いホストネットワーク設定のクリーンアップ で説明されているとおり、remove_config を使用します。

os-net-config がデプロイされたデータプレーンで NIC をコントロールプレーンインターフェイスとして使用する場合、または NIC をパーティション分割しない場合、競合は発生しません。その場合は、remove-config を使用する必要はありません。

4.2. SR-IOV デプロイメント向けのハードウェアの分割

SR-IOV で高パフォーマンスを実現するには、ホストとゲストの間でリソースを分割します。

図4.1 NUMA ノードトポロジー

NUMA ノードトポロジー

標準的なトポロジーでは、デュアルコアソケットの Compute ノード上の NUMA ノードにはそれぞれ 14 のコアが実装されます。HT (ハイパースレッド) および非 HT のコアがサポートされています。各コアには 2 つのシブリングスレッドがあります。1 つのコアは、各 NUMA ノード上のホスト専用です。仮想ネットワーク機能 (VNF) は SR-IOV インターフェイスのボンディングを処理します。すべての割り込み要求 (IRQ) はホストのコア上でルーティングされます。VNF コアは VNF 専用です。これらのコアは、他の VNF からの分離と、ホストからの分離を提供します。各 VNF は単一の NUMA ノード上のリソースを使用する必要があります。VNF によって使用される SR-IOV NIC はその同じ NUMA ノードに関連付ける必要もあります。このトポロジーでは、仮想化のオーバーヘッドはありません。ホスト、OpenStack Networking (neutron)、および Compute (nova) の設定パラメーターは単一のファイルで公開されるので、管理が簡単で、整合性を保つことができます。また、プリエンプションやパケットロスの原因となり、分離を適切に行うにあたって致命的となる一貫性の欠如を回避します。ホストと仮想マシンの分離は、tuned プロファイルに依存します。このプロファイルは、分離する CPU のリストに基づいて、ブートパラメーターや Red Hat OpenStack Platform の変更を定義します。

4.3. NFV SR-IOV デプロイメントのトポロジー

以下の図には、2 つの VNF が示されています。各 VNF には、mgt で示された管理インターフェイスおよびデータプレーンインターフェイスがあります。管理インターフェイスは ssh アクセスなどを管理します。データプレーンインターフェイスは VNF を DPDK にボンディングして、高可用性を確保します。VNF は DPDK ライブラリーを使用してデータプレーンインターフェイスをボンディングするためです。この図には、冗長性を確保するための 2 つのプロバイダーネットワークも示されています。Compute ノードには 2 つの標準 NIC がボンディングされ、VNF 管理と Red Hat OpenStack Platform API 管理の間で共有されています。

図4.2 NFV SR-IOV トポロジー

NFV SR-IOV deployment

この図は、アプリケーションレベルで DPDK を使用し、SR-IOV Virtual Function (VF) および Physical Function (PF) へのアクセスが可能な VNF を示しています。これにより、ファブリックの設定に応じて可用性またはパフォーマンスが向上します。DPDK はパフォーマンスを向上させる一方、VF/PF DPDK のボンディングはフェイルオーバーおよび高可用性に対応します。VNF ベンダーは、DPDK Poll Mode Driver (PMD) による SR-IOV カード (VF/PF として公開されている) のサポートを確実にする必要があります。また、管理ネットワークは OVS を使用するので、VNF は標準の virtIO ドライバーを使用する mgmt ネットワークデバイスを認識します。VNF への初回の接続にそのデバイスを使用して、DPDK アプリケーションに 2 つの VF/PF をボンディングさせることができます。

4.4. HCI を使用しない NFV SR-IOV のトポロジー

以下の図には、NFV 向けのハイパーコンバージドインフラストラクチャー (HCI) を使用しない SR-IOV のトポロジーを示しています。これは、1 Gbps の NIC を備えたコンピュートノードとコントローラーノード、および RHOSO ワーカーノードで構成されます。

図4.3 HCI を使用しない NFV SR-IOV トポロジー

NFV SR-IOV Topology without HCI

第5章 OVS-DPDK デプロイメントの計画

Red Hat OpenStack Services on OpenShift (RHOSO) 環境の NFV の Open vSwitch with Data Plane Development Kit (OVS-DPDK) デプロイメントを最適化するには、OVS-DPDK が Compute ノードのハードウェア (CPU、NUMA ノード、メモリー、NIC) を使用する仕組みを理解する必要があります。この理解は、OVS-DPDK 設定で使用するパラメーターに必要な値を決定するうえで役立ちます。

重要

OVS-DPDK および OVS ネイティブファイアウォール (conntrack に基づくステートフルファイアウォール) を使用する場合、追跡することができるのは ICMPv4、ICMPv6、TCP、および UDP プロトコルを使用するパケットだけです。OVS は、その他すべてのネットワークトラフィック種別を無効と識別します。

5.1. CPU 分割と NUMA トポロジーを使用する OVS-DPDK

OVS-DPDK は、ホスト、ゲスト、およびそれ自体用にハードウェアリソースを分割します。OVS-DPDK Poll Mode Driver (PMD) は、専用の CPU コアを必要とする DPDK アクティブループを実行します。したがって、一部の CPU およびヒュージページを OVS-DPDK に割り当てる必要があります。

サンプルの分割では、デュアルソケットの Compute ノード上の 1 NUMA ノードにつき 16 コアが含まれます。ホストと OVS-DPDK 間で NIC を共有することができないので、トラフィックには追加の NIC が必要です。

図5.1 NUMA トポロジー: CPU パーティショニングを備えた OVS-DPDK

NUMA トポロジー: CPU パーティショニングを備えた OVS-DPDK
注記

NUMA ノードに DPDK NIC が関連付けられていない場合でも、両方の NUMA ノードで DPDK PMD スレッドを確保する必要があります。

最高の OVS-DPDK パフォーマンスを得るためには、NUMA ノードにローカルなメモリーブロックを確保します。メモリーと CPU ピニングに使用する同じ NUMA ノードに関連付けられた NIC を選択してください。ボンディングを設定する両方のインターフェイスには、同じ NUMA ノード上の NIC を使用するようにしてください。

5.2. TCP セグメンテーションオフロード対応の OVS-DPDK

RHOSO 18.0.10 (機能リリース 3) では、OVS-DPDK を使用した RHOSO 環境の TCP セグメンテーションオフロード (TSO) がテクノロジープレビューから一般利用可能な機能に昇格されました。

注記

新しい RHOSO 環境の初期デプロイメントでのみ、DPDK に対して TSO を有効にします。この機能は、過去にデプロイしたシステムでの有効化には対応していません。

セグメンテーションプロセスはトランスポートレイヤーで行われます。上位スタックレイヤーからのデータをセグメントに分割し、ネットワークレイヤーとデータリンクレイヤーでネットワーク間およびネットワーク内の転送をサポートします。

セグメンテーション処理はホスト上で実行され、CPU リソースを消費します。TSO を使用すると、セグメンテーションが NIC にオフロードされ、ホストリソースが解放されてパフォーマンスが向上します。

ワークロードに、ユーザー空間またはカーネルでの TCP セグメンテーションを必要とする大きなフレームが含まれている場合、TSO for DPDK は役立ちます。

Red Hat OpenStack Services on OpenShift (RHOSO) OVS-DPDK 環境を設定して、TCP セグメンテーションを NIC (TSO) にオフロードすることができます。

重要

このセクションの以下のコンテンツは、今回のリリースでは テクノロジープレビュー としての利用となるため、Red Hat によって完全にはサポートされません。これは、テスト用途にのみご利用いただく機能です。実稼働環境にはデプロイしないでください。詳細は、テクノロジープレビュー を参照してください。

注記

新しい RHOSO 環境の初期デプロイメントでのみ、TSO for DPDK のテクノロジープレビューを有効にします。以前に導入されたシステムでこのテクノロジープレビューを有効にすることはサポートされていません。

前提条件

  • OpenStack Operator を使用して作成した動作中のコントロールプレーン。詳細は、コントロールプレーンの作成 を参照してください。
  • cluster-admin 権限を持つユーザーとして、Red Hat OpenShift Container Platform (RHOCP) クラスターにアクセスできるワークステーションにログオンしている。

手順

  1. 事前にプロビジョニングされたノードを使用したデータプレーンノードセットの作成 または プロビジョニングされていないノードを使用したデータプレーンノードセットの作成 の手順を実行する場合は、OpenStackDataPlaneNodeSet マニフェストに edpm_ovs_dpdk_enable_tso: true 値のペアを含めます。以下に例を示します。

      nodeTemplate:
        ansible:
          ansibleUser: cloud-admin
          ansiblePort: 22
          ansibleVarsFrom:
            - prefix: subscription_manager_
              secretRef:
                name: subscription-manager
            - secretRef:
                name: redhat-registry
          ansibleVars:
            edpm_ovs_dpdk_enable_tso: true
            edpm_bootstrap_command: |
           ...
  2. ノードセットの作成手順を完了します。

検証

  • ノードセットの手順を完了したら、コンピュートノードで次のコマンドを実行します。

    ovs-vsctl get Open_vSwitch . other_config:userspace-tso-enable

5.4. 2 NUMA ノード設定の OVS-DPDK デプロイメントの例

次の例の Red Hat OpenStack Services on OpenShift (RHOSO) Compute ノードには、2 つの NUMA ノードが含まれています。

  • NUMA 0 には論理コア 0 - 7 (物理コア 4 つ) があります。シブリングスレッドのペアは (0,1)、(2,3)、(4,5)、(6,7) です。
  • NUMA 1 にはコア 8 - 15 があります。シブリングスレッドのペアは (8,9)、(10,11)、(12,13)、(14,15) です。
  • 各 NUMA ノードが、物理 NIC、つまり NUMA 0 の NIC1 と NUMA 1 の NIC2 に接続されています。

図5.2 OVS-DPDK: 2 つの NUMA ノードの例

OVS-DPDK: 2 つの NUMA ノードの例
注記

各 NUMA ノード上の 1 番目の物理コアまたは両スレッドペア (0、1 および 8、9) は、データパス以外の DPDK プロセス用に確保します。

この例では、MTU が 1500 に設定されており、全ユースケースで OvsDpdkSocketMemory が同じであることも前提です。

OvsDpdkSocketMemory: "1024,1024"
NIC 1 は DPDK 用で、1 つの物理コアは PMD 用
このユースケースでは、NUMA 0 の物理コアの 1 つを PMD 用に割り当てます。NUMA 1 の NIC では DPDK は有効化されていませんが、その NUMA ノードの物理コアの 1 つも割り当てる必要があります。残りのコアはゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
edpm_ovs_dpdk_pmd_core_list: "2,3,10,11"
cpu_dedicated_set: "4,5,6,7,12,13,14,15"
NIC 1 は DPDK 用で、2 つの物理コアは PMD 用
このユースケースでは、NUMA 0 の物理コアの 2 つを PMD 用に割り当てます。NUMA 1 の NIC では DPDK は有効化されていませんが、その NUMA ノードの物理コアの 1 つも割り当てる必要があります。残りのコアはゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
edpm_ovs_dpdk_pmd_core_list: "2,3,4,5,10,11"
cpu_dedicated_set: "6,7,12,13,14,15"
NIC 2 は DPDK 用で、1 つの物理コアは PMD 用
このユースケースでは、NUMA 1 の物理コアの 1 つを PMD 用に割り当てます。NUMA 0 の NIC では DPDK は有効化されていませんが、その NUMA ノードの物理コアの 1 つも割り当てる必要があります。残りのコアはゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
edpm_ovs_dpdk_pmd_core_list: "2,3,10,11"
cpu_dedicated_set: "4,5,6,7,12,13,14,15"
NIC 2 は DPDK 用で、2 つの物理コアは PMD 用
このユースケースでは、NUMA 1 の物理コアの 2 つを PMD 用に割り当てます。NUMA 0 の NIC では DPDK は有効化されていませんが、その NUMA ノードの物理コアの 1 つも割り当てる必要があります。残りのコアはゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
edpm_ovs_dpdk_pmd_core_list: "2,3,10,11,12,13"
cpu_dedicated_set: "4,5,6,7,14,15"
NIC 1 と NIC2 は DPDK 用で、2 つの物理コアは PMD 用
このユースケースでは、各 NUMA ノードの物理コアの 2 つを PMD 用に割り当てます。残りのコアはゲストインスタンスに割り当てられます。その結果、パラメーターの設定は以下のようになります。
edpm_ovs_dpdk_pmd_core_list: "2,3,4,5,10,11,12,13"
cpu_dedicated_set: "6,7,14,15"

5.5. NFV OVS-DPDK デプロイメントのトポロジー

以下のデプロイメント例は、2 つの仮想ネットワーク機能 (VNF) からなる OVS-DPDK 設定を示しています。それぞれの VNF は、次の 2 つのインターフェイスで構成されます。

  • mgt で表される管理インターフェイス
  • データプレーンインターフェイス

OVS-DPDK デプロイメントでは、VNF は物理インターフェイスをサポートする組み込みの DPDK で動作します。OVS-DPDK は、vSwitch レベルでボンディングを有効にします。OVS-DPDK デプロイメントのパフォーマンスを高めるために、カーネル NIC と OVS-DPDK NIC を分離します。仮想マシン向けのベースプロバイダーネットワークに接続された管理 (mgt) ネットワークを分離するには、追加の NIC を利用できるようにします。Compute ノードは、Red Hat OpenStack Platform API 管理向けの標準 NIC 2 つで構成されます。これは、Ceph API で再利用できますが、OpenStack プロジェクトとは一切共有できません。

図5.3 Compute ノード: NFV OVS-DPDK

Compute ノード: NFV OVS-DPDK

図5.4 NFV の OVS-DPDK のトポロジー

NFV の OVS-DPDK のトポロジー

第6章 Operator のインストールと準備

Red Hat OpenStack Services on OpenShift (RHOSO) OpenStack Operator (openstack-operator) をインストールし、稼働中の Red Hat OpenShift Container Platform (RHOCP) クラスター上に RHOSO コントロールプレーンを作成します。OpenStack Operator のインストールには、RHOCP Web コンソールを使用します。コントロールプレーンのインストールタスクとすべてのデータプレーンの作成タスクは、RHOCP クラスターにアクセスできるワークステーションで実行します。

RHOSO バージョンを OpenStack Operator および OpenStackVersion カスタムリソース (CR) にマッピングする方法については、Red Hat ナレッジベースの記事 https://access.redhat.com/articles/7125383 を参照してください。

6.1. 前提条件

  • 稼働中の RHOCP クラスター、バージョン 4.18。RHOCP のシステム要件は、デプロイメントのプランニングRed Hat OpenShift Container Platform クラスターの要件 を参照してください。

    • RHOSO コントロールプレーンをホストするための RHOCP の最小ハードウェア要件については、RHOCP の最小ハードウェア要件 を参照してください。
    • RHOCP の最小ネットワーク要件については、RHOCP ネットワーク要件 を参照してください。
    • openstack-operator をインストールする前にインストールする必要がある Operator のリストについては、RHOCP ソフトウェア要件 を参照してください。
  • oc コマンドラインツールがワークステーションにインストールされている。
  • cluster-admin 権限を持つユーザーとして RHOCP クラスターにログインしている。

6.2. OpenStack Operator のインストール

Red Hat OpenShift Container Platform (RHOCP) Web コンソールの OperatorHub を使用して、RHOCP クラスターに OpenStack Operator (openstack-operator) をインストールします。Operator をインストールした後、クラスター上で OpenStack Operator を起動するために、OpenStack Operator 初期化リソースの単一インスタンスを設定します。

手順

  1. cluster-admin 権限を持つユーザーとして RHOCP Web コンソールにログインします。
  2. Operators → OperatorHub を選択します。
  3. Filter by keywordOpenStack と入力します。
  4. Red Hat というソースラベルが付いた OpenStack Operator タイルをクリックします。
  5. Operator の情報を確認してから、Install をクリックします。
  6. Install Operator ページで、Installed Namespace リストから "Operator recommended Namespace: openstack-operators" を選択します。
  7. Install Operator ページで、Update approval リストから "Manual" を選択します。保留中の Operator 更新を手動で承認する方法は、RHOCP Operator ガイドの 保留中の Operator 更新の手動承認 を参照してください。
  8. Install をクリックして、Operator を openstack-operators namespace で使用できるようにします。StatusSucceeded の場合、OpenStack Operator はインストールされています。
  9. Create OpenStack をクリックして、Create OpenStack ページを開きます。
  10. Create OpenStack ページで、Create をクリックして、OpenStack Operator 初期化リソースのインスタンスを作成します。openstack インスタンスの StatusConditions: Ready の場合、OpenStack Operator は使用できる状態です。

第7章 Red Hat OpenStack Services on OpenShift 用の Red Hat OpenShift Container Platform の準備

稼働中の Red Hat OpenShift Container Platform (RHOCP) クラスターに Red Hat OpenStack Services on OpenShift (RHOSO) をインストールします。RHOSO 環境のインストールとデプロイを準備するには、RHOCP クラスターで RHOCP ワーカーノードと RHOCP ネットワークを設定する必要があります。

7.1. Red Hat OpenStack Platform デプロイメント用の Red Hat OpenShift Container Platform ノードの設定

Red Hat OpenStack Services on OpenShift (RHOSO) サービスは、Red Hat OpenShift Container Platform (RHOCP) のワーカーノード上で実行されます。デフォルトでは、OpenStack Operator によっていずれかのワーカーノードに RHOSO サービスがデプロイされます。OpenStackControlPlane カスタムリソース (CR) でノードラベルを使用すると、RHOSO サービスをホストする RHOCP ノードを指定できます。すべての RHOCP ワーカーノードでサービスを実行するのではなく、一部のサービスを特定のインフラストラクチャーノードに固定することで、デプロイメントのパフォーマンスが最適化されます。

RHOCP ノード用の新規ラベルを作成することも、既存のラベルを使用してから、nodeSelector フィールドを使用して OpenStackControlPlane CR でそのラベルを指定することもできます。たとえば、Block Storage サービス (cinder) では、サービスごとに要件が異なります。

  • cinder-scheduler サービスは、メモリー、ディスク、ネットワーク、CPU の使用量が低い非常に軽量なサービスです。
  • cinder-api サービスは、リソースリスト要求のため、ネットワーク使用量が高いサービスです。
  • cinder-volume サービスは、オフラインボリューム移行やイメージからのボリュームの作成など、多くの操作がデータパス内で行われるため、ディスクとネットワークの使用量が高いサービスです。
  • cinder-backup サービスは、メモリー、ネットワーク、および CPU の要求が高いサービスです。

したがって、cinder-apicinder-volume、および cinder-backup サービスを専用のノードに固定し、OpenStack Operator で cinder-scheduler サービスを容量のあるノードに配置することができます。

ヒント

または、Topology CR を作成し、OpenStackControlPlane CR の topologyRef フィールドを使用して、RHOCP クラスターの準備が完了した後にサービス Pod の配置を制御することもできます。詳細は、Topology CR を使用してサービス Pod の配置を制御する を参照してください。

7.2. ストレージクラスの作成

Red Hat OpenStack Services on OpenShift (RHOSO) Pod に永続ボリュームを提供するには、Red Hat OpenShift Container Platform (RHOCP) クラスターストレージバックエンドのストレージクラスを作成する必要があります。このストレージクラスを、RHOSO コントロールプレーンのデプロイメントのクラスターストレージバックエンドとして指定します。ストレージクラスには、SSD または NVMe ドライブに基づくストレージバックエンドを使用します。

永続ボリュームを提供できる既存のストレージクラスがない場合は、Logical Volume Manager Storage Operator を使用して RHOSO のストレージクラスを提供できます。LVM を使用している場合は、コントロールプレーンを作成する前に、LVM Storage Operator により、ストレージが利用可能であることが通知されるまで待つ必要があります。LVM Storage Operator は、ワーカーノードオブジェクトへのボリュームグループのアノテーションを通じて、クラスターと LVMS ストレージの設定が完了したことを通知します。すべてのコントロールプレーンノードの準備が整う前に Pod をデプロイすると、複数の PVC と Pod が同じノードにスケジュールされます。

ストレージの準備ができているかどうかを確認するには、lvmclusters.lvm.topolvm.io オブジェクト内のノードをクエリーします。たとえば、ワーカーノードが 3 つあり、LVM Storage Operator のデバイスクラスの名前が "local-storage" である場合は、次のコマンドを実行します。

# oc get node -l "topology.topolvm.io/node in ($(oc get nodes -l node-role.kubernetes.io/worker -o name | cut -d '/' -f 2 | tr '\n' ',' | sed 's/.\{1\}$//'))" -o=jsonpath='{.items[*].metadata.annotations.capacity\.topolvm\.io/local-storage}' | tr ' ' '\n'

このコマンドによって、ゼロ以外の値が 3 つ返されれば、ストレージは準備完了です。

7.3. openstack namespace の作成

Red Hat OpenStack Services on OpenShift (RHOSO) デプロイメントのサービス Pod 用に、Red Hat OpenShift Container Platform (RHOCP) 環境内に namespace を作成する必要があります。各 RHOSO デプロイメントのサービス Pod は、RHOCP 環境内の独自の namespace に配置されます。

前提条件

  • cluster-admin 権限を持つユーザーとして、RHOCP クラスターにアクセスできるワークステーションにログオンしている。

手順

  1. デプロイする RHOSO 環境用の openstack プロジェクトを作成します。

    $ oc new-project openstack
  2. OpenStack Operator による特権 Pod の作成を有効にするために、openstack namespace にラベルが付いていることを確認します。

    $ oc get namespace openstack -ojsonpath='{.metadata.labels}' | jq
    {
      "kubernetes.io/metadata.name": "openstack",
      "pod-security.kubernetes.io/enforce": "privileged",
      "security.openshift.io/scc.podSecurityLabelSync": "false"
    }

    Security Context Constraint (SCC) が "privileged" でない場合は、次のコマンドを使用して変更します。

    $ oc label ns openstack security.openshift.io/scc.podSecurityLabelSync=false --overwrite
    $ oc label ns openstack pod-security.kubernetes.io/enforce=privileged --overwrite
  3. オプション: openstack namespace でコマンドを実行するときに namespace の指定を不要にするには、デフォルトの namespaceopenstack に設定します。

    $ oc project openstack

7.4. Red Hat OpenStack Services on OpenShift へのセキュアなアクセスの提供

Red Hat OpenStack Services on OpenShift (RHOSO) サービス Pod へセキュアなアクセスを提供するには、Secret カスタムリソース (CR) を作成する必要があります。次の手順では、各サービスに必要なパスワード形式を持つ Secret CR を作成します。

必要なパスワードと fernet キーを生成する Secret CR の例については、RHOSO サービス Pod への安全なアクセスのための Secret CR の例 を参照してください。

警告

コントロールプレーンをデプロイした後にサービスパスワードを変更することはできません。コントロールプレーンをデプロイした後に osp-secret でサービスパスワードが変更されると、サービスは新しいパスワードを使用するように再設定されますが、Identity サービス (keystone) ではパスワードは更新されません。その結果、サービスが停止します。

前提条件

  • python3-cryptography がインストールされている。

手順

  1. ワークステーションに Secret CR (例: openstack_service_secret.yaml) を作成します。
  2. openstack_service_secret.yaml に次の初期設定を追加します。

    apiVersion: v1
    data:
      AdminPassword: <base64_password>
      AodhPassword: <base64_password>
      BarbicanPassword: <base64_password>
      BarbicanSimpleCryptoKEK: <base64_fernet_key>
      CeilometerPassword: <base64_password>
      CinderPassword: <base64_password>
      DbRootPassword: <base64_password>
      DesignatePassword: <base64_password>
      GlancePassword: <base64_password>
      HeatAuthEncryptionKey: <base64_password>
      HeatPassword: <base64_password>
      IronicInspectorPassword: <base64_password>
      IronicPassword: <base64_password>
      ManilaPassword: <base64_password>
      MetadataSecret: <base64_password>
      NeutronPassword: <base64_password>
      NovaPassword: <base64_password>
      OctaviaPassword: <base64_password>
      PlacementPassword: <base64_password>
      SwiftPassword: <base64_password>
    kind: Secret
    metadata:
      name: osp-secret
      namespace: openstack
    type: Opaque
    • <base64_password> を、base64 でエンコードされた 32 文字のキーに置き換えます。

      注記

      HeatAuthEncryptionKey パスワードは、Orchestration サービス (heat) 暗号化用の 32 文字のキーである必要があります。それ以外の全サービスでパスワードの長さを増やす場合は、HeatAuthEncryptionKey のパスワードの長さが 32 のままであることを確認してください。

      次のコマンドを使用して、base64 でエンコードされたパスワードを手動で生成できます。

      $ echo -n <password> | base64

      もしくは、Linux ワークステーションを使用しており、cat などの Bash コマンドを使用して Secret CR を生成している場合は、<base64_password> を次のコマンドに置き換えて、各サービスのランダムパスワードを自動生成できます。

      $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
    • <base64_fernet_key> は、base64 でエンコードされた fernet キーに置き換えます。次のコマンドを使用して、手動で生成できます。

      $(python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode('UTF-8'))" | base64)
  3. クラスターに Secret CR を作成します。

    $ oc create -f openstack_service_secret.yaml -n openstack
  4. Secret CR が作成されたことを確認します。

    $ oc describe secret osp-secret -n openstack

7.4.1. RHOSO サービス Pod へのセキュアなアクセスのための Secret CR の例

Red Hat OpenStack Services on OpenShift (RHOSO) サービス Pod へセキュアなアクセスを提供するには、Secret カスタムリソース (CR) ファイルを作成する必要があります。

Linux ワークステーションを使用している場合は、必要なパスワードと fernet キーを生成する次の Bash cat コマンドを使用して、openstack_service_secret.yaml という Secret CR ファイルを作成できます。

$ cat <<EOF > openstack_service_secret.yaml
apiVersion: v1
data:
  AdminPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  AodhPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  BarbicanPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  BarbicanSimpleCryptoKEK: $(python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode('UTF-8'))" | base64)
  CeilometerPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  CinderPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  DbRootPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  DesignatePassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  GlancePassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  HeatAuthEncryptionKey: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  HeatPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  IronicInspectorPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  IronicPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  ManilaPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  MetadataSecret: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  NeutronPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  NovaPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  OctaviaHeartbeatKey $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  OctaviaPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  PlacementPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
  SwiftPassword: $(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32 | base64)
kind: Secret
metadata:
  name: osp-secret
  namespace: openstack
type: Opaque
EOF

第8章 NFV を使用する RHOSO 用のネットワークの準備

ネットワーク機能仮想化 (NFV) 環境で Red Hat OpenStack Services on OpenShift (RHOSO) の設定とデプロイを準備をするには、RHOCP クラスターで Red Hat OpenShift Container Platform (RHOCP) ネットワークを設定する必要があります。

8.1. デフォルトの Red Hat OpenStack Services on OpenShift ネットワーク

通常、Red Hat OpenStack Services on OpenShift (RHOSO) デプロイメントでは、次の物理データセンターネットワークが実装されます。

  • コントロールプレーンネットワーク: OpenStack Operator が Ansible SSH アクセスを使用して、Red Hat OpenShift Container Platform (RHOCP) 環境からデータプレーンノードをデプロイおよび接続するために使用されます。このネットワークは、インスタンスのライブマイグレーションのためにデータプレーンノードによっても使用されます。
  • 外部ネットワーク: (オプション) 環境で必要な場合に使用します。たとえば、次のいずれかの目的で外部ネットワークを作成できます。

    • 仮想マシンインスタンスにインターネットアクセスを提供するため。
    • コントロールプレーンとは別のフラットプロバイダーネットワークを作成するため。
    • コントロールプレーンとは別のブリッジ上に VLAN プロバイダーネットワークを設定するため。
    • コントロールプレーンネットワーク以外のネットワーク上の Floating IP を持つ仮想マシンインスタンスへのアクセスを提供するため。
  • 内部 API ネットワーク: RHOSO コンポーネント間の内部通信に使用されます。
  • ストレージネットワーク: ブロックストレージ、RBD、NFS、FC、iSCSI に使用されます。
  • テナント (プロジェクト) ネットワーク: クラウドデプロイメント内の仮想マシンインスタンス間のデータ通信に使用されます。
  • Octavia コントローラーネットワーク: コントロールプレーンで実行されている負荷分散サービス (octavia) コントローラーを接続するために使用されます。
  • designate ネットワーク: DNS サーバーを管理するために designate によって内部的に使用されます。
  • designateext ネットワーク: DNS サービスリゾルバーと DNS サーバーへの外部アクセスを提供するために使用されます。
  • ストレージ管理ネットワーク: (オプション) ストレージコンポーネントによって使用されます。たとえば、Red Hat Ceph Storage はハイパーコンバージドインフラストラクチャー (HCI) 環境のストレージ管理ネットワークを cluster_network として使用し、データを複製します。

    注記

    Red Hat Ceph Storage のネットワーク設定の詳細は Red Hat Ceph Storage 設定ガイドCeph ネットワーク設定 を参照してください。

下表は、RHOSO デプロイメントで使用されるデフォルトのネットワークの詳細を示しています。必要に応じて、環境に合わせてネットワークを更新できます。

注記

デフォルトでは、コントロールプレーンと外部ネットワークは VLAN を使用しません。VLAN を使用しないネットワークは、別の NIC に配置する必要があります。新しい RHOSO デプロイメントでは、コントロールプレーンネットワークに VLAN を使用できます。トランキングされたインターフェイス上のネイティブ VLAN を非 VLAN ネットワークとして使用することもできます。たとえば、コントロールプレーンと内部 API を 1 つの NIC に配置し、VLAN のない外部ネットワークを別の NIC に配置できます。

Expand
表8.1 デフォルトの RHOSO ネットワーク
ネットワーク名CIDRNetConfig allocationRangeMetalLB IPAddressPool 範囲net-attach-def ipam 範囲OCP ワーカー nncp 範囲

ctlplane

192.168.122.0/24

192.168.122.100 - 192.168.122.250

192.168.122.80 - 192.168.122.90

192.168.122.30 - 192.168.122.70

192.168.122.10 - 192.168.122.20

external

10.0.0.0/24

10.0.0.100 - 10.0.0.250

該当なし

該当なし

該当なし

internalapi

172.17.0.0/24

172.17.0.100 - 172.17.0.250

172.17.0.80 - 172.17.0.90

172.17.0.30 - 172.17.0.70

172.17.0.10 - 172.17.0.20

storage

172.18.0.0/24

172.18.0.100 - 172.18.0.250

該当なし

172.18.0.30 - 172.18.0.70

172.18.0.10 - 172.18.0.20

tenant

172.19.0.0/24

172.19.0.100 - 172.19.0.250

該当なし

172.19.0.30 - 172.19.0.70

172.19.0.10 - 172.19.0.20

octavia

172.23.0.0/24

該当なし

該当なし

172.23.0.30 - 172.23.0.70

該当なし

designate

172.26.0.0/24

該当なし

該当なし

172.26.0.30 - 172.26.0.70

172.26.0.10 - 172.26.0.20

designateext

172.34.0.0/24

該当なし

172.34.0.80 - 172.34.0.120

172.34.0.30 - 172.34.0.70

172.34.0.10 - 172.34.0.20

storageMgmt

172.20.0.0/24

172.20.0.100 - 172.20.0.250

該当なし

172.20.0.30 - 172.20.0.70

172.20.0.10 - 172.20.0.20

次の表は、ゾーンおよびラックごとに異なる IP アドレスを持つ eth2eth3 を使用してファブリックへの接続を確立するネットワークと、トラフィックのソースとして使用されるグローバル bgpmainnet を示しています。

Expand
表8.2 ゾーン接続
ネットワーク名Zone 0Zone 1Zone 2

BGP Net1 (eth2)

100.64.0.0/24

100.64.1.0

100.64.2.0

BGP Net2 (eth3)

100.65.0.0/24

100.65.1.0/24

100.65.2.0

Bgpmainnet (loopback)

99.99.0.0/24

99.99.1.0/24

99.99.2.0/24

8.2. NFV の NIC 設定

データプレーンをホストする Red Hat OpenStack Services on OpenShift (RHOSO) ノードに、次のいずれかの NIC 設定が必要です。

  • シングル NIC 設定: ネイティブ VLAN 上のプロビジョニングネットワークと、データプレーンネットワークの種別ごとのサブネットを使用するタグ付けされた VLAN 用に NIC を 1 つ。
  • デュアル NIC 設定: プロビジョニングネットワーク用の NIC を 1 つと、外部ネットワーク用の NIC を 1 つ。
  • デュアル NIC 設定: ネイティブ VLAN 上のプロビジョニングネットワーク用の NIC を 1 つと、データプレーンネットワークの種別ごとのサブネットを使用するタグ付けされた VLAN 用の NIC を 1 つ。
  • 複数 NIC 設定 - 各 NIC は、データプレーンネットワークの種別ごとのサブセットを使用します。

8.3. RHOSO ネットワーク用の RHOCP の準備

Red Hat OpenStack Services on OpenShift (RHOSO) サービスは、Red Hat OpenShift Container Platform (RHOCP) のワークロードとして実行されます。RHOSO 環境では、分離されたネットワークを使用してさまざまな種類のネットワークトラフィックを分けて、セキュリティー、パフォーマンス、管理を向上させます。RHOCP ワーカーノードを分離されたネットワークに接続し、分離されたネットワーク上の内部サービスエンドポイントを公開する必要があります。パブリックエンドポイントではルートのみがサポートされているため、パブリックサービスエンドポイントはデフォルトで RHOCP ルートとして公開されます。

重要

ネットワークマニフェストはコントロールプレーンインターフェイス名を直接参照するため、コントロールプレーンインターフェイス名はすべてのノード間で一貫している必要があります。コントロールプレーンインターフェイス名が一致していない場合、RHOSO 環境のデプロイは失敗します。ノード上で物理インターフェイス名が一貫していない場合は、他のネットワークマニフェストから参照できる物理インターフェイスの一貫した代替名を設定する Linux ボンディングを作成する必要があります。

注記

次の手順の例では、IPv4 アドレスを使用します。IPv4 アドレスの代わりに IPv6 アドレスを使用できます。デュアルスタック (IPv4 と IPv6) は、プロジェクト (テナント) ネットワークでのみ利用できます。IPv6 アドレスの設定方法は、RHOCP ネットワーク ガイドの次のリソースを参照してください。

8.3.1. 分離されたネットワークインターフェイスを備えた RHOCP の準備

NMState Operator を使用して、RHOCP ワーカーノードを分離されたネットワークに接続します。NodeNetworkConfigurationPolicy (nncp) CR を作成して、RHOCP クラスター内の各ワーカーノード上の各分離ネットワークのインターフェイスを設定します。

手順

  1. ワークステーションに NodeNetworkConfigurationPolicy (nncp) CR ファイル (例: openstack-nncp.yaml) を作成します。
  2. RHOCP クラスター内のワーカーノードの名前を取得します。

    $ oc get nodes -l node-role.kubernetes.io/worker -o jsonpath="{.items[*].metadata.name}"
  3. ネットワーク設定を確認します。

    $ oc get nns/<worker_node> -o yaml | more
    • <worker_node> は、手順 2 で取得したワーカーノードの名前 (例: worker-1) に置き換えます。各ワーカーノードに対してこの手順を繰り返します。
  4. nncp CR ファイルで、RHOCP クラスター内の各ワーカーノードの分離ネットワークそれぞれのインターフェイスを設定します。ネットワーク分離を設定する必要があるデフォルトの物理データセンターネットワークの詳細は、デフォルトの Red Hat OpenStack Services on OpenShift ネットワーク を参照してください。

    次の例では、nncp CR は、ワーカーノード 1 (osp-enp6s0-worker-1) の enp6s0 インターフェイスを設定して、ネットワーク分離のために IPv4 アドレスを持つ VLAN インターフェイスを使用します。

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: osp-enp6s0-worker-1
    spec:
      desiredState:
        interfaces:
        - description: internalapi vlan interface
          ipv4:
            address:
            - ip: 172.17.0.10
              prefix-length: 24
            enabled: true
            dhcp: false
          ipv6:
            enabled: false
          name: internalapi
          state: up
          type: vlan
          vlan:
            base-iface: enp6s0
            id: 20
            reorder-headers: true
        - description: storage vlan interface
          ipv4:
            address:
            - ip: 172.18.0.10
              prefix-length: 24
            enabled: true
            dhcp: false
          ipv6:
            enabled: false
          name: storage
          state: up
          type: vlan
          vlan:
            base-iface: enp6s0
            id: 21
            reorder-headers: true
        - description: tenant vlan interface
          ipv4:
            address:
            - ip: 172.19.0.10
              prefix-length: 24
            enabled: true
            dhcp: false
          ipv6:
            enabled: false
          name: tenant
          state: up
          type: vlan
          vlan:
            base-iface: enp6s0
            id: 22
            reorder-headers: true
        - description: Configuring enp6s0
          ipv4:
            address:
            - ip: 192.168.122.10
              prefix-length: 24
            enabled: true
            dhcp: false
          ipv6:
            enabled: false
          mtu: 1500
          name: enp6s0
          state: up
          type: ethernet
        - description: octavia vlan interface
          name: octavia
          state: up
          type: vlan
          vlan:
            base-iface: enp6s0
            id: 24
            reorder-headers: true
        - bridge:
            options:
              stp:
                enabled: false
            port:
            - name: enp6s0.24
          description: Configuring bridge octbr
          mtu: 1500
          name: octbr
          state: up
          type: linux-bridge
        - description: designate vlan interface
          ipv4:
            address:
            - ip: 172.26.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1500
          name: designate
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "25"
            reorder-headers: true
        - description: designate external vlan interface
          ipv4:
            address:
            - ip: 172.34.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1500
          name: designateext
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "26"
            reorder-headers: true
      nodeSelector:
        kubernetes.io/hostname: worker-1
        node-role.kubernetes.io/worker: ""
  5. クラスターに nncp CR を作成します。

    $ oc apply -f openstack-nncp.yaml
  6. nncp CR が作成されたことを確認します。

    $ oc get nncp -w
    NAME                        STATUS        REASON
    osp-enp6s0-worker-1   Progressing   ConfigurationProgressing
    osp-enp6s0-worker-1   Progressing   ConfigurationProgressing
    osp-enp6s0-worker-1   Available     SuccessfullyConfigured

8.3.2. 分離されたネットワークにサービス Pod を接続する

サービス Pod をネットワークに接続するために、分離されたネットワークごとに NetworkAttachmentDefinition (net-attach-def) カスタムリソース (CR) を作成します。

手順

  1. ワークステーションに NetworkAttachmentDefinition (net-attach-def) CR ファイル (例: openstack-net-attach-def.yaml) を作成します。
  2. NetworkAttachmentDefinition CR ファイルで、各分離ネットワークの NetworkAttachmentDefinition リソースを設定して、サービスデプロイメント Pod をネットワークに割り当てます。次の例では、次のネットワークの NetworkAttachmentDefinition リソースを作成します。

    • macvlan タイプの internalapistoragectlplane、および tenant ネットワーク。
    • bridge タイプの負荷分散管理ネットワークである octaviaこのネットワークアタッチメントは、ロードバランサー仮想マシン (amphorae) を管理する Pod と、OVN Operator によって管理される Open vSwitch Pod を接続します。
    • DNS サービス (designate) が、DNS サーバーを管理するために内部で使用する designate ネットワーク
    • designateext ネットワークは、DNS サービスリゾルバーと DNS サーバーへの外部アクセスを提供するために使用されます。
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: internalapi
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "internalapi",
          "type": "macvlan",
          "master": "internalapi",
          "ipam": {
            "type": "whereabouts",
            "range": "172.17.0.0/24",
            "range_start": "172.17.0.30",
            "range_end": "172.17.0.70"
          }
        }
    ---
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: ctlplane
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "ctlplane",
          "type": "macvlan",
          "master": "enp6s0",
          "ipam": {
            "type": "whereabouts",
            "range": "192.168.122.0/24",
            "range_start": "192.168.122.30",
            "range_end": "192.168.122.70"
          }
        }
    ---
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: storage
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "storage",
          "type": "macvlan",
          "master": "storage",
          "ipam": {
            "type": "whereabouts",
            "range": "172.18.0.0/24",
            "range_start": "172.18.0.30",
            "range_end": "172.18.0.70"
          }
        }
    ---
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: tenant
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "tenant",
          "type": "macvlan",
          "master": "tenant",
          "ipam": {
            "type": "whereabouts",
            "range": "172.19.0.0/24",
            "range_start": "172.19.0.30",
            "range_end": "172.19.0.70"
          }
        }
    ---
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      labels:
        osp/net: octavia
      name: octavia
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "octavia",
          "type": "bridge",
          "bridge": "octbr",
          "ipam": {
            "type": "whereabouts",
            "range": "172.23.0.0/24",
            "range_start": "172.23.0.30",
            "range_end": "172.23.0.70",
            "routes": [
               {
                 "dst": "172.24.0.0/16",
                 "gw" : "172.23.0.150"
               }
             ]
          }
        }
    ---
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: designate
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "designate",
          "type": "macvlan",
          "master": "designate",
          "ipam": {
            "type": "whereabouts",
            "range": "172.26.0.0/16",
            "range_start": "172.26.0.30",
            "range_end": "172.26.0.70",
          }
        }
    ---
    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      name: designateext
      namespace: openstack
    spec:
      config: |
        {
          "cniVersion": "0.3.1",
          "name": "designateext",
          "type": "macvlan",
          "master": "designateext",
          "ipam": {
            "type": "whereabouts",
            "range": "172.34.0.0/16",
            "range_start": "172.34.0.30",
            "range_end": "172.34.0.70",
          }
        }
    • metadata.namespace: サービスがデプロイされる namespace。
    • "master": nncp CR で定義されている、ネットワークに関連付けられたノードインターフェイス名。
    • "ipam": whereabouts CNI IPAM プラグインは、作成された Pod に .30 - .70 の範囲の IP を割り当てます。
    • "range_start" - "range_end": IP アドレスプールの範囲が、MetalLB IPAddressPool の範囲および NetConfig allocationRange と重複しないようにしてください。
  3. クラスターに NetworkAttachmentDefinition CR を作成します。

    $ oc apply -f openstack-net-attach-def.yaml
  4. NetworkAttachmentDefinition CR が作成されたことを確認します。

    $ oc get net-attach-def -n openstack

8.3.3. RHOSO ネットワーク VIPS 用の RHOCP の準備

MetalLB Operator を使用して、分離ネットワーク上の内部サービスエンドポイントを公開します。仮想 IP (VIP) のアナウンス方法を定義するには L2Advertisement リソースを作成し、VIP として使用できる IP を設定するには IPAddressPool リソースを作成する必要があります。レイヤー 2 モードでは、1 つのノードがローカルネットワークにサービスをアドバタイズする役割を担います。

手順

  1. ワークステーションに IPAddressPool CR ファイル (例: openstack-ipaddresspools.yaml) を作成します。
  2. IPAddressPool CR ファイルで、分離ネットワークの IPAddressPool リソースを設定して、MetalLB に権限を与える IP アドレスの範囲を指定します。

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      namespace: metallb-system
      name: ctlplane
    spec:
      addresses:
        - 192.168.122.80-192.168.122.90
      autoAssign: true
      avoidBuggyIPs: false
    ---
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: internalapi
      namespace: metallb-system
    spec:
      addresses:
        - 172.17.0.80-172.17.0.90
      autoAssign: true
      avoidBuggyIPs: false
    ---
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      namespace: metallb-system
      name: storage
    spec:
      addresses:
        - 172.18.0.80-172.18.0.90
      autoAssign: true
      avoidBuggyIPs: false
    ---
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      namespace: metallb-system
      name: tenant
    spec:
      addresses:
        - 172.19.0.80-172.19.0.90
      autoAssign: true
      avoidBuggyIPs: false
    ---
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      namespace: metallb-system
      name: designateext
    spec:
      addresses:
        - 172.34.0.80-172.34.0.120
      autoAssign: true
      avoidBuggyIPs: false
    ---
    • spec.addresses: IPAddressPool の範囲が、whereabouts IPAM の範囲および NetConfig allocationRange と重複しないようにしてください。

    その他の IPAddressPool リソースパラメーターを設定する方法は、RHOCP ネットワーク ガイドの MetalLB アドレスプールの設定 を参照してください。

  3. クラスターに IPAddressPool CR を作成します。

    $ oc apply -f openstack-ipaddresspools.yaml
  4. IPAddressPool CR が作成されたことを確認します。

    $ oc describe -n metallb-system IPAddressPool
  5. ワークステーションに L2Advertisement CR ファイル (例: openstack-l2advertisement.yaml) を作成します。
  6. L2Advertisement CR ファイルで、L2Advertisement CR を設定して、どのノードがローカルネットワークにサービスをアドバタイズするかを定義します。各ネットワークに 1 つの L2Advertisement リソースを作成します。

    次の例の各 L2Advertisement CR では、ネットワークアドレスプールから要求された VIP が VLAN に割り当てられているインターフェイスで通知されるように指定しています。

    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: ctlplane
      namespace: metallb-system
    spec:
      ipAddressPools:
      - ctlplane
      interfaces:
      - enp6s0
      nodeSelectors:
      - matchLabels:
          node-role.kubernetes.io/worker: ""
    ---
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: internalapi
      namespace: metallb-system
    spec:
      ipAddressPools:
      - internalapi
      interfaces:
      - internalapi
      nodeSelectors:
      - matchLabels:
          node-role.kubernetes.io/worker: ""
    ---
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: storage
      namespace: metallb-system
    spec:
      ipAddressPools:
      - storage
      interfaces:
      - storage
      nodeSelectors:
      - matchLabels:
          node-role.kubernetes.io/worker: ""
    ---
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: tenant
      namespace: metallb-system
    spec:
      ipAddressPools:
      - tenant
      interfaces:
      - tenant
      nodeSelectors:
      - matchLabels:
          node-role.kubernetes.io/worker: ""
    ---
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: designateext
      namespace: metallb-system
    spec:
      ipAddressPools:
      - designateext
      interfaces:
      - designateext
      nodeSelectors:
      - matchLabels:
          node-role.kubernetes.io/worker: ""
    • spec.interfaces: VLAN アドレスプールから要求された VIP が通知されるインターフェイス。

    その他の L2Advertisement リソースパラメーターを設定する方法は、RHOCP ネットワーク ガイドの L2 アドバタイズメントとラベルを使用した MetalLB の設定 を参照してください。

  7. クラスターに L2Advertisement CR を作成します。

    $ oc apply -f openstack-l2advertisement.yaml
  8. L2Advertisement CR が作成されたことを確認します。

    $ oc get -n metallb-system L2Advertisement
    NAME          IPADDRESSPOOLS    IPADDRESSPOOL SELECTORS   INTERFACES
    ctlplane      ["ctlplane"]                                ["enp6s0"]
    designateext  ["designateext"]                            ["designateext"]
    internalapi   ["internalapi"]                             ["internalapi"]
    storage       ["storage"]                                 ["storage"]
    tenant        ["tenant"]                                  ["tenant"]
  9. クラスターにネットワークバックエンドとして OVNKubernetes がある場合は、MetalLB がセカンダリーネットワークインターフェイスで動作できるように、グローバル転送を有効にする必要があります。

    1. クラスターが使用するネットワークバックエンドを確認します。

      $ oc get network.operator cluster --output=jsonpath='{.spec.defaultNetwork.type}'
    2. バックエンドが OVNKubernetes の場合は、次のコマンドを実行してグローバル IP 転送を有効にします。

      $ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge

8.4. データプレーンネットワークの作成

データプレーンネットワークを作成するには、NetConfig カスタムリソース (CR) を定義し、データプレーンネットワークのすべてのサブネットを指定します。データプレーン用に少なくとも 1 つのコントロールプレーンネットワークを定義する必要があります。また、VLAN ネットワークを定義して、InternalAPIStorageExternal などのコンポーザブルネットワークのネットワーク分離を作成することもできます。各ネットワーク定義には IP アドレスの割り当てを含める必要があります。

ヒント

NetConfig CRD 定義と仕様スキーマを表示するには、次のコマンドを使用します。

$ oc describe crd netconfig

$ oc explain netconfig.spec

手順

  1. ワークステーションに openstack_netconfig.yaml という名前のファイルを作成します。
  2. openstack_netconfig.yaml に次の設定を追加して、NetConfig CR を作成します。

    apiVersion: network.openstack.org/v1beta1
    kind: NetConfig
    metadata:
      name: openstacknetconfig
      namespace: openstack
  3. openstack_netconfig.yaml ファイルで、各データプレーンネットワークのトポロジーを定義します。デフォルトの Red Hat OpenStack Services on OpenShift (RHOSO) ネットワークを使用するには、各ネットワークの仕様を定義する必要があります。デフォルトの RHOSO ネットワークの詳細は、デフォルトの Red Hat OpenStack Services on OpenShift ネットワーク を参照してください。次の例では、データプレーン用の分離ネットワークを作成します。

    spec:
      networks:
      - name: CtlPlane
        dnsDomain: ctlplane.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 192.168.122.120
            start: 192.168.122.100
          - end: 192.168.122.200
            start: 192.168.122.150
          cidr: 192.168.122.0/24
          gateway: 192.168.122.1
      - name: InternalApi
        dnsDomain: internalapi.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.17.0.250
            start: 172.17.0.100
          excludeAddresses:
          - 172.17.0.10
          - 172.17.0.12
          cidr: 172.17.0.0/24
          vlan: 20
      - name: External
        dnsDomain: external.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 10.0.0.250
            start: 10.0.0.100
          cidr: 10.0.0.0/24
          gateway: 10.0.0.1
      - name: Storage
        dnsDomain: storage.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.18.0.250
            start: 172.18.0.100
          cidr: 172.18.0.0/24
          vlan: 21
      - name: Tenant
        dnsDomain: tenant.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.19.0.250
            start: 172.19.0.100
          cidr: 172.19.0.0/24
          vlan: 22
    • spec.networks.name: ネットワークの名前 (例: CtlPlane)。
    • spec.networks.subnets: IPv4 サブネット仕様。
    • spec.networks.subnets.name: サブネットの名前 (例: subnet1)。
    • spec.networks.subnets.allocationRanges: NetConfig allocationRangeallocationRange が、MetalLB IPAddressPool の範囲および IP アドレスプール範囲と重複しないようにしてください。
    • spec.networks.subnets.excludeAddresses: オプション: データプレーンノードで使用してはならない割り当て範囲の IP アドレスのリスト。
    • spec.networks.subnets.vlan: ネットワーク VLAN。デフォルトの RHOSO ネットワークの詳細は、デフォルトの Red Hat OpenStack Services on OpenShift ネットワーク を参照してください。
  4. openstack_netconfig.yaml 定義ファイルを保存します。
  5. データプレーンネットワークを作成します。

    $ oc create -f openstack_netconfig.yaml -n openstack
  6. データプレーンネットワークが作成されたことを確認するために、openstacknetconfig リソースを表示します。

    $ oc get netconfig/openstacknetconfig -n openstack

    エラーが表示された場合は、基礎となる network-attach-definition とノードのネットワーク設定ポリシーを確認してください。

    $ oc get network-attachment-definitions -n openstack
    $ oc get nncp

第9章 NFV 環境のコントロールプレーンの作成

Red Hat OpenStack Services on OpenShift (RHOSO) コントロールプレーンには、クラウドを管理する RHOSO サービスが含まれています。これらのコントロールプレーンサービスは、API を提供するサービスであり、Compute ノードのワークロードを実行するものではありません。RHOSO のコントロールプレーンサービスは、Red Hat OpenShift Container Platform (RHOCP) のワークロードとして実行され、OpenShift の Operator を使用してデプロイします。これらの OpenStack コントロールプレーンサービスを設定するときは、OpenStackControlPlane と呼ばれる 1 つのカスタムリソース (CR) 定義を使用します。

注記

コントロールプレーンを作成すると、OpenStackClient Pod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。

$ oc rsh -n openstack openstackclient

9.1. 前提条件

  • RHOCP クラスターが RHOSO ネットワーク分離用に準備されている。詳細は、RHOSO ネットワーク用の RHOCP の準備 を参照してください。
  • OpenStack Operator (openstack-operator) がインストールされている。詳細は、Operator のインストールと準備 を参照してください。
  • RHOCP クラスターに、openstack-operators namespace とコントロールプレーンの namespace (デフォルトは openstack) 間の通信を妨げるネットワークポリシーが設定されていない。クラスターの既存のネットワークポリシーを確認するには、次のコマンドを使用します。

    $ oc get networkpolicy -n openstack
  • cluster-admin 権限を持つユーザーとして、RHOCP クラスターにアクセスできるワークステーションにログオンしている。

9.2. コントロールプレーンの作成

OpenStackControlPlane カスタムリソース (CR) を定義して、次のタスクを実行します。

  • コントロールプレーンを作成します。
  • Red Hat OpenStack Services on OpenShift (RHOSO) サービスを有効にします。

次の手順では、各サービスのサンプル設定を使用して初期コントロールプレーンを作成します。この手順は、動作するコントロールプレーン環境の作成に役立ちます。この環境を使用して問題をテストし、トラブルシューティングを行ってから、必要なサービスのカスタマイズを追加できます。最初のデプロイ後に、サービスを追加およびカスタマイズできます。

サービスを設定するには、サービス仕様の CustomServiceConfig フィールドを使用して、OpenStack 設定パラメーターを INI ファイル形式で渡します。使用可能な設定パラメーターの詳細は、設定リファレンス を参照してください。

デプロイ後にコントロールプレーンをカスタマイズする方法の詳細は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ ガイドを参照してください。

詳細は、OpenStackControlPlane CR の例 を参照してください。

ヒント

OpenStackControlPlane CRD 定義と仕様スキーマを表示するには、次のコマンドを使用します。

$ oc describe crd openstackcontrolplane

$ oc explain openstackcontrolplane.spec

NFV 環境の場合、Networking サービス (neutron) および OVN サービス設定を追加するときに、次の情報を指定する必要があります。

  • ゲートウェイが配置されている物理ネットワーク
  • vhost ソケットへのパス
  • VLAN の範囲
  • NUMA ノードの数
  • ゲートウェイネットワークに接続する NIC
注記

SR-IOV を使用する場合は、ネットワークサービス設定に sriovnicswitch メカニズムドライバーも追加する必要があります。

手順

  1. デプロイする RHOSO 環境用の openstack プロジェクトを作成します。

    $ oc new-project openstack
  2. OpenStack Operator による特権 Pod の作成を有効にするために、openstack namespace にラベルが付いていることを確認します。

    $ oc get namespace openstack -ojsonpath='{.metadata.labels}' | jq
    {
      "kubernetes.io/metadata.name": "openstack",
      "pod-security.kubernetes.io/enforce": "privileged",
      "security.openshift.io/scc.podSecurityLabelSync": "false"
    }

    Security Context Constraint (SCC) が "privileged" でない場合は、次のコマンドを使用して変更します。

    $ oc label ns openstack security.openshift.io/scc.podSecurityLabelSync=false --overwrite
    $ oc label ns openstack pod-security.kubernetes.io/enforce=privileged --overwrite
  3. ワークステーションに openstack_control_plane.yaml という名前のファイルを作成して、OpenStackControlPlane CR を定義します。

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
      namespace: openstack
  4. Red Hat OpenStack Services on OpenShift へのセキュアなアクセスの提供 で、RHOSO サービス Pod へのセキュアなアクセスを提供するために作成した Secret CR を指定します。

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
    spec:
      secret: osp-secret
  5. Red Hat OpenShift Container Platform (RHOCP) クラスターストレージバックエンド用に作成した storageClass を指定します。

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
    spec:
      secret: osp-secret
      storageClass: your-RHOCP-storage-class
    注記

    ストレージクラスの詳細は、ストレージクラスの作成 を参照してください。

  6. 次のサービス設定を追加します。

    • Block Storage サービス (cinder):

        cinder:
          apiOverride:
            route: {}
          template:
            databaseInstance: openstack
            secret: osp-secret
            cinderAPI:
              replicas: 3
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
            cinderScheduler:
              replicas: 1
            cinderBackup:
              networkAttachments:
              - storage
              replicas: 0 # backend needs to be configured to activate the service
            cinderVolumes:
              volume1:
                networkAttachments:
                - storage
                replicas: 0 # backend needs to be configured to activate the service
      重要

      この Block Storage サービスの定義はサンプルです。場合によっては、実際の NFV 環境に合わせて変更する必要があります。詳細は、デプロイメントのプランニングストレージと共有ファイルシステムのプランニング を参照してください。

      注記

      コントロールプレーンの最初のデプロイでは、cinderBackup および cinderVolumes サービスがデプロイされますが、アクティブ化はされません (replicas: 0)。デプロイ後に、Block Storage サービスとバックアップサービスのバックエンドを使用してコントロールプレーンを設定できます。

    • Compute サービス (nova):

        nova:
          apiOverride:
            route: {}
          template:
            apiServiceTemplate:
              replicas: 3
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
            schedulerServiceTemplate:
              customServiceConfig: |
                [filter_scheduler]
                enabled_filters = AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter, PciPassthroughFilter, AggregateInstanceExtraSpecsFilter
                available_filters = nova.scheduler.filters.all_filters
            metadataServiceTemplate:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            schedulerServiceTemplate:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            cellTemplates:
              cell1:
                noVNCProxyServiceTemplate:
                  enabled: true
                  networkAttachments:
                  - ctlplane
            secret: osp-secret
      注記

      デフォルトでは、各デフォルトセル (cell0 および cell1) に対して、Compute サービス (nova) の完全なセット (nova-apinova-metadatanova-schedulernova-conductor) がデプロイされます。novncproxy サービスも、デフォルトで cell1 に対して有効になります。

    • データプレーンの DNS サービス:

        dns:
          template:
            options: 
      1
      
            - key: server 
      2
      
              values: 
      3
      
              - 192.168.122.1
            - key: server
              values:
              - 192.168.122.2
            override:
              service:
                metadata:
                  annotations:
                    metallb.universe.tf/address-pool: ctlplane
                    metallb.universe.tf/allow-shared-ip: ctlplane
                    metallb.universe.tf/loadBalancerIPs: 192.168.122.80
                spec:
                  type: LoadBalancer
            replicas: 2
      1
      キーと値のペアを使用して、各 DNS サーバーに必要な dnsmasq インスタンスを定義します。この例では、要求を転送するように設定された DNS サーバーが 2 つあるため、2 つのキーと値のペアが定義されています。
      2
      デプロイする dnsmasq インスタンスをカスタマイズするための dnsmasq パラメーターを指定します。以下の有効な値のいずれかに設定します。
      • server
      • rev-server
      • srv-host
      • txt-record
      • ptr-record
      • rebind-domain-ok
      • naptr-record
      • cname
      • host-record
      • caa-record
      • dns-rr
      • auth-zone
      • synth-domain
      • no-negcache
      • local
      3
      dnsmasq パラメーターの値を指定します。値として、汎用 DNS サーバー (例: 1.1.1.1) または特定のドメインの DNS サーバー (例: /google.com/8.8.8.8) を指定できます。
    • すべての RHOSO サービスで使用するための Galera クラスター (openstack) と、cell1 の Compute サービスで使用するための Galera クラスター (openstack-cell1)。

        galera:
          templates:
            openstack:
              storageRequest: 5000M
              secret: osp-secret
              replicas: 3
            openstack-cell1:
              storageRequest: 5000M
              secret: osp-secret
              replicas: 3
    • Identity サービス (keystone)

        keystone:
          apiOverride:
            route: {}
          template:
            override:
              service:
                internal:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            secret: osp-secret
            replicas: 3
    • Image サービス (glance):

        glance:
          apiOverrides:
            default:
              route: {}
          template:
            databaseInstance: openstack
            storage:
              storageRequest: 10G
            secret: osp-secret
            keystoneEndpoint: default
            glanceAPIs:
              default:
                replicas: 0 # backend needs to be configured to activate the service
                override:
                  service:
                    internal:
                      metadata:
                        annotations:
                          metallb.universe.tf/address-pool: internalapi
                          metallb.universe.tf/allow-shared-ip: internalapi
                          metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                      spec:
                        type: LoadBalancer
                networkAttachments:
                - storage
      注記

      コントロールプレーンの最初のデプロイでは、Image サービスがデプロイされますが、アクティブ化はされません (replicas: 0)。デプロイ後に、Image サービスのバックエンドを使用してコントロールプレーンを設定できます。

    • Key Management サービス (barbican):

        barbican:
          apiOverride:
            route: {}
          template:
            databaseInstance: openstack
            secret: osp-secret
            barbicanAPI:
              replicas: 3
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
            barbicanWorker:
              replicas: 3
            barbicanKeystoneListener:
              replicas: 1
    • Memcached:

        memcached:
          templates:
            memcached:
               replicas: 3
    • Networking サービス (neutron):

        neutron:
          apiOverride:
            route: {}
          template:
            replicas: 3
            override:
              service:
                internal:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            secret: osp-secret
            networkAttachments:
            - internalapi
            customServiceConfig: |
              [DEFAULT]
              global_physnet_mtu = 9000
              [ml2]
              mechanism_drivers = ovn
              [ovn]
              vhost_sock_dir = <path>
              [ml2_type_vlan]
              network_vlan_ranges = <network_name1>:<VLAN-ID1>:<VLAN-ID2>,<network_name2>:<VLAN-ID1>:<VLAN-ID2>
      • SR-IOV を使用する場合は、sriovnicswitch メカニズムドライバーも追加する必要があります (例: mechanism_drivers = ovn,sriovnicswitch)。
      • & lt;path& gt; は、vhost ソケットへの絶対パス(例: /var/lib/vhost_sockets )に置き換えます。
      • <network_name1><network_name2> は、ゲートウェイが存在する物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワーク provider:*name フィールドで設定します。)
      • <VLAN-ID1> と `<VLAN-ID2>` を、使用している VLAN ID に置き換えます。
    • Object Storage サービス (swift):

        swift:
          enabled: true
          proxyOverride:
            route: {}
          template:
            swiftProxy:
              networkAttachments:
              - storage
              override:
                service:
                  internal:
                    metadata:
                      annotations:
                        metallb.universe.tf/address-pool: internalapi
                        metallb.universe.tf/allow-shared-ip: internalapi
                        metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                    spec:
                      type: LoadBalancer
              replicas: 2
            swiftRing:
              ringReplicas: 3
            swiftStorage:
              networkAttachments:
              - storage
              replicas: 3
              storageClass: local-storage
              storageRequest: 100Gi
    • OVN:

        ovn:
          template:
            ovnDBCluster:
              ovndbcluster-nb:
                replicas: 3
                dbType: NB
                storageRequest: 10G
                networkAttachment: internalapi
              ovndbcluster-sb:
                replicas: 3
                dbType: SB
                storageRequest: 10G
                networkAttachment: internalapi
            ovnNorthd: {}
            ovnController:
              networkAttachment: tenant
              nicMappings:
                <network_name>: <nic_name>
      • <network_name> は、ゲートウェイが存在する物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワーク provider:*name フィールドで設定します。)
      • <nic_name> は、ゲートウェイネットワークに接続する NIC の名前に置き換えます。
      • オプション: 必要に応じて、nicMappings の下に追加の <network_name>:<nic_name> ペアを追加します。
    • Placement サービス (placement):

        placement:
          apiOverride:
            route: {}
          template:
            override:
              service:
                internal:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/allow-shared-ip: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            replicas: 3
            secret: osp-secret
    • RabbitMQ:

        rabbitmq:
          templates:
            rabbitmq:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.85
                  spec:
                    type: LoadBalancer
            rabbitmq-cell1:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.86
                  spec:
                    type: LoadBalancer
    • Telemetry サービス (ceilometer、prometheus):

        telemetry:
          enabled: true
          template:
            metricStorage:
              enabled: true
              monitoringStack:
                alertingEnabled: true
                scrapeInterval: 30s
                storage:
                  strategy: persistent
                  retention: 24h
                  persistent:
                    pvcStorageRequest: 20G
            autoscaling: 
      1
      
              enabled: false
              aodh:
                passwordSelectors:
                databaseAccount: aodh
                databaseInstance: openstack
                memcachedInstance: memcached
                secret: osp-secret
              heatInstance: heat
            ceilometer:
              enabled: true
              secret: osp-secret
            logging:
              enabled: false
      1
      自動スケーリングが無効になっている場合でも、autoscaling フィールドが存在している必要があります。
  7. コントロールプレーンを作成します。

    $ oc create -f openstack_control_plane.yaml -n openstack
    注記

    コントロールプレーンを作成すると、OpenStackClient Pod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。

    $ oc rsh -n openstack openstackclient
  8. RHOCP が OpenStackControlPlane CR に関連するリソースを作成するまで待機します。コントロールプレーンのデプロイのステータスを確認します。

    $ oc get openstackcontrolplane -n openstack
    出力例
    NAME                      STATUS    MESSAGE
    openstack-control-plane   Unknown   Setup started

    ステータスが "Setup complete" であれば、OpenStackControlPlane リソースが作成されています。

    ヒント

    デプロイの進行状況を追跡するには、get コマンドの末尾に -w オプションを追加します。

    注記

    コントロールプレーンを作成すると、OpenStackClient Pod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。

    $ oc rsh -n openstack openstackclient
  9. オプション: openstack namespace 内の Pod を確認して、コントロールプレーンがデプロイされていることを確認します。

    $ oc get pods -n openstack

    すべての Pod が完了または実行中の状態であれば、コントロールプレーンがデプロイされています。

検証

  1. OpenStackClient Pod へのリモートシェル接続を開きます。

    $ oc rsh -n openstack openstackclient
  2. 内部サービスエンドポイントが各サービスに登録されていることを確認します。

    $ openstack endpoint list -c 'Service Name' -c Interface -c URL --service glance
    出力例
    +--------------+-----------+---------------------------------------------------------------+
    | Service Name | Interface | URL                                                           |
    +--------------+-----------+---------------------------------------------------------------+
    | glance       | internal  | http://glance-internal.openstack.svc:9292                     |
    | glance       | public    | http://glance-public-openstack.apps.ostest.test.metalkube.org |
    +--------------+-----------+---------------------------------------------------------------+
  3. OpenStackClient Pod を終了します。

    $ exit

9.3. OpenStackControlPlane CR の例

次の OpenStackControlPlane CR の例は、完全なコントロールプレーン設定です。正常なデプロイのために必ず有効にする必要がある、すべての重要なサービスが含まれています。

apiVersion: core.openstack.org/v1beta1
kind: OpenStackControlPlane
metadata:
  name: openstack-control-plane
  namespace: openstack
spec:
  secret: osp-secret
  storageClass: your-RHOCP-storage-class
  cinder:
    apiOverride:
      route: {}
    template:
      databaseInstance: openstack
      secret: osp-secret
      cinderAPI:
        replicas: 3
        override:
          service:
            internal:
              metadata:
                annotations:
                  metallb.universe.tf/address-pool: internalapi
                  metallb.universe.tf/allow-shared-ip: internalapi
                  metallb.universe.tf/loadBalancerIPs: 172.17.0.80
              spec:
                type: LoadBalancer
      cinderScheduler:
        replicas: 1
      cinderBackup:
        networkAttachments:
        - storage
        replicas: 0 # backend needs to be configured to activate the service
      cinderVolumes:
        volume1:
          networkAttachments:
          - storage
          replicas: 0 # backend needs to be configured to activate the service
  nova:
    apiOverride:
      route: {}
    template:
      apiServiceTemplate:
        replicas: 3
        override:
          service:
            internal:
              metadata:
                annotations:
                  metallb.universe.tf/address-pool: internalapi
                  metallb.universe.tf/allow-shared-ip: internalapi
                  metallb.universe.tf/loadBalancerIPs: 172.17.0.80
              spec:
                type: LoadBalancer
      metadataServiceTemplate:
        replicas: 3
        override:
          service:
            metadata:
              annotations:
                metallb.universe.tf/address-pool: internalapi
                metallb.universe.tf/allow-shared-ip: internalapi
                metallb.universe.tf/loadBalancerIPs: 172.17.0.80
            spec:
              type: LoadBalancer
      schedulerServiceTemplate:
        replicas: 3
      cellTemplates:
        cell0:
          cellDatabaseAccount: nova-cell0
          cellDatabaseInstance: openstack
          cellMessageBusInstance: rabbitmq
          hasAPIAccess: true
        cell1:
          cellDatabaseAccount: nova-cell1
          cellDatabaseInstance: openstack-cell1
          cellMessageBusInstance: rabbitmq-cell1
          noVNCProxyServiceTemplate:
            enabled: true
            networkAttachments:
            - ctlplane
          hasAPIAccess: true
      secret: osp-secret
  dns:
    template:
      options:
      - key: server
        values:
        - 192.168.122.1
      - key: server
        values:
        - 192.168.122.2
      override:
        service:
          metadata:
            annotations:
              metallb.universe.tf/address-pool: ctlplane
              metallb.universe.tf/allow-shared-ip: ctlplane
              metallb.universe.tf/loadBalancerIPs: 192.168.122.80
          spec:
            type: LoadBalancer
      replicas: 2
  galera:
    templates:
      openstack:
        storageRequest: 5000M
        secret: osp-secret
        replicas: 3
      openstack-cell1:
        storageRequest: 5000M
        secret: osp-secret
        replicas: 3
  keystone:
    apiOverride:
      route: {}
    template:
      override:
        service:
          internal:
            metadata:
              annotations:
                metallb.universe.tf/address-pool: internalapi
                metallb.universe.tf/allow-shared-ip: internalapi
                metallb.universe.tf/loadBalancerIPs: 172.17.0.80
            spec:
              type: LoadBalancer
      databaseInstance: openstack
      secret: osp-secret
      replicas: 3
  glance:
    apiOverrides:
      default:
        route: {}
    template:
      databaseInstance: openstack
      storage:
        storageRequest: 10G
      secret: osp-secret
      keystoneEndpoint: default
      glanceAPIs:
        default:
          replicas: 0 # Configure back end; set to 3 when deploying service
          override:
            service:
              internal:
                metadata:
                  annotations:
                    metallb.universe.tf/address-pool: internalapi
                    metallb.universe.tf/allow-shared-ip: internalapi
                    metallb.universe.tf/loadBalancerIPs: 172.17.0.80
                spec:
                  type: LoadBalancer
          networkAttachments:
          - storage
  barbican:
    apiOverride:
      route: {}
    template:
      databaseInstance: openstack
      secret: osp-secret
      barbicanAPI:
        replicas: 3
        override:
          service:
            internal:
              metadata:
                annotations:
                  metallb.universe.tf/address-pool: internalapi
                  metallb.universe.tf/allow-shared-ip: internalapi
                  metallb.universe.tf/loadBalancerIPs: 172.17.0.80
              spec:
                type: LoadBalancer
      barbicanWorker:
        replicas: 3
      barbicanKeystoneListener:
        replicas: 1
  memcached:
    templates:
      memcached:
         replicas: 3
  neutron:
    apiOverride:
      route: {}
    template:
      replicas: 3
      override:
        service:
          internal:
            metadata:
              annotations:
                metallb.universe.tf/address-pool: internalapi
                metallb.universe.tf/allow-shared-ip: internalapi
                metallb.universe.tf/loadBalancerIPs: 172.17.0.80
            spec:
              type: LoadBalancer
      databaseInstance: openstack
      secret: osp-secret
      networkAttachments:
      - internalapi
  swift:
    enabled: true
    proxyOverride:
      route: {}
    template:
      swiftProxy:
        networkAttachments:
        - storage
        override:
          service:
            internal:
              metadata:
                annotations:
                  metallb.universe.tf/address-pool: internalapi
                  metallb.universe.tf/allow-shared-ip: internalapi
                  metallb.universe.tf/loadBalancerIPs: 172.17.0.80
              spec:
                type: LoadBalancer
        replicas: 2
      swiftRing:
        ringReplicas: 3
      swiftStorage:
        networkAttachments:
        - storage
        replicas: 3
        storageRequest: 100Gi
  ovn:
    template:
      ovnDBCluster:
        ovndbcluster-nb:
          replicas: 3
          dbType: NB
          storageRequest: 10G
          networkAttachment: internalapi
        ovndbcluster-sb:
          replicas: 3
          dbType: SB
          storageRequest: 10G
          networkAttachment: internalapi
      ovnNorthd: {}
      ovnController:
        networkAttachment: tenant
        nicMappings:
          my-network: nic1
  placement:
    apiOverride:
      route: {}
    template:
      override:
        service:
          internal:
            metadata:
              annotations:
                metallb.universe.tf/address-pool: internalapi
                metallb.universe.tf/allow-shared-ip: internalapi
                metallb.universe.tf/loadBalancerIPs: 172.17.0.80
            spec:
              type: LoadBalancer
      databaseInstance: openstack
      replicas: 3
      secret: osp-secret
  rabbitmq:
    templates:
      rabbitmq:
        replicas: 3
        override:
          service:
            metadata:
              annotations:
                metallb.universe.tf/address-pool: internalapi
                metallb.universe.tf/loadBalancerIPs: 172.17.0.85
            spec:
              type: LoadBalancer
      rabbitmq-cell1:
        replicas: 3
        override:
          service:
            metadata:
              annotations:
                metallb.universe.tf/address-pool: internalapi
                metallb.universe.tf/loadBalancerIPs: 172.17.0.86
            spec:
              type: LoadBalancer
  telemetry:
    enabled: true
    template:
      metricStorage:
        enabled: true
        dashboardsEnabled: true
        dataplaneNetwork: ctlplane
        networkAttachments:
          - ctlplane
        monitoringStack:
          alertingEnabled: true
          scrapeInterval: 30s
          storage:
            strategy: persistent
            retention: 24h
            persistent:
              pvcStorageRequest: 20G
      autoscaling:
        enabled: false
        aodh:
          databaseAccount: aodh
          databaseInstance: openstack
          passwordSelector:
            aodhService: AodhPassword
          rabbitMqClusterName: rabbitmq
          serviceUser: aodh
          secret: osp-secret
        heatInstance: heat
      ceilometer:
        enabled: true
        secret: osp-secret
      logging:
        enabled: false
  • spec.storageClass: Red Hat OpenShift Container Platform (RHOCP) クラスターストレージバックエンド用に作成したストレージクラス。
  • spec.cinder: Block Storage サービス (cinder) のサービス固有のパラメーター。
  • spec.cinder.template.cinderBackup: Block Storage サービスのバックエンド。ストレージサービスの設定の詳細は、永続ストレージの設定 ガイドを参照してください。
  • spec.cinder.template.cinderVolumes: Block Storage サービスの設定。ストレージサービスの設定の詳細は、永続ストレージの設定 ガイドを参照してください。
  • spec.cinder.template.cinderVolumes.networkAttachments: NetworkAttachmentDefinition リソース名を使用して指定された、各サービス Pod が直接アタッチされているネットワークのリスト。指定した各ネットワークアタッチメントのサービスに NIC を設定します。

    注記

    各サービス Pod が割り当てられている分離ネットワークを設定しなかった場合は、デフォルトの Pod ネットワークが使用されます。たとえば、Block Storage サービスはストレージネットワークを使用してストレージバックエンドに接続し、Identity サービス (keystone) は LDAP または Active Directory (AD) ネットワークを使用し、ovnDBCluster サービスは internalapi ネットワークを使用し、ovnController サービスは tenant ネットワークを使用します。

  • spec.nova: Compute サービス (nova) のサービス固有のパラメーター。
  • spec.nova.apiOverride: Service API ルート定義。ルート固有のアノテーションを使用してサービスルートをカスタマイズできます。詳細は、RHOCP ネットワーク ガイドの ルート固有のアノテーション を参照してください。デフォルトのルートテンプレートを適用するには、route:{} に設定します。
  • nicMappings: ゲートウェイが存在する物理ネットワークと、ゲートウェイネットワークに接続する NIC をペアにします。この物理ネットワークは、neutron ネットワークの provider:*name フィールドで設定されます。必要に応じて、さらに <network_name>:<nic_name> のペアを追加することもできます。
  • metallb.universe.tf/address-pool: IPAddressPool internalapi を使用して MetalLB サービスとして登録された内部サービス API エンドポイント。
  • metallb.universe.tf/loadBalancerIPs: サービスの仮想 IP (VIP) アドレス。IP はデフォルトで他のサービスと共有されます。
  • spec.rabbitmq: 11 および 12 に示すように、loadBalancerIPs アノテーションで定義された個別の IP アドレスを持つ分離されたネットワークに公開される RabbitMQ インスタンス。

    注記

    すべての RabbitMQ インスタンスは同じポートを使用するため、同じ仮想 IP (VIP) アドレスに複数の RabbitMQ インスタンスを設定することはできません。複数の RabbitMQ インスタンスを同じネットワークに公開する必要がある場合は、個別の IP アドレスを使用する必要があります。

  • rabbitmq.override.service.metadata.annotations.metallb.universe.tf/loadBalancerIPs: 分離されたネットワークに公開される RabbitMQ インスタンスの固有の IP アドレス。

9.4. コントロールプレーンからのサービスの削除

デプロイ後にサービスを無効にすると、コントロールプレーンからサービスとサービスデータベースを完全に削除できます。多くのサービスはデフォルトで有効になっています。そのため、replicas0 に設定されているためにサービス Pod が作成されない場合でも、OpenStack Operator がサービスデータベースや Identity サービス (keystone) ユーザーなどのリソースを作成します。

警告

サービスは慎重に削除してください。サービスを削除することは、サービス Pod を停止することと同じではありません。サービスの削除は元に戻せません。サービスを無効にすると、サービスデータベースが削除され、そのサービスを参照していたリソースが追跡されなくなります。サービスを削除する前に、サービスデータベースのバックアップを作成してください。

手順

  1. ワークステーションで OpenStackControlPlane CR ファイルを開きます。
  2. コントロールプレーンから削除するサービスを見つけて無効にします。

      cinder:
        enabled: false
        apiOverride:
          route: {}
          ...
  3. コントロールプレーンを更新します。

    $ oc apply -f openstack_control_plane.yaml -n openstack
  4. RHOCP が無効なサービスに関連するリソースを削除するまで待機します。次のコマンドを実行して、ステータスを確認します。

    $ oc get openstackcontrolplane -n openstack
    NAME 							STATUS 	MESSAGE
    openstack-control-plane 	Unknown 	Setup started

    ステータスが "Setup complete" であれば、無効にしたサービスで OpenStackControlPlane リソースが更新されています。

    ヒント

    デプロイの進行状況を追跡するには、get コマンドの末尾に -w オプションを追加します。

  5. オプション: openstack namespace 内の Pod を確認して、無効にしたサービスの Pod がリストに表示されなくなったことを確認します。

    $ oc get pods -n openstack
  6. サービスが削除されていることを確認します。

    $ oc get cinder -n openstack

    サービスが正常に削除されていれば、このコマンドで次のメッセージが返されます。

    No resources found in openstack namespace.
  7. サービスの API エンドポイントが Identity サービス (keystone) から削除されていることを確認します。

    $ oc rsh -n openstack openstackclient
    $ openstack endpoint list --service volumev3

    サービスの API エンドポイントが正常に削除されていれば、このコマンドで次のメッセージが返されます。

    No service with a type, name or ID of 'volumev3' exists.

9.5. 関連情報

第10章 SR-IOV および DPDK 環境のデータプレーンの作成

Red Hat OpenStack Services on OpenShift (RHOSO) のデータプレーンは、RHEL 9.4 ノードで構成されます。OpenStackDataPlaneNodeSet カスタムリソース定義 (CRD) を使用して、ノードとデータプレーンのレイアウトを定義するカスタムリソース (CR) を作成します。OpenStackDataPlaneNodeSet CR を定義したら、各 OpenStackDataPlaneNodeSet CR をデプロイする OpenStackDataPlaneDeployment CR を作成します。

OpenStackDataPlaneNodeSet CR は、類似したタイプのノードの論理グループです。データプレーンは通常、さまざまな設定とロールを持つノードのグループを定義する複数の OpenStackDataPlaneNodeSet CR で構成されます。OpenStackDataPlaneNodeSet CR では、事前にプロビジョニングされたノードを使用することも、プロビジョニングされていないノードを使用することもできます。

  • 事前プロビジョニングされたノード: ノードをデータプレーンに追加する前に、独自のツールを使用してノードにオペレーティングシステムをインストールした場合。
  • プロビジョニングされていないノード: ノードをデータプレーンに追加する前に、ノードにオペレーティングシステムをインストールしていない場合。ノードは、データプレーンの作成およびデプロイプロセスの一部として Cluster Baremetal Operator (CBO) を使用してプロビジョニングされます。
注記

同じ OpenStackDataPlaneNodeSet CR に、事前にプロビジョニングされたノードとプロビジョニングされていないノードの両方を含めることはできません。

データプレーンを作成してデプロイするには、次のタスクを実行する必要があります。

  1. Ansible がデータプレーンノードでコマンドを実行するために使用する、各ノードセットの Secret CR を作成します。
  2. データプレーンのノードとレイアウトを定義する OpenStackDataPlaneNodeSet CR を作成します。
  3. 指定の OpenStackDataPlaneNodeSet CR のリストに対して、ソフトウェアをデプロイおよび設定する Ansible 実行をトリガーする OpenStackDataPlaneDeployment CR を作成します。

次の手順では、事前プロビジョニングされたノードを含むシンプルなノードセットと、ノードセットのデプロイ中にプロビジョニングする必要があるベアメタルノードを含むシンプルなノードセットの 2 つを作成します。この手順は、データプレーン環境を迅速に起動して実行することを目的としています。この環境を使用して、問題のトラブルシューティングや環境のテストを実行してから、必要なカスタマイズをすべて追加できます。デプロイした環境にノードセットを追加したり、サービスのデフォルト ConfigMap CR の共通設定を更新したり、カスタムサービスを作成したりすることで、デプロイした環境をカスタマイズできます。デプロイ後にデータプレーンをカスタマイズする方法の詳細は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ ガイドを参照してください。

10.1. 前提条件

  • OpenStack Operator を使用して作成した動作中のコントロールプレーン。詳細は、NFV 環境のコントロールプレーンの作成 を参照してください。
  • cluster-admin 権限を持つユーザーとして、Red Hat OpenShift Container Platform (RHOCP) クラスターにアクセスできるワークステーションにログオンしている。

10.2. データプレーンシークレットの作成

データプレーンが動作するために必要な Secret カスタムリソース (CR) を作成する必要があります。Secret CR は、ノード間のアクセス保護、ノードのオペレーティングシステムの Red Hat カスタマーポータルへの登録、ノードリポジトリーの有効化、コンピュートノードに対する libvirt へのアクセス提供を行うためのに、データプレーンノードにより使用されます。

ノード間の安全なアクセスを有効にするには、2 つの SSH 鍵を生成し、鍵ごとに SSH 鍵 Secret CR を作成する必要があります。

  • Ansible がデータプレーン上の RHEL ノードを管理できるようにするための SSH 鍵。Ansible はこのユーザーと鍵を使用してコマンドを実行します。データプレーン内の OpenStackDataPlaneNodeSet CR ごとに SSH 鍵を作成できます。

    • コンピュートノード間のインスタンスの移行を可能にする SSH 鍵

前提条件

  • 事前にプロビジョニングされたノードが、パスワードなしの sudo 権限を持つユーザーの $HOME/.ssh/authorized_keys ファイル内の SSH 公開鍵を使用して設定されている。詳細は、RHEL の 基本システム設定 ガイドの sudo アクセスの管理 を参照してください。

手順

  1. プロビジョニングされていないノードの場合は、Ansible の SSH 鍵ペアを作成します。

    $ ssh-keygen -f <key_file_name> -N "" -t rsa -b 4096
    • <key_file_name> は、鍵ペアに使用する名前に置き換えます。
  2. Ansible 用の Secret CR を作成し、クラスターに適用します。

    $ oc create secret generic dataplane-ansible-ssh-private-key-secret \
    --save-config \
    --dry-run=client \
    --from-file=ssh-privatekey=<key_file_name> \
    --from-file=ssh-publickey=<key_file_name>.pub \
    [--from-file=authorized_keys=<key_file_name>.pub] -n openstack \
    -o yaml | oc apply -f -
    • <key_file_name> を SSH 鍵ペアファイルの名前と場所に置き換えます。
    • オプション: データプレーンを作成するときにプロビジョニングする必要があるベアメタルノードに対してのみ、--from-file=authorized_keys オプションを含めます。
  3. コンピュートノードを作成する場合は、移行用のシークレットを作成します。

    1. インスタンス移行用の SSH 鍵ペアを作成します。

      $ ssh-keygen -f ./nova-migration-ssh-key -t ecdsa-sha2-nistp521 -N ''
    2. 移行用の Secret CR を作成し、クラスターに適用します。

      $ oc create secret generic nova-migration-ssh-key \
      --save-config \
      --from-file=ssh-privatekey=nova-migration-ssh-key \
      --from-file=ssh-publickey=nova-migration-ssh-key.pub \
      -n openstack \
      -o yaml | oc apply -f -
  4. Red Hat カスタマーポータルに登録されていないノードの場合は、subscription-manager 認証情報用の Secret CR を作成してノードを登録します。

    $ oc create secret generic subscription-manager \
    --from-literal rhc_auth='{"login": {"username": "<subscription_manager_username>", "password": "<subscription_manager_password>"}}'
    • <subscription_manager_username> を、subscription-manager に設定したユーザー名に置き換えます。
    • <subscription_manager_password> を、subscription-manager に設定したパスワードに置き換えます。
  5. Red Hat レジストリーの認証情報を含む Secret CR を作成します。

    $ oc create secret generic redhat-registry --from-literal edpm_container_registry_logins='{"registry.redhat.io": {"<username>": "<password>"}}'
    • <username><password> を Red Hat レジストリーのユーザー名とパスワードの認証情報に置き換えます。

      レジストリーサービスアカウントの作成方法は、ナレッジベース記事の Creating Registry Service Accounts を参照してください。

  6. コンピュートノードを作成する場合は、libvirt のシークレットを作成します。

    1. ワークステーションに secret_libvirt.yaml という名前のファイルを作成し、libvirt シークレットを定義します。

      apiVersion: v1
      kind: Secret
      metadata:
       name: libvirt-secret
       namespace: openstack
      type: Opaque
      data:
       LibvirtPassword: <base64_password>
      • <base64_password> を、最大長 63 文字の base64 でエンコードされた文字列に置き換えます。次のコマンドを使用して、base64 でエンコードされたパスワードを生成できます。

        $ echo -n <password> | base64
        ヒント

        ユーザー名とパスワードを base64 でエンコードする必要がない場合は、data フィールドの代わりに stringData フィールドを使用してユーザー名とパスワードを設定します。

    2. Secret CR を作成します。

      $ oc apply -f secret_libvirt.yaml -n openstack
  7. Secret CR が作成されたことを確認します。

    $ oc describe secret dataplane-ansible-ssh-private-key-secret
    $ oc describe secret nova-migration-ssh-key
    $ oc describe secret subscription-manager
    $ oc describe secret redhat-registry
    $ oc describe secret libvirt-secret

10.3. カスタムの SR-IOV Compute サービスの作成

Red Hat OpenStack Services on OpenShift (RHOSO) 環境では、NFV 用のカスタムの SR-IOV Compute サービスを作成する必要があります。このサービスは、データプレーン上で実行される Ansible サービスです。このカスタムサービスは、SR-IOV コンピュートノードで次のタスクを実行します。

  • CPU ピニングパラメーターを適用します。
  • PCI パススルーを実行します。

SR-IOV カスタムサービスを作成するには、次の操作を実行する必要があります。

  • CPU ピニング設定を、指定の SR-IOV Compute ノードのセットにマップする CPU ピニング用の ConfigMap を作成します。
  • PCI パススルー設定を、指定の SR-IOV Compute ノードのセットにマップする PCI パススルー用の ConfigMap を作成します。
  • データプレーンに configMaps を実装する実際の SR-IOV カスタムサービスを作成します。

前提条件

  • ワークステーションに oc コマンドラインツールがインストール済みである。
  • cluster-admin 権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。

手順

  1. CPU ピニングと PCI パススルーの設定を定義する ConfigMap CR を作成し、ワークステーション上の YAML ファイル (例: pinning-passthrough.yaml) に保存します。

    環境に応じて値 (太字部分) を変更します。

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cpu-pinning-nova
    data:
      25-cpu-pinning-nova.conf: |
        [DEFAULT]
        reserved_host_memory_mb = 4096
        [compute]
        cpu_shared_set = 0-3,24-27
        cpu_dedicated_set = 8-23,32-47
        [neutron]
        physnets = <network_name1>, <network_name2>
        [neutron_physnet_<network_name1>]
        numa_nodes = <ID list>
        [neutron_physnet_<network_name2>]
        numa_nodes = <ID list>
        [neutron_tunnel]
        numa_nodes = <ID list>
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: sriov-nova
    data:
      26-sriov-nova.conf: |
        [libvirt]
        cpu_power_management=false
        [pci]
        passthrough_whitelist = {"address": "0000:05:00.2", "physical_network":"sriov-1", "trusted":"true"}
        passthrough_whitelist = {"address": "0000:05:00.3", "physical_network":"sriov-2", "trusted":"true"}
    ---
    • cpu_shared_set: vCPU のインベントリーを指定するために使用する物理ホスト CPU 番号のコンマ区切りリストまたは範囲を入力します。これにより、ピニングされていないインスタンスをスケジュールできるホスト CPU を決定します。また、共有エミュレータースレッドポリシーで設定されたインスタンスのインスタンスエミュレータースレッドをオフロードするホスト CPU を決定します。
    • cpu_dedicated_set: ピニングされたインスタンス CPU のプロセスをスケジュールできる物理ホスト CPU 番号のコンマ区切りのリストまたは範囲を入力します。たとえば、4-12,^8,15 は、8 を除く 4 - 12 および 15 のコアを予約します。
    • <network_name_n_>: <network_name1><network_name2> は、ゲートウェイが配置されている物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワーク provider:*name フィールドで設定します。)
    • numa_nodes = <ID list>: <ID list> を、この物理ネットワークに関連付けられている NUMA ノードの ID のコンマ区切りリストに置き換えます。たとえば、0,1 です。以下に例を示します。

      [neutron]
      physnets = foo,bar
      
      [neutron_physnet_foo]
      numa_nodes = 0
      
      [neutron_physnet_bar]
      numa_nodes = 2, 3

      この設定では、provider:physical_network=foo で 1 つ以上の L2 タイプのネットワークを使用するインスタンスは NUMA ノード 0 のホストコアでスケジュールされる必要があり、provider:physical_network=bar で 1 つ以上のネットワークを使用するインスタンスは NUMA ノード 2 と 3 の両方のホストコアでスケジュールされる必要があります。後者の場合、hw:numa_nodes extra 仕様を使用して、ゲストを 2 つ以上のホスト NUMA ノードに分割する必要があります。

    • passthrough_whitelist: "address""physical_network" に、有効な NIC アドレスと名前を指定します。
  2. ConfigMap CR ファイルを使用して、ConfigMap オブジェクトを作成します。

    $ oc create -f sriov-pinning-passthru.yaml -n openstack
  3. SR-IOV カスタムサービスを定義する OpenStackDataPlaneService CR を作成し、ワークステーション上の YAML ファイル (例: nova-custom-sriov.yaml) に保存します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-sriov
  4. ConfigMap CR をカスタムサービスに追加し、このサービスを実行するノードセットの接続先セルの Secret CR を指定します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-sriov
    spec:
      label: dataplane-deployment-nova-custom-sriov
      dataSources:
        - configMapRef:
            name: cpu-pinning-nova
        - configMapRef:
            name: sriov-nova
        - secretRef:
            name: nova-cell1-compute-config
        - secretRef:
            name: nova-migration-ssh-key
      tlsCerts:
        default:
          contents:
            - dnsnames
            - ips
          networks:
            - ctlplane
          issuer: osp-rootca-issuer-internal
      caCerts: combined-ca-bundle
  5. Ansible Playbook を参照するか、playbookContents フィールドに Ansible プレイを含めることで、カスタムサービスを作成するための Ansible コマンドを指定します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-sriov
    spec:
      label: dataplane-deployment-nova-custom-sriov
      edpmServiceType: nova
      dataSources:
        - configMapRef:
            name: cpu-pinning-nova
        - configMapRef:
            name: sriov-nova
        - secretRef:
            name: nova-cell1-compute-config
        - secretRef:
            name: nova-migration-ssh-key
      playbook: osp.edpm.nova
      tlsCerts:
        default:
          contents:
            - dnsnames
            - ips
          networks:
            - ctlplane
          issuer: osp-rootca-issuer-internal
      caCerts: combined-ca-bundle
  6. custom-nova-sriov サービスを作成します。

    $ oc apply -f nova-custom-sriov.yaml -n openstack
  7. カスタムサービスが作成されたことを確認します。

    $ oc get openstackdataplaneservice nova-custom-sriov -o yaml -n openstack

10.4. カスタムの OVS-DPDK Compute サービスの作成

Red Hat OpenStack Services on OpenShift (RHOSO) 環境では、NFV 用のカスタムの OVS-DPDK Compute サービスを作成する必要があります。このサービスは、データプレーン上で実行される Ansible サービスです。このカスタムサービスは、CPU ピニングパラメーター、ブロック移行パラメーター、OVS ブリッジが使用する NIC に接続された NUMA ノードでのインスタンス生成を可能にする NUMA 対応 vswitch 機能などの各種パラメーターを、OVS-DPDK コンピュートノードに適用します。

OVS-DPDK カスタムサービスを作成するには、以下のアクションを実行する必要があります。

  • 指定された OVS-DPDK コンピュートノードのセットに設定をマッピングする ConfigMap を作成します。
  • データプレーンに ConfigMap を実装する実際の OVS-DPDK カスタムサービスを作成します。

前提条件

  • ワークステーションに oc コマンドラインツールがインストール済みである。
  • cluster-admin 権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。

手順

  1. パラメーターの設定を定義する ConfigMap CR を作成し、ワークステーション上の YAML ファイル (例: dpdk-custom.yaml) に保存します。

    環境に応じて値 (太字部分) を変更します。

    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: dpdk-custom-nova
      namespace: openstack
    data:
      25-dpdk-custom-nova.conf: |
        [DEFAULT]
        reserved_host_memory_mb = 4096
        [compute]
        cpu_shared_set = 0-3,24-27
        cpu_dedicated_set = 8-23,32-47
        [neutron]
        physnets = <network_name1>, <network_name2>
        [neutron_physnet_<network_name1>]
        numa_nodes = <ID list>
        [neutron_physnet_<network_name2>]
        numa_nodes = <ID list>
        [neutron_tunnel]
        numa_nodes = <ID list>
        [libvirt]
        live_migration_permit_post_copy=false
    ---
    • cpu_shared_set: vCPU のインベントリーを指定するために使用する物理ホスト CPU 番号のコンマ区切りリストまたは範囲を入力します。これにより、ピニングされていないインスタンスをスケジュールできるホスト CPU を決定します。また、共有エミュレータースレッドポリシーで設定されたインスタンスのインスタンスエミュレータースレッドをオフロードするホスト CPU を決定します。
    • cpu_dedicated_set: ピニングされたインスタンス CPU のプロセスをスケジュールできる物理ホスト CPU 番号のコンマ区切りのリストまたは範囲を入力します。たとえば、4-12,^8,15 は、8 を除く 4 - 12 および 15 のコアを予約します。
    • <network_name_n_>: <network_name1><network_name2> を、NUMA アフィニティーを設定する必要があるゲートウェイが配置されている物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワーク provider:*name フィールドで設定します。)
    • <ID list>: <ID list> を、この物理ネットワークに関連付けられている NUMA ノードの ID のコンマ区切りリストに置き換えます。たとえば、0,1 です。以下に例を示します。

      [neutron]
      physnets = foo,bar
      
      [neutron_physnet_foo]
      numa_nodes = 0
      
      [neutron_physnet_bar]
      numa_nodes = 2, 3

      この設定では、provider:physical_network=foo` で 1 つ以上の L2 タイプのネットワークを使用するインスタンスは NUMA ノード 0 のホストコアでスケジュールされる必要があり、provider:physical_network=bar` で 1 つ以上のネットワークを使用するインスタンスは NUMA ノード 2 と 3 の両方のホストコアでスケジュールされる必要があります。後者の場合、hw:numa_nodes extra` 仕様を使用して、ゲストを 2 つ以上のホスト NUMA ノードに分割する必要があります。

    • live_migration_permit_post_copy=false: DPDK を使用する Geneve ネットワークに接続されたインスタンスのブロックライブマイグレーションを正常に実行するために必要です。
  2. ConfigMap CR ファイルを使用して、ConfigMap オブジェクトを作成します。

    $ oc create -f dpdk-custom.yaml -n openstack
  3. OVS-DPDK カスタムサービスを定義する OpenStackDataPlaneService CR を作成し、ワークステーション上の YAML ファイル (例: nova-custom-ovsdpdk.yaml) に保存します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-ovsdpdk
      namespace: openstack
  4. ConfigMap CR をカスタムサービスに追加し、このサービスを実行するノードセットの接続先セルの Secret CR を指定します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-ovsdpdk
      namespace: openstack
    spec:
      label: dataplane-deployment-nova-custom-ovsdpdk
      edpmServiceType: nova
      dataSources:
        - configMapRef:
            name: dpdk-custom-nova
        - secretRef:
            name: nova-cell1-compute-config
        - secretRef:
            name: nova-migration-ssh-key
      tlsCerts:
        default:
          contents:
            - dnsnames
            - ips
          networks:
            - ctlplane
          issuer: osp-rootca-issuer-internal
      caCerts: combined-ca-bundle
  5. Ansible Playbook を参照するか、playbookContents フィールドに Ansible プレイを含めることで、カスタムサービスを作成するための Ansible コマンドを指定します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-ovsdpdk
      namespace: openstack
    spec:
      label: dataplane-deployment-nova-custom-ovsdpdk
      edpmServiceType: nova
      dataSources:
        - configMapRef:
            name: dpdk-custom-nova
        - secretRef:
            name: nova-cell1-compute-config
        - secretRef:
            name: nova-migration-ssh-key
      playbook: osp.edpm.nova
      tlsCerts:
        default:
          contents:
            - dnsnames
            - ips
          networks:
            - ctlplane
          issuer: osp-rootca-issuer-internal
      caCerts: combined-ca-bundle
  6. nova-custom-ovsdpdk サービスを作成します。

    $ oc apply -f nova-custom-ovsdpdk.yaml -n openstack
  7. カスタムサービスが作成されたことを確認します。

    $ oc get openstackdataplaneservice nova-custom-ovsdpdk -o yaml -n openstack

10.5. 事前にプロビジョニングされたノードを使用したデータプレーンノードセットの作成

データプレーン内の事前プロビジョニングされたノードの論理グループごとに、OpenStackDataPlaneNodeSet カスタムリソース (CR) を定義します (たとえば、ハードウェア、場所、ネットワーク別にグループ化されたノードなど)。デプロイメントに応じて必要な数のノードセットを定義できます。各ノードは、1 つの OpenStackDataPlaneNodeSet CR にのみ含めることができます。各ノードセットは、1 つの Compute セルにのみ接続できます。デフォルトでは、ノードセットは cell1 に接続されます。コントロールプレーンをカスタマイズして Compute セルを追加する場合は、ノードセットの接続先のセルを指定する必要があります。Compute セルの追加の詳細は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ ガイドの OpenStackDataPlaneNodeSet CR を Compute セルに接続する を参照してください。

nodeTemplate フィールドを使用して、OpenStackDataPlaneNodeSet CR 内のすべてのノードが共有するプロパティーを設定します。nodeTemplate.nodes フィールドを使用して、ノード固有のプロパティーを設定します。ノード固有の設定は、nodeTemplate から継承された値をオーバーライドします。

手順

  1. ワークステーションに openstack_preprovisioned_node_set.yaml という名前のファイルを作成し、OpenStackDataPlaneNodeSet CR を定義します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-data-plane 
    1
    
      namespace: openstack
    spec:
      env:
        - name: ANSIBLE_FORCE_COLOR
          value: "True"
    1
    OpenStackDataPlaneNodeSet CR 名は、一意であり、小文字の英数字と - (ハイフン) または . (ピリオド) のみが含まれ、先頭と末尾は英数字で、最大長 53 文字である必要があります。この例の名前を、セット内のノードを表す名前に更新してください。
  2. このセット内のノードが事前にプロビジョニングされていることを指定します。

      preProvisioned: true
  3. Ansible がデータプレーンノードに接続できるようにするために作成した SSH 鍵シークレットを追加します。

      nodeTemplate:
        ansibleSSHPrivateKeySecret: <secret-key>
  4. ログを保存するために、Red Hat OpenShift Container Platform (RHOCP) クラスターの openstack namespace に永続ボリューム要求 (PVC) を作成します。volumeModeFilesystem に、accessModesReadWriteOnce に設定します。NFS ボリュームプラグインを使用する PersistentVolume (PV) からのログのストレージを要求しないでください。NFS は FIFO と互換性がないため、ansible-runner はログを保存するために書き込む FIFO ファイルを作成します。PVC の詳細は、RHOCP ストレージ ガイドの 永続ストレージについて、および デプロイメントのプランニングRed Hat OpenShift Container Platform クラスターの要件 を参照してください。
  5. データプレーンノードの永続的なロギングを有効にします。

      nodeTemplate:
        ansibleSSHPrivateKeySecret: <secret-key>
        extraMounts:
          - extraVolType: Logs
            volumes:
            - name: ansible-logs
              persistentVolumeClaim:
                claimName: <pvc_name>
            mounts:
            - name: ansible-logs
              mountPath: "/runner/artifacts"
    • <pvc_name> を、RHOCP クラスター上の PVC ストレージの名前に置き換えます。
  6. このグループ内のノードセットの共通設定を nodeTemplate セクションに追加します。この OpenStackDataPlaneNodeSet 内の各ノードがこの設定を継承します。共通のノード属性を設定するために使用できるプロパティーの詳細は、OpenStackDataPlaneNodeSet CR の spec プロパティー を参照してください。
  7. Red Hat カスタマーポータルに登録されていないノードのオペレーティングシステムを登録し、ノードのリポジトリーを有効にします。次の手順は、ノードを CDN に登録する方法を示しています。Red Hat Satellite 6.13 にノードを登録する方法の詳細は、ホストの管理 を参照してください。

    1. subscription-manager の認証情報を含む Secret CR を作成します。

      apiVersion: v1
      kind: Secret
      metadata:
        name: subscription-manager
      data:
        username: <base64_encoded_username>
        password: <base64_encoded_password>
    2. Red Hat レジストリーの認証情報を含む Secret CR を作成します。

      $ oc create secret generic redhat-registry --from-literal edpm_container_registry_logins='{"registry.redhat.io": {"<username>": "<password>"}}'
      • <username><password> を Red Hat レジストリーのユーザー名とパスワードの認証情報に置き換えます。

    レジストリーサービスアカウントの作成方法は、Red Hat ナレッジベースアーティクルの Creating Registry Service Accounts を参照してください。

    1. ユーザー名とパスワードのソースとして使用する Secret CR を指定します。

        nodeTemplate:
          ansible:
            ...
            ansibleVarsFrom:
              - prefix: subscription_manager_
                secretRef:
                  name: subscription-manager
              - secretRef:
                  name: redhat-registry
            ansibleVars:
             rhc_release: 9.4
             rhc_repositories:
               - {name: "*", state: disabled}
               - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled}
               - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled}
               - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled}
               - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled}
               - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled}
               - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled}
  8. このノードセット内の各ノードを定義します。

      nodes:
        edpm-compute-0: 
    1
    
          hostName: edpm-compute-0
          networks: 
    2
    
            - name: ctlplane
              subnetName: subnet1
              defaultRoute: true
              fixedIP: 192.168.122.100 
    3
    
            - name: internalapi
              subnetName: subnet1
              fixedIP: 172.17.0.100
            - name: storage
              subnetName: subnet1
              fixedIP: 172.18.0.100
            - name: tenant
              subnetName: subnet1
              fixedIP: 172.19.0.100
          ansible:
            ansibleHost: 192.168.122.100
            ansibleUser: cloud-admin
            ansibleVars: 
    4
    
              fqdn_internal_api: edpm-compute-0.example.com
              edpm_network_config_nmstate: true 
    5
    
        edpm-compute-1:
          hostName: edpm-compute-1
          networks:
            - name: ctlplane
              subnetName: subnet1
              defaultRoute: true
              fixedIP: 192.168.122.101
            - name: internalapi
              subnetName: subnet1
              fixedIP: 172.17.0.101
            - name: storage
              subnetName: subnet1
              fixedIP: 172.18.0.101
            - name: tenant
              subnetName: subnet1
              fixedIP: 172.19.0.101
          ansible:
            ansibleHost: 192.168.122.101
            ansibleUser: cloud-admin
            ansibleVars:
              fqdn_internal_api: edpm-compute-1.example.com
    1
    ノード定義の参照 (例: edpm-compute-0)。ノードセット内の各ノードにノード定義が必要です。
    2
    ノードの IPAM と DNS レコードを定義します。
    3
    ネットワークの予測可能な IP アドレスを指定します。この場合、NetConfig CR でネットワークに定義された割り当て範囲内のアドレスでなければなりません。
    4
    ノードをカスタマイズするノード固有の Ansible 変数。
    注記
    • nodes セクションに定義するノードには、nodeTemplate セクションで設定されているのと同じ Ansible 変数を設定できます。Ansible 変数が特定のノードと nodeTemplate セクション内の両方に設定されている場合は、ノード固有の値が nodeTemplate セクションの値をオーバーライドします。
    • ノードのすべての nodeTemplate Ansible 変数を複製してデフォルトをオーバーライドし、ノード固有の値を設定する必要はありません。設定する必要があるのは、オーバーライドするノードの Ansible 変数だけです。
    • 多くの ansibleVars の名前には edpm が含まれています。これは "External Data Plane Management (外部データプレーン管理)" の略です。
    os-net-config プロバイダーを nmstate に設定します。デフォルト値は true です。nmstate プロバイダーの特定の制限により ifcfg プロバイダーを使用する必要がある場合のみ、これを false に変更します。nmstate プロバイダーの利点と制限の詳細は、「デプロイメントのプランニング」の https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/planning_your_deployment/plan-networks_planning#plan-os-net-config_plan-network を参照してください。

    詳細は以下を参照してください。

  9. services セクションに、データプレーンノードで実行されるサービスの一覧を追加します。nova を nova -custom-sriov、または nova-custom-ovsdpdk のいずれか、またはその両方に置き換えてください。

    ...
      services:
      - bootstrap
      - download-cache
      - reboot-os
      - configure-ovs-dpdk
      - configure-network
      - validate-network
      - install-os
      - configure-os
      - ssh-known-hosts
      - run-os
      - install-certs
      - ovn
      - neutron-ovn
      - neutron-ovn-igmp
      - neutron-metadata
      - libvirt
      - nova-custom-sriov
      - nova-custom-ovsdpdk
      - telemetry
    ...
  10. openstack_preprovisioned_node_set.yaml 定義ファイルを保存します。
  11. データプレーンリソースを作成します。

    $ oc create -f openstack_preprovisioned_node_set.yaml -n openstack
  12. データプレーンリソースが作成されたことを確認します。

    $ oc get openstackdataplanenodeset -n openstack
    NAME           		STATUS MESSAGE
    openstack-data-plane 	False  Deployment not started

    返されるステータスの意味は、データプレーンの状態 を参照してください。

  13. ノードセットの Secret リソースが作成されたことを確認します。

    $ oc get secret | grep openstack-data-plane
    dataplanenodeset-openstack-data-plane Opaque 1 3m50s
  14. サービスが作成されたことを確認します。

    $ oc get openstackdataplaneservice -n openstack
    NAME                AGE
    configure-network   6d7h
    configure-os        6d6h
    install-os          6d6h
    run-os              6d6h
    validate-network    6d6h
    ovn                 6d6h
    libvirt             6d6h
    nova                6d6h
    telemetry           6d6h

10.5.1. 事前プロビジョニングされたノードの OpenStackDataPlaneNodeSet CR の例

次の OpenStackDataPlaneNodeSet CR の例では、ノード固有の設定を使用して、事前にプロビジョニングされた Compute ノードからノードセットを作成します。例にはオプションのフィールドが含まれています。この例を確認し、オプションのフィールドを環境に適した値に更新するか、削除します。その後、Red Hat OpenStack Services on OpenShift (RHOSO) デプロイメントでこの例を使用します。

この例の OpenStackDataPlaneNodeSet CR の名前を、セット内のノードを表す名前に更新してください。OpenStackDataPlaneNodeSet CR 名は、一意であり、小文字の英数字と - (ハイフン) または . (ピリオド) のみが含まれ、先頭と末尾は英数字で、最大長 53 文字である必要があります。

注記

次の変数は IPAM と DNS から自動生成されるため、ユーザーによって提供されません。

  • ctlplane_dns_nameservers
  • dns_search_domains
  • ctlplane_host_routes
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
  name: openstack-data-plane
  namespace: openstack
spec:
  env:
    - name: ANSIBLE_FORCE_COLOR
      value: "True"
  networkAttachments:
    - ctlplane
  preProvisioned: true
  nodeTemplate:
    ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
    extraMounts:
      - extraVolType: Logs
        volumes:
        - name: ansible-logs
          persistentVolumeClaim:
            claimName: <pvc_name>
        mounts:
        - name: ansible-logs
          mountPath: "/runner/artifacts"
    managementNetwork: ctlplane
    ansible:
      ansibleUser: cloud-admin
      ansiblePort: 22
      ansibleVarsFrom:
        - secretRef:
            name: subscription-manager
        - secretRef:
            name: redhat-registry
      ansibleVars:
        timesync_ntp_servers:
          - hostname: ntp.example.com
            iburst: true
          - hostname: ntp2.example.com
            iburst: false
        rhc_release: 9.4
        rhc_repositories:
            - {name: "*", state: disabled}
            - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled}
            - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled}
            - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled}
            - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled}
            - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled}
            - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled}
        edpm_bootstrap_release_version_package: []
        edpm_network_config_os_net_config_mappings:
          edpm-compute-0:
            nic1: 52:54:04:60:55:22
        neutron_physical_bridge_name: br-ex
        neutron_public_interface_name: eth0
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: ovs_bridge
            name: {{ neutron_physical_bridge_name }}
            mtu: {{ min_viable_mtu }}
            use_dhcp: false
            dns_servers: {{ ctlplane_dns_nameservers }}
            domain: {{ dns_search_domains }}
            addresses:
            - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
            routes: {{ ctlplane_host_routes }}
            members:
            - type: interface
              name: nic1
              mtu: {{ min_viable_mtu }}
              # force the MAC address of the bridge to this interface
              primary: true
          {% for network in nodeset_networks %}
            - type: vlan
              mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }}
              vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }}
              addresses:
              - ip_netmask:
                  {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }}
              routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }}
          {% endfor %}
  nodes:
    edpm-compute-0:
      hostName: edpm-compute-0
      networks:
      - name: ctlplane
        subnetName: subnet1
        defaultRoute: true
        fixedIP: 192.168.122.100
      - name: internalapi
        subnetName: subnet1
        fixedIP: 172.17.0.100
      - name: storage
        subnetName: subnet1
        fixedIP: 172.18.0.100
      - name: tenant
        subnetName: subnet1
        fixedIP: 172.19.0.100
      ansible:
        ansibleHost: 192.168.122.100
        ansibleUser: cloud-admin
        ansibleVars:
          fqdn_internal_api: edpm-compute-0.example.com
    edpm-compute-1:
      hostName: edpm-compute-1
      networks:
      - name: ctlplane
        subnetName: subnet1
        defaultRoute: true
        fixedIP: 192.168.122.101
      - name: internalapi
        subnetName: subnet1
        fixedIP: 172.17.0.101
      - name: storage
        subnetName: subnet1
        fixedIP: 172.18.0.101
      - name: tenant
        subnetName: subnet1
        fixedIP: 172.19.0.101
      ansible:
        ansibleHost: 192.168.122.101
        ansibleUser: cloud-admin
        ansibleVars:
          fqdn_internal_api: edpm-compute-1.example.com
  services:
  - bootstrap
  - download-cache
  - reboot-os
  - configure-ovs-dpdk
  - configure-network
  - validate-network
  - install-os
  - configure-os
  - ssh-known-hosts
  - run-os
  - install-certs
  - ovn
  - neutron-ovn
  - neutron-ovn-igmp
  - neutron-metadata
  - libvirt
  - nova-custom-sriov
  - nova-custom-ovsdpdk
  - telemetry

10.6. プロビジョニングされていないノードを使用したデータプレーンノードセットの作成

データプレーン内のプロビジョニングされていないノードの論理グループごとに、OpenStackDataPlaneNodeSet カスタムリソース (CR) を定義します (たとえば、ハードウェア、場所、ネットワーク別にグループ化されたノードなど)。デプロイメントに応じて必要な数のノードセットを定義できます。各ノードは、1 つの OpenStackDataPlaneNodeSet CR にのみ含めることができます。各ノードセットは、1 つの Compute セルにのみ接続できます。デフォルトでは、ノードセットは cell1 に接続されます。コントロールプレーンをカスタマイズして Compute セルを追加する場合は、ノードセットの接続先のセルを指定する必要があります。Compute セルの追加の詳細は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ ガイドの OpenStackDataPlaneNodeSet CR を Compute セルに接続する を参照してください。

nodeTemplate フィールドを使用して、OpenStackDataPlaneNodeSet CR 内のすべてのノードが共有するプロパティーを設定します。nodeTemplate.nodes フィールドを使用して、ノード固有のプロパティーを設定します。ノード固有の設定は、nodeTemplate から継承された値をオーバーライドします。

ベアメタルノードのプロビジョニングの詳細は、デプロイメントの計画ベアメタルデータプレーンノードのプロビジョニングの計画 を参照してください。

前提条件

  • Cluster Baremetal Operator (CBO) がインストールされ、プロビジョニング用に設定されている。詳細は、デプロイメントの計画ベアメタルデータプレーンノードのプロビジョニングの計画 を参照してください。
  • BareMetalHost CR が、各ベアメタルデータプレーンノード用に登録および検査されている。各ベアメタルノードが検査後に Available 状態になっている必要があります。ベアメタルノードの設定の詳細は、Red Hat OpenShift Container Platform (RHOCP) インストール後の設定 ガイドの ベアメタルの設定 を参照してください。

手順

  1. ワークステーションに openstack_unprovisioned_node_set.yaml という名前のファイルを作成し、OpenStackDataPlaneNodeSet CR を定義します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-data-plane 
    1
    
      namespace: openstack
    spec:
      tlsEnabled: true
      env:
        - name: ANSIBLE_FORCE_COLOR
          value: "True"
    1
    OpenStackDataPlaneNodeSet CR 名は、一意であり、小文字の英数字と - (ハイフン) または . (ピリオド) のみが含まれ、先頭と末尾は英数字で、最大長 53 文字である必要があります。この例の名前を、セット内のノードを表す名前に更新してください。
  2. baremetalSetTemplate フィールドを定義して、ベアメタルノードの設定を記述します。

      preProvisioned: false
      baremetalSetTemplate:
        deploymentSSHSecret: dataplane-ansible-ssh-private-key-secret
        bmhNamespace: <bmh_namespace>
        cloudUserName: <ansible_ssh_user>
        bmhLabelSelector:
          app: <bmh_label>
        ctlplaneInterface: <interface>
    • <bmh_namespace> は、ノードは対応する BareMetalHost CR で定義されている namespace に置き換えます。
    • <ansible_ssh_user> は、Ansible SSH ユーザーのユーザー名に置き換えます。
    • <bmh_label> は、ノードの対応する BareMetalHost CR で定義されているメタデータラベル (例: openstack) に置き換えます。appworkloadnodeName などのメタデータラベルは、ノードにラベル付けするためのキーと値のペアです。対応する BareMetalHost CR 内のラベルと一致する 1 つ以上のラベルに基づいてデータプレーンノードを選択するには、bmhLabelSelector フィールドを設定します。
    • <interface> は、ノードが接続するコントロールプレーンインターフェイス (例: enp6s0) に置き換えます。
  3. デフォルトでは、BMO によって openshift-machine-api namespace 内の BareMetalHost CR が管理されます。すべての namespace を監視するように Provisioning CR を更新する必要があります。

    $ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"watchAllNamespaces": true }}'
  4. Ansible がデータプレーンノードに接続できるようにするために作成した SSH 鍵シークレットを追加します。

      nodeTemplate:
        ansibleSSHPrivateKeySecret: <secret-key>
  5. ログを保存するために、RHOCP クラスターの openstack namespace に永続ボリューム要求 (PVC) を作成します。volumeModeFilesystem に、accessModesReadWriteOnce に設定します。NFS ボリュームプラグインを使用する PersistentVolume (PV) からのログのストレージを要求しないでください。NFS は FIFO と互換性がないため、ansible-runner はログを保存するために書き込む FIFO ファイルを作成します。PVC の詳細は、RHOCP ストレージ ガイドの 永続ストレージについて、および デプロイメントのプランニングRed Hat OpenShift Container Platform クラスターの要件 を参照してください。
  6. データプレーンノードの永続的なロギングを有効にします。

      nodeTemplate:
        ansibleSSHPrivateKeySecret: <secret-key>
        extraMounts:
          - extraVolType: Logs
            volumes:
            - name: ansible-logs
              persistentVolumeClaim:
                claimName: <pvc_name>
            mounts:
            - name: ansible-logs
              mountPath: "/runner/artifacts"
    • <pvc_name> を、RHOCP クラスター上の PVC ストレージの名前に置き換えます。
  7. このグループ内のノードセットの共通設定を nodeTemplate セクションに追加します。この OpenStackDataPlaneNodeSet 内の各ノードがこの設定を継承します。

    詳細は以下を参照してください。

  8. このノードセット内の各ノードを定義します。

      nodes:
        edpm-compute-0: 
    1
    
          hostName: edpm-compute-0
          networks: 
    2
    
            - name: ctlplane
              subnetName: subnet1
              defaultRoute: true
              fixedIP: 192.168.122.100 
    3
    
            - name: internalapi
              subnetName: subnet1
            - name: storage
              subnetName: subnet1
            - name: tenant
              subnetName: subnet1
          ansible:
            ansibleHost: 192.168.122.100
            ansibleUser: cloud-admin
            ansibleVars: 
    4
    
              fqdn_internal_api: edpm-compute-0.example.com
              edpm_network_config_nmstate: true 
    5
    
        edpm-compute-1:
          hostName: edpm-compute-1
          networks:
            - name: ctlplane
              subnetName: subnet1
              defaultRoute: true
              fixedIP: 192.168.122.101
            - name: internalapi
              subnetName: subnet1
            - name: storage
              subnetName: subnet1
            - name: tenant
              subnetName: subnet1
          ansible:
            ansibleHost: 192.168.122.101
            ansibleUser: cloud-admin
            ansibleVars:
              fqdn_internal_api: edpm-compute-1.example.com
    1
    ノード定義の参照 (例: edpm-compute-0)。ノードセット内の各ノードにノード定義が必要です。
    2
    ノードの IPAM と DNS レコードを定義します。
    3
    ネットワークの予測可能な IP アドレスを指定します。この場合、NetConfig CR でネットワークに定義された割り当て範囲内のアドレスでなければなりません。
    4
    ノードをカスタマイズするノード固有の Ansible 変数。
    注記
    • nodes セクションに定義するノードには、nodeTemplate セクションで設定されているのと同じ Ansible 変数を設定できます。Ansible 変数が特定のノードと nodeTemplate セクション内の両方に設定されている場合は、ノード固有の値が nodeTemplate セクションの値をオーバーライドします。
    • ノードのすべての nodeTemplate Ansible 変数を複製してデフォルトをオーバーライドし、ノード固有の値を設定する必要はありません。設定する必要があるのは、オーバーライドするノードの Ansible 変数だけです。
    • 多くの ansibleVars の名前には edpm が含まれています。これは "External Data Plane Management (外部データプレーン管理)" の略です。
    os-net-config プロバイダーを nmstate に設定します。デフォルト値は true です。nmstate プロバイダーの特定の制限により ifcfg プロバイダーを使用する必要がある場合のみ、これを false に変更します。nmstate プロバイダーの利点と制限の詳細は、「デプロイメントのプランニング」の https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/planning_your_deployment/plan-networks_planning#plan-os-net-config_plan-network を参照してください。

    ノード属性を設定するために使用できるプロパティーの詳細は、OpenStackDataPlaneNodeSet CR のプロパティー を参照してください。

  9. services セクションに、データプレーンノードで実行されるサービスの一覧を追加します。nova を nova -custom-sriov、または nova-custom-ovsdpdk のいずれか、またはその両方に置き換えてください。

    ...
      services:
      - bootstrap
      - download-cache
      - reboot-os
      - configure-ovs-dpdk
      - configure-network
      - validate-network
      - install-os
      - configure-os
      - ssh-known-hosts
      - run-os
      - install-certs
      - ovn
      - neutron-ovn
      - neutron-ovn-igmp
      - neutron-metadata
      - libvirt
      - nova-custom-sriov
      - nova-custom-ovsdpdk
      - telemetry
    ...
  10. openstack_unprovisioned_node_set.yaml 定義ファイルを保存します。
  11. データプレーンリソースを作成します。

    $ oc create -f openstack_unprovisioned_node_set.yaml -n openstack
  12. データプレーンリソースが作成されたことを確認します。

    $ oc get openstackdataplanenodeset -n openstack
    NAME           		STATUS MESSAGE
    openstack-data-plane 	False  Deployment not started

    返されるステータスの意味は、「データプレーンの状態」を参照してください。

  13. ノードセットの Secret リソースが作成されたことを確認します。

    $ oc get secret -n openstack | grep openstack-data-plane
    dataplanenodeset-openstack-data-plane Opaque 1 3m50s
  14. サービスが作成されたことを確認します。

    $ oc get openstackdataplaneservice -n openstack
    NAME                AGE
    configure-network   6d7h
    configure-os        6d6h
    install-os          6d6h
    run-os              6d6h
    validate-network    6d6h
    ovn                 6d6h
    libvirt             6d6h
    nova                6d6h
    telemetry           6d6h

10.6.1. プロビジョニングされていないノードの OpenStackDataPlaneNodeSet CR の例

次の OpenStackDataPlaneNodeSet CR の例では、ノード固有の設定を使用して、プロビジョニングされていない Compute ノードからノードセットを作成します。プロビジョニングされていない Compute ノードは、ノードセットの作成時にプロビジョニングされます。例にはオプションのフィールドが含まれています。この例を確認し、オプションのフィールドを環境に適した値に更新するか、削除します。その後、Red Hat OpenStack Services on OpenShift (RHOSO) デプロイメントでこの例を使用します。

この例の OpenStackDataPlaneNodeSet CR の名前を、セット内のノードを表す名前に更新してください。OpenStackDataPlaneNodeSet CR 名は、一意であり、小文字の英数字と - (ハイフン) または . (ピリオド) のみが含まれ、先頭と末尾は英数字で、最大長 53 文字である必要があります。

注記

次の変数は IPAM と DNS から自動生成されるため、ユーザーによって提供されません。

  • ctlplane_dns_nameservers
  • dns_search_domains
  • ctlplane_host_routes
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
  name: openstack-data-plane
  namespace: openstack
spec:
  env:
    - name: ANSIBLE_FORCE_COLOR
      value: "True"
  networkAttachments:
    - ctlplane
  preProvisioned: false
  baremetalSetTemplate:
    deploymentSSHSecret: dataplane-ansible-ssh-private-key-secret
    bmhNamespace: openstack
    cloudUserName: cloud-admin
    bmhLabelSelector:
      app: openstack
    ctlplaneInterface: enp1s0
  nodeTemplate:
    ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
    extraMounts:
      - extraVolType: Logs
        volumes:
        - name: ansible-logs
          persistentVolumeClaim:
            claimName: <pvc_name>
        mounts:
        - name: ansible-logs
          mountPath: "/runner/artifacts"
    managementNetwork: ctlplane
    ansible:
      ansibleUser: cloud-admin
      ansiblePort: 22
      ansibleVarsFrom:
        - secretRef:
            name: subscription-manager
        - secretRef:
            name: redhat-registry
      ansibleVars:
        timesync_ntp_servers:
          - hostname: ntp.example.com
            iburst: true
          - hostname: ntp2.example.com
            iburst: false
        rhc_release: 9.4
        rhc_repositories:
            - {name: "*", state: disabled}
            - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled}
            - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled}
            - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled}
            - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled}
            - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled}
            - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled}
        edpm_bootstrap_release_version_package: []
        edpm_network_config_os_net_config_mappings:
          edpm-compute-0:
            nic1: 52:54:04:60:55:22
          edpm-compute-1:
            nic1: 52:54:04:60:55:22
        neutron_physical_bridge_name: br-ex
        neutron_public_interface_name: eth0
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: ovs_bridge
            name: {{ neutron_physical_bridge_name }}
            mtu: {{ min_viable_mtu }}
            use_dhcp: false
            dns_servers: {{ ctlplane_dns_nameservers }}
            domain: {{ dns_search_domains }}
            addresses:
            - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
            routes: {{ ctlplane_host_routes }}
            members:
            - type: interface
              name: nic1
              mtu: {{ min_viable_mtu }}
              # force the MAC address of the bridge to this interface
              primary: true
          {% for network in nodeset_networks %}
            - type: vlan
              mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }}
              vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }}
              addresses:
              - ip_netmask:
                  {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }}
              routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }}
          {% endfor %}
  nodes:
    edpm-compute-0:
      hostName: edpm-compute-0
      networks:
      - name: ctlplane
        subnetName: subnet1
        defaultRoute: true
        fixedIP: 192.168.122.100
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      ansible:
        ansibleHost: 192.168.122.100
        ansibleUser: cloud-admin
        ansibleVars:
          fqdn_internal_api: edpm-compute-0.example.com
      bmhLabelSelector:
        nodeName: edpm-compute-0
    edpm-compute-1:
      hostName: edpm-compute-1
      networks:
      - name: ctlplane
        subnetName: subnet1
        defaultRoute: true
        fixedIP: 192.168.122.101
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      ansible:
        ansibleHost: 192.168.122.101
        ansibleUser: cloud-admin
        ansibleVars:
          fqdn_internal_api: edpm-compute-1.example.com
      bmhLabelSelector:
        nodeName: edpm-compute-1
  services:
  - bootstrap
  - download-cache
  - reboot-os
  - configure-ovs-dpdk
  - configure-network
  - validate-network
  - install-os
  - configure-os
  - ssh-known-hosts
  - run-os
  - install-certs
  - ovn
  - neutron-ovn
  - neutron-ovn-igmp
  - neutron-metadata
  - libvirt
  - nova-custom-sriov
  - nova-custom-ovsdpdk
  - telemetry

10.7. OpenStackDataPlaneNodeSet CR の spec プロパティー

このセクションでは、OpenStackDataPlaneNodeSet CR の設定可能な spec プロパティーを詳しく説明します。

10.7.1. nodeTemplate

この OpenStackDataPlaneNodeSet 内のノードの共通属性を定義します。これらの共通属性は、個々のノードの定義でオーバーライドできます。

Expand
表10.1 nodeTemplate プロパティー
フィールド説明

ansibleSSHPrivateKeySecret

ノードに接続するための SSH 秘密鍵が含まれる SSH 秘密鍵シークレットの名前。

シークレット名の形式: Secret.data.ssh-privatekey

詳細は、SSH 認証シークレットの作成 を参照してください。

デフォルト: dataplane-ansible-ssh-private-key-secret

managementNetwork

管理に使用するネットワークの名前 (SSH/Ansible)。デフォルト: ctlplane

networks

OpenStackDataPlaneNodeSet のネットワーク定義。

ansible

Ansible の設定オプション。詳細は、ansible プロパティー を参照してください。

extraMounts

Ansible Execution Pod にマウントするファイル。

userData

OpenStackDataPlaneNodeSet の UserData 設定。

networkData

OpenStackDataPlaneNodeSet の NetworkData 設定。

10.7.2. nodes

この OpenStackDataPlaneNodeSet 内のノードのノード名とノード固有の属性を定義します。nodeTemplate で定義された共通属性をオーバーライドします。

Expand
表10.2 nodes プロパティー
フィールド説明

ansible

Ansible の設定オプション。詳細は、ansible プロパティー を参照してください。

extraMounts

Ansible Execution Pod にマウントするファイル。

hostName

ノード名。

managementNetwork

管理に使用するネットワークの名前 (SSH/Ansible)。

networkData

ノードの NetworkData 設定。

networks

インスタンスのネットワーク。

userData

ノード固有のユーザーデータ。

10.7.3. ansible

Ansible 設定オプションのグループを定義します。

Expand
表10.3 ansible プロパティー
フィールド説明

ansibleUser

データプレーンシークレットの作成 で作成したシークレットに関連付けられているユーザー。デフォルト: rhel-user

ansibleHost

Ansible 接続用の SSH ホスト。

ansiblePort

Ansible 接続用の SSH ポート。

ansibleVars

ノードのセットをカスタマイズする Ansible 変数。このプロパティーを使用すると、各 edpm-ansible ロールで使用可能な Ansible 変数を含む、任意のカスタム Ansible 変数を設定できます。ロール別の Ansible 変数の完全なリストは、edpm-ansible ドキュメント を参照してください。

注記

OpenStackDataPlaneNodeSet CR に設定できる ansibleVars パラメーターは、OpenStackDataPlaneNodeSet に対して定義されたサービスによって決まります。OpenStackDataPlaneService CR は、データプレーンサービスの一部として実行されるロールを含む、edpm-ansible Playbook コレクション から Ansible Playbook を呼び出します。

ansibleVarsFrom

Ansible 変数の入力元ソースのリスト。重複するキーを持つ AnsibleVars によって定義された値が優先されます。詳細は、ansibleVarsFrom プロパティー を参照してください。

10.7.4. ansibleVarsFrom

Ansible 変数の入力元ソースのリストを定義します。

Expand
表10.4 ansibleVarsFrom プロパティー
フィールド説明

prefix

ConfigMap 内の各キーの先頭に追加するオプションの識別子。C_IDENTIFIER である必要があります。

configMapRef

ansibleVars の選択元の ConfigMap CR。

secretRef

ansibleVars の選択元の Secret CR。

10.8. ネットワークインターフェイスの設定オプション

次の表は、Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワークインターフェイスを設定する際に使用できるオプションを説明しています。

注記

RHOSO では Linux ブリッジはサポートされません。代わりに、Linux ボンディングや RHOSO トラフィック用の専用 NIC などの方法を使用してください。

10.8.1. interface

単一のネットワークインターフェイスを定義します。ネットワークインターフェイスの name には、実際のインターフェイス名 (eth0eth1enp0s25) または一連の番号付きインターフェイス (nic1nic2nic3) が使用されます。eth0eno2 などの名前付きインターフェイスではなく、nic1nic2 などの番号付きインターフェイスを使用する場合、ロール内のホストのネットワークインターフェイスがまったく同じである必要はありません。たとえば、あるホストに em1em2 のインターフェイスが指定されており、別のホストには eno1eno2 が指定されていても、両ホストの NIC は nic1 および nic2 として参照することができます。

番号によるインターフェイスの順序は、名前によるネットワークインターフェイス種別の順序に対応します。

  • ethX インターフェイス (eth0eth1 など)。

    udev で一貫したデバイス命名がオフになっている場合、名前はこの形式で表示されます。

  • enoX および emX インターフェイス (eno0eno1em0em1 など)。

    通常はオンボードインターフェイスです。

  • enX とその他のインターフェイス (enp3s0enp3s1ens3 など)。英数字順に表示されます。

    これらは、通常アドオンのインターフェイスです。

番号による NIC スキームには、アクティブなインターフェイスだけが含まれます (たとえば、インターフェイスにスイッチに接続されたケーブルがあるかどうかが考慮されます)。4 つのインターフェイスを持つホストと、6 つのインターフェイスを持つホストがある場合は、nic1 から nic4 を使用して各ホストで 4 本のケーブルだけを結線します。

Expand
表10.5 interface オプション
オプションデフォルト説明

name

 

インターフェイスの名前。ネットワークインターフェイスの name には、実際のインターフェイス名 (eth0eth1enp0s25) または一連の番号付きインターフェイス (nic1nic2nic3) が使用されます。

use_dhcp

False

DHCP を使用して IP アドレスを取得します。

use_dhcpv6

False

DHCP を使用して v6 の IP アドレスを取得します。

addresses

 

インターフェイスに割り当てられる IP アドレスのリスト

routes

 

インターフェイスに割り当てられるルートのリスト。詳細は、「routes」 を参照してください。

mtu

1500

接続の最大伝送単位 (MTU: Maximum Transmission Unit)

primary

False

プライマリーインターフェイスとしてインターフェイスを定義します。interface がボンディングのメンバーである場合にのみ必要です。

persist_mapping

False

システム名の代わりにデバイスのエイリアス設定を記述します。

dhclient_args

None

DHCP クライアントに渡す引数

dns_servers

None

インターフェイスに使用する DNS サーバーのリスト

ethtool_opts

 

特定の NIC で VXLAN を使用する際にスループットを向上させるには、このオプションを "rx-flow-hash udp4 sdfn" に設定します。

...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: interface
            name: nic2
            ...

10.8.2. vlan

VLAN を定義します。parameters セクションから渡された VLAN ID およびサブネットを使用します。

vlan オプション
Expand
オプションデフォルト説明

vlan_id

 

VLAN ID

device

 

VLAN の接続先となる親デバイス。VLAN が OVS ブリッジのメンバーではない場合に、このパラメーターを使用します。たとえば、このパラメーターを使用して、ボンディングされたインターフェイスデバイスに VLAN を接続します。

use_dhcp

False

DHCP を使用して IP アドレスを取得します。

use_dhcpv6

False

DHCP を使用して v6 の IP アドレスを取得します。

addresses

 

VLAN に割り当てられる IP アドレスのリスト

routes

 

VLAN に割り当てられるルートのリスト。詳細は、「routes」 を参照してください。

mtu

1500

接続の最大伝送単位 (MTU: Maximum Transmission Unit)

primary

False

プライマリーインターフェイスとして VLAN を定義します。

persist_mapping

False

システム名の代わりにデバイスのエイリアス設定を記述します。

dhclient_args

None

DHCP クライアントに渡す引数

dns_servers

None

VLAN に使用する DNS サーバーのリスト

...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          ...
            - type: vlan
              device: nic{{ loop.index + 1 }}
              mtu: {{ lookup(vars, networks_lower[network] ~ _mtu) }}
              vlan_id: {{ lookup(vars, networks_lower[network] ~ _vlan_id) }}
              addresses:
              - ip_netmask:
                  {{ lookup(vars, networks_lower[network] ~ _ip) }}/{{ lookup(vars, networks_lower[network] ~ _cidr) }}
              routes: {{ lookup(vars, networks_lower[network] ~ _host_routes) }}
...

10.8.3. ovs_bridge

Open vSwitch (OVS) で、複数の interfaceovs_bondvlan オブジェクトを接続するブリッジを定義します。

ネットワークインターフェイス種別 ovs_bridge には、パラメーター name を使用します。

重要

Control グループネットワークを ovs_bridge インターフェイスに配置すると、ダウンタイムが発生する可能性があります。OVS ブリッジは、Networking サービス (neutron) サーバーに接続して設定データを取得します。OpenStack の制御トラフィック (通常 Control Plane および Internal API ネットワーク) が OVS ブリッジに配置されていると、OVS がアップグレードされたり、管理ユーザーやプロセスによって OVS ブリッジが再起動されたりする度に、neutron サーバーへの接続が失われます。このような状況でダウンタイムが許容されない場合は、コントロールグループのネットワークを OVS ブリッジではなく別のインターフェイスまたはボンディングに配置する必要があります。

  • Internal API ネットワークをプロビジョニングインターフェイス上の VLAN および 2 番目のインターフェイス上の OVS ブリッジに配置すると、最小の設定を行うことができます。
  • ボンディングを実装する場合は、少なくとも 2 つのボンディング (4 つのネットワークインターフェイス) が必要です。コントロールグループを Linux ボンディングに配置します。PXE ブート用のシングルインターフェイスへの LACP フォールバックをスイッチがサポートしていない場合には、このソリューションには少なくとも 5 つの NIC が必要となります。
注記

複数のブリッジがある場合は、デフォルト名の bridge_name を受け入れるのではなく、個別のブリッジ名を使用する必要があります。個別の名前を使用しないと、コンバージフェーズ時に 2 つのネットワークボンディングが同じブリッジに配置されます。

ovs_bridge オプション
Expand
オプションデフォルト説明

name

 

ブリッジ名

use_dhcp

False

DHCP を使用して IP アドレスを取得します。

use_dhcpv6

False

DHCP を使用して v6 の IP アドレスを取得します。

addresses

 

ブリッジに割り当てられる IP アドレスのリスト

routes

 

ブリッジに割り当てられるルートのリスト。詳細は、「routes」 を参照してください。

mtu

1500

接続の最大伝送単位 (MTU: Maximum Transmission Unit)

members

 

ブリッジで使用するインターフェイス、VLAN、およびボンディングオブジェクトのリスト

ovs_options

 

ブリッジ作成時に OVS に渡すオプションのセット

ovs_extra

 

ブリッジのネットワーク設定ファイルで OVS_EXTRA パラメーターとして設定するオプションのセット

defroute

True

DHCP サービスにより提供されるデフォルトのルートを使用します。use_dhcp または use_dhcpv6 を選択した場合に限り有効です。

persist_mapping

False

システム名の代わりにデバイスのエイリアス設定を記述します。

dhclient_args

None

DHCP クライアントに渡す引数

dns_servers

None

ブリッジに使用する DNS サーバーのリスト

...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: ovs_bridge
            name: br-bond
            dns_servers: {{ ctlplane_dns_nameservers }}
            domain: {{ dns_search_domains }}
            members:
            - type: ovs_bond
              name: bond1
              mtu: {{ min_viable_mtu }}
              ovs_options: {{ bound_interface_ovs_options }}
              members:
              - type: interface
                name: nic2
                mtu: {{ min_viable_mtu }}
                primary: true
              - type: interface
                name: nic3
                mtu: {{ min_viable_mtu }}
                ...

10.8.4. ネットワークインターフェイスボンディング

複数の物理 NIC をバンドルして、単一の論理チャネルを形成することができます。この設定はボンディングとも呼ばれます。ボンディングを設定して、高可用性システム用の冗長性またはスループットの向上を実現することができます。

Red Hat OpenStack Platform では、Open vSwitch (OVS) カーネルボンディング、OVS-DPDK ボンディング、および Linux カーネルボンディングがサポートされます。

Expand
表10.6 サポート対象のインターフェイスボンディングの種別
ボンディング種別種別の値許可されるブリッジ種別許可されるメンバー

OVS カーネルボンディング

ovs_bond

ovs_bridge

interface

OVS-DPDK ボンディング

ovs_dpdk_bond

ovs_user_bridge

ovs_dpdk_port

Linux カーネルボンディング

linux_bond

ovs_bridge

interface

重要

ovs_bridgeovs_user_bridge を同じノード上で組み合わせないでください。

ovs_bond
Open vSwitch (OVS) で、複数の interfaces を結合するボンディングを定義します。これにより、冗長性や帯域幅が向上します。
Expand
表10.7 ovs_bond オプション
オプションデフォルト説明

name

 

ボンディング名

use_dhcp

False

DHCP を使用して IP アドレスを取得します。

use_dhcpv6

False

DHCP を使用して v6 の IP アドレスを取得します。

addresses

 

ボンディングに割り当てられる IP アドレスのリスト

routes

 

ボンディングに割り当てられるルートのリスト。詳細は、「routes」 を参照してください。

mtu

1500

接続の最大伝送単位 (MTU: Maximum Transmission Unit)

primary

False

プライマリーインターフェイスとしてインターフェイスを定義します。

members

 

ボンディングで使用するインターフェイスオブジェクトのリスト

ovs_options

 

ボンディング作成時に OVS に渡すオプションのセット詳細は、表10.8「OVS ボンディングの ovs_options パラメーター」 を参照してください。

ovs_extra

 

ボンディングのネットワーク設定ファイルで OVS_EXTRA パラメーターとして設定するオプションのセット

defroute

True

DHCP サービスにより提供されるデフォルトのルートを使用します。use_dhcp または use_dhcpv6 を選択した場合に限り有効です。

persist_mapping

False

システム名の代わりにデバイスのエイリアス設定を記述します。

dhclient_args

None

DHCP クライアントに渡す引数

dns_servers

None

ボンディングに使用する DNS サーバーのリスト

Expand
表10.8 OVS ボンディングの ovs_options パラメーター
ovs_option説明

bond_mode=balance-slb

送信元負荷分散 (slb) は、送信元 MAC アドレスと出力 VLAN に基づいてフローのバランスを取り、トラフィックパターンの変化に応じて定期的に再調整します。balance-slb ボンディングオプションを使用して結合を設定する場合は、リモートスイッチで必要な設定はありません。Networking サービス (neutron) は、ソース MAC と VLAN の各ペアをリンクに割り当て、その MAC と VLAN からのすべてのパケットをそのリンクを介して送信します。トラフィックパターンの変化に応じて定期的にリバランスを行う、送信元 MAC アドレスと VLAN の番号に基づいた簡単なハッシュアルゴリズム。balance-slb モードは、Linux ボンディングドライバーで使用されるモード 2 ボンドに似ています。このモードを使用すると、スイッチが LACP を使用するように設定されていない場合でも、負荷分散機能を有効にすることができます。

bond_mode=active-backup

active-backup ボンドモードを使用してボンドを設定すると、Networking サービスは 1 つの NIC をスタンバイ状態に保ちます。アクティブな接続に障害が発生すると、スタンバイ NIC がネットワーク操作を再開します。物理スイッチに提示される MAC アドレスは 1 つのみです。このモードはスイッチ設定を必要とせず、リンクが別のスイッチに接続されている場合に機能します。このモードは、負荷分散機能は提供しません。

lacp=[active | passive | off]

Link Aggregation Control Protocol (LACP) の動作を制御します。LACP をサポートしているのは特定のスイッチのみです。お使いのスイッチが LACP に対応していない場合には bond_mode=balance-slb または bond_mode=active-backup を使用してください。

other-config:lacp-fallback-ab=true

LACP が失敗した場合は、ボンドモードとしてアクティブバックアップを設定します。

other_config:lacp-time=[fast | slow]

LACP のハートビートを 1 秒 (高速) または 30 秒 (低速) に設定します。デフォルトは低速です。

other_config:bond-detect-mode=[miimon | carrier]

リンク検出に miimon ハートビート (miimon) またはモニターキャリア (carrier) を設定します。デフォルトは carrier です。

other_config:bond-miimon-interval=100

miimon を使用する場合には、ハートビートの間隔をミリ秒単位で設定します。

bond_updelay=1000

フラッピングを防止するためにリンクがアクティブになっている必要がある間隔 (ミリ秒) を設定します。

other_config:bond-rebalance-interval=10000

ボンドメンバー間でフローがリバランスする間隔 (ミリ秒) を設定します。この値をゼロに設定すると、ボンドメンバー間のフローのリバランスが無効になります。

例 - OVS ボンディング
...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          ...
            members:
              - type: ovs_bond
                name: bond1
                mtu: {{ min_viable_mtu }}
                ovs_options: {{ bond_interface_ovs_options }}
                members:
                - type: interface
                  name: nic2
                  mtu: {{ min_viable_mtu }}
                  primary: true
                - type: interface
                  name: nic3
                  mtu: {{ min_viable_mtu }}
例 - OVS DPDK ボンディング
この例では、OVS ユーザースペースブリッジの一部としてボンディングが作成されます。
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          ...
            members:
            - type: ovs_user_bridge
              name: br-dpdk0
              members:
              - type: ovs_dpdk_bond
                name: dpdkbond0
                rx_queue: {{ num_dpdk_interface_rx_queues }}
                members:
                - type: ovs_dpdk_port
                  name: dpdk0
                  members:
                  - type: interface
                    name: nic4
                - type: ovs_dpdk_port
                  name: dpdk1
                  members:
                  - type: interface
                    name: nic5

10.8.5. OVS ボンディングモードを備えた LACP

オプションの Link Aggregation Control Protocol (LACP) と Open vSwitch (OVS) ボンディングを組み合わせて使用できます。LACP は動的ボンディングを作成するネゴシエーションプロトコルで、これにより負荷分散機能および耐障害性を持たせることができます。

以下の表を使用して、LACP オプションと組み合わせた OVS カーネルおよび OVS-DPDK ボンディングインターフェイスのサポート互換性を説明します。

重要

制御ネットワークおよびストレージネットワークで OVS ボンディングを使用しないでください。代わりに、VLAN と LACP の Linux ボンディングを使用します。

OVS ボンディングを使用し、更新、ホットフィックスなどのイベントで OVS または neutron エージェントを再起動すると、コントロールプレーンが一時的に中断される可能性があります。

Expand
表10.9 OVS カーネルおよび OVS-DPDK ボンディングモードの LACP オプション

目的

OVS ボンディングモード

互換性のある LACP オプション

備考

高可用性 (active-passive)

active-backup

activepassive、または off

 

スループットの向上 (active-active)

balance-slb

activepassive、または off

  • パフォーマンスは、パケットあたりの追加パース量の影響を受けます。
  • vhost-user ロック競合が生じる可能性があります。

balance-tcp

active または passive

  • balance-slb と同様に、パフォーマンスはパケットあたりの追加パース量の影響を受け、vhost-user ロック競合が生じる可能性があります。
  • LACP を設定して有効にする必要があります。
  • lb-output-action=true を設定します。以下に例を示します。

    ovs-vsctl set port <bond port> other_config:lb-output-action=true

10.8.6. linux_bond

複数の interfaces を結合する Linux ボンディングを定義します。これにより、冗長性や帯域幅が向上します。bonding_options パラメーターには、カーネルベースのボンディングオプションを指定するようにしてください。

Expand
表10.10 linux_bond オプション
オプションデフォルト説明

name

 

ボンディング名

use_dhcp

False

DHCP を使用して IP アドレスを取得します。

use_dhcpv6

False

DHCP を使用して v6 の IP アドレスを取得します。

addresses

 

ボンディングに割り当てられる IP アドレスのリスト

routes

 

ボンディングに割り当てられるルートのリスト。「routes」を参照してください。

mtu

1500

接続の最大伝送単位 (MTU: Maximum Transmission Unit)

members

 

ボンディングで使用するインターフェイスオブジェクトのリスト

bonding_options

 

ボンディングを作成する際のオプションのセット。Linux ボンディングの bonding_options パラメーター を参照してください。

defroute

True

DHCP サービスにより提供されるデフォルトのルートを使用します。use_dhcp または use_dhcpv6 を選択した場合に限り有効です。

persist_mapping

False

システム名の代わりにデバイスのエイリアス設定を記述します。

dhclient_args

None

DHCP クライアントに渡す引数

dns_servers

None

ボンディングに使用する DNS サーバーのリスト

Linux ボンディングの bonding_options パラメーター
bonding_options パラメーターは、Linux ボンディング用の特定のボンディングオプションを設定します。下表の後に記載された Linux ボンディングの例を参照してください。
Expand
bonding_options説明

mode

ボンディングモードを設定します。この例では、802.3ad モードまたは LACP モードです。Linux ボンディングモードの詳細は、Red Hat Enterprise Linux 9 における ネットワークボンディングの設定ネットワークの設定と管理 を参照してください。

lacp_rate

LACP パケットの送信間隔を 1 秒または 30 秒に定義します。

updelay

インターフェイスをトラフィックに使用する前にそのインターフェイスがアクティブである必要のある最低限の時間を定義します。この最小設定は、ポートフラッピングによる停止を軽減するのに役立ちます。

miimon

ドライバーの MIIMON 機能を使用してポートの状態を監視する間隔 (ミリ秒単位)

例 - Linux ボンディング
...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: linux_bond
            name: bond1
            mtu: {{ min_viable_mtu }}
            bonding_options: "mode=802.3ad lacp_rate=fast updelay=1000 miimon=100 xmit_hash_policy=layer3+4"
            members:
              type: interface
              name: ens1f0
              mtu: {{ min_viable_mtu }}
              primary: true
            type: interface
              name: ens1f1
              mtu: {{ min_viable_mtu }}
              ...
例 - Linux ボンディング: 2 つのインターフェイスのボンディング
...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: linux_bond
            name: bond1
            members:
            - type: interface
              name: nic2
            - type: interface
              name: nic3
            bonding_options: "mode=802.3ad lacp_rate=[fast|slow] updelay=1000 miimon=100"
            ...
例 - 1 つの VLAN を持つ active-backup モードに設定された Linux ボンディング
....
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          - type: linux_bond
            name: bond_api
            bonding_options: "mode=active-backup"
            use_dhcp: false
            dns_servers:
              get_param: DnsServers
            members:
            - type: interface
              name: nic3
              primary: true
            - type: interface
              name: nic4

            - type: vlan
              vlan_id: {{ lookup(vars, networks_lower[network] ~ _vlan_id) }}
              device: bond_api
              addresses:
              - ip_netmask:
                  get_param: InternalApiIpSubnet
例 - OVS ブリッジ上の Linux ボンディング
この例では、ボンディングは LACP モードと 1 つの VLAN を持つ 802.3ad に設定されています。
...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          -  type: ovs_bridge
              name: br-tenant
              use_dhcp: false
              mtu: 9000
              members:
                - type: linux_bond
                  name: bond_tenant
                  bonding_options: "mode=802.3ad updelay=1000 miimon=100"
                  use_dhcp: false
                  dns_servers:
                    get_param: DnsServers
                  members:
                  - type: interface
                    name: p1p1
                    primary: true
                  - type: interface
                    name: p1p2
                - type: vlan
                  vlan_id: {get_param: TenantNetworkVlanID}
                  addresses:
                    - ip_netmask: {get_param: TenantIpSubnet}
                    ...

10.8.7. routes

ネットワークインターフェイス、VLAN、ブリッジ、またはボンディングに適用するルートのリストを定義します。

Expand
表10.11 routes オプション
オプションデフォルト説明

ip_netmask

None

接続先ネットワークの IP およびネットマスク

default

False

このルートをデフォルトルートに設定します。ip_netmask: 0.0.0.0/0 の設定と等価です。

next_hop

None

接続先ネットワークに到達するのに使用するルーターの IP アドレス

例 - ルート
...
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
          {%- endfor %}
          {% set min_viable_mtu = mtu_list | max %}
          network_config:
          -  type: ovs_bridge
              name: br-tenant
              ...
              routes: {{ [ctlplane_host_routes] | flatten | unique }}
              ...

10.9. SR-IOV および OVS-DPDK 用の edpm-ansible 変数

このセクションでは、OVS-DPDK と SR-IOV が edpm-ansible 変数を使用して、Red Hat OpenStack Services on OpenShift (RHOSO) データプレーンノードで最適なパフォーマンスを得るために CPU とメモリーを設定する方法を説明します。この情報を使用して、コンピュートノード上のハードウェアサポートを評価し、ハードウェアをパーティション分割して OVS-DPDK および SR-IOV デプロイメントを最適化する方法を説明します。

注記

CPU コアを割り当てる際には必ず、同じ物理コア上の CPU シブリングスレッド (あるいは論理 CPU) をペアにしてください。

Compute ノード上の CPU と NUMA ノードを特定する方法の詳細は、NUMA ノードのトポロジーの理解 を参照してください。この情報を使用して、CPU と他のパラメーターをマッピングして、ホスト、ゲストインスタンス、OVS-DPDK プロセスのニーズに対応します。

10.9.1. データプレーン (EDPM) Ansible 変数

以下の変数は、データプレーン (EDPM) Ansible ロールに含まれており、OVS-DPDK および SR-IOV の Red Hat OpenStack Services on OpenShift (RHOSO) データプレーンノードで最適なパフォーマンスを得られるように、このロールをカスタムリソース (CR) で使用して CPU とメモリーを設定します。

edpm_ovs_dpdk
OVS-DPDK の edpm Ansible 変数で定義された値を使用して、OVS-DPDK 設定を追加、変更、および削除できます。
edpm_ovs_dpdk_pmd_core_list
DPDK Poll Mode Driver (PMD) に使用する CPU コアを提供します。DPDK インターフェイスのローカルの NUMA ノードに関連付けられた CPU コアを選択します。
edpm_ovs_dpdk_enable_tso

DPDK 機能の TCP セグメンテーションオフロード (TSO) を有効 (true) または無効 (false) にします。デフォルトは false です。

警告

この機能の内容は、このリリースでは ドキュメントプレビュー として提供されているため、Red Hat で完全には検証していません。テスト用にのみ使用し、実稼働環境では使用しないでください。

edpm_tuned_profile
カスタム TuneD プロファイルの名前。デフォルト値は throughput-performance です。
edpm_tuned_isolated_cores
ホストのプロセスから分離される CPU コアのセット。
edpm_ovs_dpdk_socket_memory

NUMA ノードごとにヒュージページプールから事前に割り当てるメモリーの容量を MB 単位で指定します。dpm_ovs_dpdk_socket_memory は、OVS の other_config:dpdk-socket-mem の値です。

  • コンマ区切りリストで指定します。
  • DPDK NIC がない NUMA ノードの場合は、静的値 1024 MB (1 GB) を使用します。
  • NUMA ノード上の各 NIC の MTU 値から edpm_ovs_dpdk_socket_memory の値を計算します。この値は次の式で概算します。

    MEMORY_REQD_PER_MTU = (ROUNDUP_PER_MTU + 800) * (4096 * 64) Bytes
    • 800 はオーバーヘッドの値です。
    • 4096 * 64 は mempool 内のパケット数です。
  • NUMA ノードに設定されている各 MTU 値に MEMORY_REQD_PER_MTU を加算し、さらに 512MB をバッファーとして加算します。その値を 1024 の倍数に丸めます。
edpm_ovs_dpdk_memory_channels

NUMA ノードごとに CPU 内のメモリーチャネルをマップします。edpm_ovs_dpdk_memory_channels は、OVS の other_config:dpdk-extra="-n <value>" の値です。

  • dmidecode -t memory のコマンドを使用するか、お使いのハードウェアのマニュアルを参照して、利用可能なメモリーチャネルの数を確認します。
  • ls /sys/devices/system/node/node* -d のコマンドで NUMA ノードの数を確認します。
  • 利用可能なメモリーチャネル数を NUMA ノード数で除算します。
edpm_ovs_dpdk_vhost_postcopy_support
OVS-DPDK vhost のポストコピーサポートを有効または無効にします。これを true に設定すると、すべての vhost ユーザークライアントポートでポストコピーサポートが有効になります。
edpm_nova_libvirt_qemu_group
edpm_nova_libvirt_qemu_grouphugetlbfs に設定すると、ovs-vswitchd プロセスと qemu プロセスが、共有 huge page と、virtio-net device を設定する UNIX ソケットにアクセスできるようになります。この値はロールに固有で、OVS-DPDK を利用するすべてのロールに適用する必要があります。
edpm_ovn_bridge_mappings
ブリッジと dpdk ポートのマッピングのリスト。
edpm_kernel_args
コンピュートノードのブート時用に、複数のカーネル引数を /etc/default/grub に指定します。

10.9.2. Configuration map パラメーター

カスタムリソース (CR) の ConfigMap セクションで以下のパラメーターを設定すると、OVS-DPDK および SR-IOV の Red Hat OpenStack Services on OpenShift (RHOSO) データプレーンノードで CPU とメモリーが最適なパフォーマンスを発揮するように設定できます。

cpu_shared_set
共有エミュレータースレッドポリシー (hw::emulator_threads_policy=share) が設定されたインスタンスについて、インスタンスのエミュレータースレッドをオフロードするホスト CPU を決定するために使用するホスト CPU コアのリストまたは範囲。
cpu_dedicated_set

ピニングされたインスタンス CPU のプロセスをスケジューリングできる物理ホスト CPU 番号のコンマ区切りリストまたは範囲。

  • edpm_ovs_dpdk_pmd_core_list からすべてのコアを除外します。
  • 残りのコアをすべて追加します。
  • シブリングスレッドをペアにします。
reserved_host_memory_mb
ホスト上のタスク用にメモリーを MB 単位で確保します。静的値 4096MB を使用します。

10.10. NFV のカスタムネットワークインターフェイスの例

次の例は、テンプレートを使用して、Red Hat OpenStack Services on OpenShift (RHOSO) 環境の NFV のネットワークインターフェイスをカスタマイズする方法を示しています。

10.10.1. サンプルテンプレート - 分割されていない NIC

このサンプルテンプレートでは、分割されていない NIC 上に RHOSO ネットワークを設定します。

apiVersion: v1
data:
 25-igmp.conf: |
   [ovs]
   igmp_snooping_enable = True
kind: ConfigMap
metadata:
 name: neutron-igmp
 namespace: openstack
---
apiVersion: v1
data:
 25-cpu-pinning-nova.conf: |
   [DEFAULT]
   reserved_host_memory_mb = 4096
   [compute]
   cpu_shared_set = "0,20,1,21"
   cpu_dedicated_set = "8-19,28-39"
   [neutron]
   physnets = dpdkdata1
   [neutron_physnet_dpdkdata1]
   numa_nodes = 1
   [libvirt]
   cpu_power_management=false
kind: ConfigMap
metadata:
 name: ovs-dpdk-sriov-cpu-pinning-nova
 namespace: openstack
---
apiVersion: v1
data:
 03-sriov-nova.conf: |
   [pci]
   device_spec = {"address": "0000:05:00.2", "physical_network":"sriov-1", "trusted":"true"}
   device_spec = {"address": "0000:05:00.3", "physical_network":"sriov-2", "trusted":"true"}
   device_spec = {"address": "0000:07:00.0", "physical_network":"sriov-3", "trusted":"true"}
   device_spec = {"address": "0000:07:00.1", "physical_network":"sriov-4", "trusted":"true"}
kind: ConfigMap
metadata:
 name: sriov-nova
 namespace: openstack
---
apiVersion: v1
data:
 NodeRootPassword: cmVkaGF0Cg==
kind: Secret
metadata:
 name: baremetalset-password-secret
 namespace: openstack
type: Opaque
---
apiVersion: v1
data:
 authorized_keys: ZWNkc2Etc2hhMi1uaXN0cDUyMSBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEExTWpFQUFBQUlibWx6ZEhBMU1qRUFBQUNGQkFBVFdweE5LNlNYTEo0dnh2Y0F4N0t4c3FLenI0a3pEalRpT0dQa3pyZWZnTjdVcmo2RUZPUXlBRWk5cXNnYkRVYXp0MktpdzJqc3djbG5TYW1zUDE0V2x3RkN2a1NuU1o4cTZwWGJTbGpNa3Z1R3FiVXZoSTVxTVlMTDNlRWpyU21nNDlWcTBWZkdFQmxIWUx6TGFncVBlN1FKR0NCMGlWTVk5b3N0TFdPM1NKbXVuZz09IGNpZm13X3JlcHJvZHVjZXJfa2V5Cg==
 ssh-privatekey: LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFyQUFBQUJObFkyUnpZUwoxemFHRXlMVzVwYzNSd05USXhBQUFBQ0c1cGMzUndOVEl4QUFBQWhRUUFFMXFjVFN1a2x5eWVMOGIzQU1leXNiS2lzNitKCk13NDA0amhqNU02M240RGUxSzQraEJUa01nQkl2YXJJR3cxR3M3ZGlvc05vN01ISlowbXByRDllRnBjQlFyNUVwMG1mS3UKcVYyMHBZekpMN2hxbTFMNFNPYWpHQ3k5M2hJNjBwb09QVmF0Rlh4aEFaUjJDOHkyb0tqM3UwQ1JnZ2RJbFRHUGFMTFMxagp0MGlacnA0QUFBRVl0cGNtdHJhWEpyWUFBQUFUWldOa2MyRXRjMmhoTWkxdWFYTjBjRFV5TVFBQUFBaHVhWE4wY0RVeU1RCkFBQUlVRUFCTmFuRTBycEpjc25pL0c5d0RIc3JHeW9yT3ZpVE1PTk9JNFkrVE90NStBM3RTdVBvUVU1RElBU0wycXlCc04KUnJPM1lxTERhT3pCeVdkSnFhdy9YaGFYQVVLK1JLZEpueXJxbGR0S1dNeVMrNGFwdFMrRWptb3hnc3ZkNFNPdEthRGoxVwpyUlY4WVFHVWRndk10cUNvOTd0QWtZSUhTSlV4ajJpeTB0WTdkSW1hNmVBQUFBUWdHTWZobWFSblZFcnhjZ2Z6aVRpdzFnClBjYXBBV21TMHh5dDNyclhoSnExd0pRMys3ZFp0Y3l0alg5VVVuNnh0NlE1M0JTT1ZvaWR2L2pZK2krYytNVVhUZ0FBQUIKUmphV1p0ZDE5eVpYQnliMlIxWTJWeVgydGxlUUVDQXdRRkJnPT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCg==
 ssh-publickey: ZWNkc2Etc2hhMi1uaXN0cDUyMSBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEExTWpFQUFBQUlibWx6ZEhBMU1qRUFBQUNGQkFBVFdweE5LNlNYTEo0dnh2Y0F4N0t4c3FLenI0a3pEalRpT0dQa3pyZWZnTjdVcmo2RUZPUXlBRWk5cXNnYkRVYXp0MktpdzJqc3djbG5TYW1zUDE0V2x3RkN2a1NuU1o4cTZwWGJTbGpNa3Z1R3FiVXZoSTVxTVlMTDNlRWpyU21nNDlWcTBWZkdFQmxIWUx6TGFncVBlN1FKR0NCMGlWTVk5b3N0TFdPM1NKbXVuZz09IGNpZm13X3JlcHJvZHVjZXJfa2V5Cg==
kind: Secret
metadata:
 name: dataplane-ansible-ssh-private-key-secret
 namespace: openstack
type: Opaque
---
apiVersion: v1
data:
 LibvirtPassword: MTIzNDU2Nzg=
kind: Secret
metadata:
 name: libvirt-secret
 namespace: openstack
type: Opaque
---
apiVersion: v1
data:
 ssh-privatekey: LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFyQUFBQUJObFkyUnpZUwoxemFHRXlMVzVwYzNSd05USXhBQUFBQ0c1cGMzUndOVEl4QUFBQWhRUUFwWTlSRzV5a2pLR3p2c295dWlDZm1zakEwZkFYCmkvS0hQT3R3Zm9NZjRQZXpRSFFNOHFJZ0pGc0svaVlwNVJIWmNVQlcwVVBCNnBpazQ1L3k0QVF4bmVBQWRrN0JQbTc0dG8KSkxoVjY2U3pzV2pHR1NFdzVXVFBwVUVpaXdQMlNiL1l4dXloNWlLbUJyTE5SRWpYTEJvbjJJZWRBbEJMaC9FaGpkdFZjUwo5ZzczQ0tvQUFBRVFoeS9PODRjdnp2TUFBQUFUWldOa2MyRXRjMmhoTWkxdWFYTjBjRFV5TVFBQUFBaHVhWE4wY0RVeU1RCkFBQUlVRUFLV1BVUnVjcEl5aHM3N0tNcm9nbjVySXdOSHdGNHZ5aHp6cmNINkRIK0QzczBCMERQS2lJQ1JiQ3Y0bUtlVVIKMlhGQVZ0RkR3ZXFZcE9PZjh1QUVNWjNnQUhaT3dUNXUrTGFDUzRWZXVrczdGb3hoa2hNT1ZrejZWQklvc0Q5a20vMk1icwpvZVlpcGdheXpVUkkxeXdhSjlpSG5RSlFTNGZ4SVkzYlZYRXZZTzl3aXFBQUFBUWdEQ0lEdHFqZ0JNam8rbG1rRnhzV3NvCkxKOGxBSWF0a0ZTdDkxcGJHWWIrVFRnS0NSOGhqbXdjalNoRzFlNlRaZWZNTkc5TklzVlRYYjNjTkYvaThJTHV1UUFBQUEKNXViM1poSUcxcFozSmhkR2x2YmdFQ0F3UT0KLS0tLS1FTkQgT1BFTlNTSCBQUklWQVRFIEtFWS0tLS0tCg==
 ssh-publickey: ZWNkc2Etc2hhMi1uaXN0cDUyMSBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEExTWpFQUFBQUlibWx6ZEhBMU1qRUFBQUNGQkFDbGoxRWJuS1NNb2JPK3lqSzZJSitheU1EUjhCZUw4b2M4NjNCK2d4L2c5N05BZEF6eW9pQWtXd3IrSmlubEVkbHhRRmJSUThIcW1LVGpuL0xnQkRHZDRBQjJUc0UrYnZpMmdrdUZYcnBMT3hhTVlaSVREbFpNK2xRU0tMQS9aSnY5akc3S0htSXFZR3NzMUVTTmNzR2lmWWg1MENVRXVIOFNHTjIxVnhMMkR2Y0lxZz09IG5vdmEgbWlncmF0aW9uCg==
kind: Secret
metadata:
 name: nova-migration-ssh-key
 namespace: openstack
type: kubernetes.io/ssh-auth
---
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
 name: openstack-edpm
 namespace: openstack
spec:
 baremetalSetTemplate:
   bmhLabelSelector:
     app: openstack
   cloudUserName: cloud-admin
   ctlplaneInterface: enp130s0f0
   passwordSecret:
     name: baremetalset-password-secret
     namespace: openstack
   provisioningInterface: enp5s0
 env:
 - name: ANSIBLE_FORCE_COLOR
   value: "True"
 networkAttachments:
 - ctlplane
 nodeTemplate:
   ansible:
     ansiblePort: 22
     ansibleUser: cloud-admin
     ansibleVars:
       dns_search_domains: []
       rhc_release: 9.4
       rhc_repositories:
         - {name: "*", state: disabled}
         - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled}
         - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled}
         - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled}
         - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled}
         - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled}
         - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled}
       edpm_fips_mode: check
       edpm_kernel_args: default_hugepagesz=1GB hugepagesz=1G hugepages=64 iommu=pt
         intel_iommu=on tsx=off isolcpus=2-19,22-39
       edpm_network_config_hide_sensitive_logs: false
       edpm_network_config_os_net_config_mappings:
         edpm-compute-0:           
1

           dmiString: system-product-name
           id: PowerEdge R730
           nic1: eno1
           nic2: eno2
           nic3: enp130s0f0
           nic4: enp130s0f1
           nic5: enp130s0f2
           nic6: enp130s0f3
           nic7: enp5s0f0
           nic8: enp5s0f1
           nic9: enp5s0f2
           nic10: enp5s0f3
           nic11: enp7s0f0np0
           nic12: enp7s0f1np1
         edpm-compute-1:             
2

           dmiString: system-product-name
           id: PowerEdge R730
           nic1: eno1
           nic2: eno2
           nic3: enp130s0f0
           nic4: enp130s0f1
           nic5: enp130s0f2
           nic6: enp130s0f3
           nic7: enp5s0f0
           nic8: enp5s0f1
           nic9: enp5s0f2
           nic10: enp5s0f3
           nic11: enp7s0f0np0
           nic12: enp7s0f1np1
       edpm_network_config_template: |
         ---
         {% set mtu_list = [ctlplane_mtu] %}
         {% for network in nodeset_networks %}
         {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
         {%- endfor %}
         {% set min_viable_mtu = mtu_list | max %}
         network_config:
         - type: interface
           name: nic1
           use_dhcp: false
         - type: interface
           name: nic2
           use_dhcp: false
         - type: linux_bond        
3

           name: bond_api
           use_dhcp: false
           bonding_options: "mode=active-backup"
           dns_servers: {{ ctlplane_dns_nameservers }}
           members:
             - type: interface
               name: nic3
               primary: true
           addresses:
           - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
           routes:
           - default: true
             next_hop: {{ ctlplane_gateway_ip }}
         - type: vlan              
4

           vlan_id: {{ lookup(vars, networks_lower[internalapi] ~ _vlan_id) }}
           device: bond_api
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[internalapi] ~ _ip) }}/{{ lookup(vars, networks_lower[internalapi] ~ _cidr) }}
         - type: vlan              
5

           vlan_id: {{ lookup(vars, networks_lower[storage] ~ _vlan_id) }}
           device: bond_api
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[storage] ~ _ip) }}/{{ lookup(vars, networks_lower[storage] ~ _cidr) }}
         - type: ovs_user_bridge   
6

           name: br-link0
           use_dhcp: false
           ovs_extra: "set port br-link0 tag={{ lookup(vars, networks_lower[tenant] ~ _vlan_id) }}"
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[tenant] ~ _ip) }}/{{ lookup(vars, networks_lower[tenant] ~ _cidr) }}
           mtu: {{ lookup(vars, networks_lower[tenant] ~ _mtu) }}
           members:
           - type: ovs_dpdk_bond
             name: dpdkbond0
             mtu: 9000
             rx_queue: 2
             ovs_extra: "set port dpdkbond0 bond_mode=balance-slb"
             members:
             - type: ovs_dpdk_port
               name: dpdk0
               members:
               - type: interface
                 name: nic7
             - type: ovs_dpdk_port
               name: dpdk1
               members:
               - type: interface
                 name: nic8
         - type: ovs_user_bridge
           name: br-dpdk0
           mtu: 9000
           use_dhcp: false
           members:
           - type: ovs_dpdk_bond
             name: dpdkbond1
             mtu: 9000
             rx_queue: 3
             ovs_options: "bond_mode=balance-tcp lacp=active other_config:lacp-time=fast other-config:lacp-fallback-ab=true other_config:lb-output-action=true"
             members:
               - type: ovs_dpdk_port
                 name: dpdk2
                 members:
                   - type: interface
                     name: nic5
               - type: ovs_dpdk_port
                 name: dpdk3
                 members:
                   - type: interface
                     name: nic6
         - type: ovs_user_bridge
           name: br-dpdk1
           mtu: 9000
           use_dhcp: false
           members:
             - type: ovs_dpdk_port
               name: dpdk4
               mtu: 9000
               rx_queue: 3
               members:
                 - type: interface
                   name: nic4
         - type: sriov_pf          
7

           name: nic9
           numvfs: 10              
8

           mtu: 9000
           use_dhcp: false
           promisc: true
         - type: sriov_pf
           name: nic10
           numvfs: 10
           mtu: 9000
           use_dhcp: false
           promisc: true
         - type: sriov_pf          
9

           name: nic11
           numvfs: 5               
10

           mtu: 9000
           use_dhcp: false
           promisc: true
         - type: sriov_pf          
11

           name: nic12
           numvfs: 5               
12

           mtu: 9000
           use_dhcp: false
           promisc: true
       edpm_neutron_sriov_agent_SRIOV_NIC_physical_device_mappings: sriov-1:enp5s0f2,sriov-2:enp5s0f3,sriov-3:enp7s0f0np0,sriov-4:enp7s0f1np1
       edpm_nodes_validation_validate_controllers_icmp: false
       edpm_nodes_validation_validate_gateway_icmp: false
       edpm_nova_libvirt_qemu_group: hugetlbfs
       edpm_ovn_bridge_mappings:
       - dpdkmgmt:br-link0
       - dpdkdata0:br-dpdk0
       - dpdkdata1:br-dpdk1
       edpm_ovs_dpdk_memory_channels: "4"
       edpm_ovs_dpdk_pmd_auto_lb: "true"
       edpm_ovs_dpdk_pmd_core_list: 2,3,4,5,6,7,22,23,24,25,26,27
       edpm_ovs_dpdk_pmd_improvement_threshold: "25"
       edpm_ovs_dpdk_pmd_load_threshold: "70"
       edpm_ovs_dpdk_pmd_rebal_interval: "2"
       edpm_ovs_dpdk_socket_memory: 4096,4096
       edpm_ovs_dpdk_vhost_postcopy_support: "true"
       edpm_selinux_mode: enforcing
       edpm_sshd_allowed_ranges:
       - 192.168.122.0/24
       edpm_sshd_configure_firewall: true
       edpm_tuned_isolated_cores: 2-19,22-39
       edpm_tuned_profile: cpu-partitioning-powersave
       enable_debug: false
       gather_facts: false
       neutron_physical_bridge_name: br-access
       neutron_public_interface_name: nic1
       service_net_map:
         nova_api_network: internalapi
         nova_libvirt_network: internalapi
       timesync_ntp_servers:
       - hostname: clock.redhat.com
   ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
   managementNetwork: ctlplane
   networks:
   - defaultRoute: true
     name: ctlplane
     subnetName: subnet1
   - name: internalapi
     subnetName: subnet1
   - name: storage
     subnetName: subnet1
   - name: tenant
     subnetName: subnet1
 nodes:
   edpm-compute-0:
     hostName: compute-0
   edpm-compute-1:
     hostName: compute-1
 preProvisioned: false
 services:
 - redhat
 - bootstrap
 - download-cache
 - reboot-os
 - configure-ovs-dpdk
 - configure-network
 - validate-network
 - install-os
 - configure-os
 - ssh-known-hosts
 - run-os
 - install-certs
 - ovn
 - neutron-ovn-igmp
 - neutron-metadata
 - neutron-sriov
 - libvirt
 - nova-custom-ovsdpdksriov
 - telemetry
---
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneService
metadata:
 name: neutron-ovn-igmp
 namespace: openstack
spec:
 caCerts: combined-ca-bundle
 dataSources:
 - configMapRef:
     name: neutron-igmp
 - secretRef:
     name: neutron-ovn-agent-neutron-config
 edpmServiceType: neutron-ovn
 label: neutron-ovn-igmp
 playbook: osp.edpm.neutron_ovn
 tlsCerts:
   default:
     contents:
     - dnsnames
     - ips
     issuer: osp-rootca-issuer-ovn
     keyUsages:
     - digital signature
     - key encipherment
     - client auth
     networks:
     - ctlplane
---
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneService
metadata:
 name: nova-custom-ovsdpdksriov
 namespace: openstack
spec:
 caCerts: combined-ca-bundle
 dataSources:
 - configMapRef:
     name: ovs-dpdk-sriov-cpu-pinning-nova
 - configMapRef:
     name: sriov-nova
 - secretRef:
     name: nova-cell1-compute-config
 - secretRef:
     name: nova-migration-ssh-key
 edpmServiceType: nova
 label: nova-custom-ovsdpdksriov
 playbook: osp.edpm.nova
 tlsCerts:
   default:
     contents:
     - dnsnames
     - ips
     issuer: osp-rootca-issuer-internal
     networks:
     - ctlplane
1 2
edpm-compute-n: 実際の NIC をマップするための edpm_network_config_os_net_config_mappings 変数を定義します。各 NIC を識別するには、RHOSO の os-net-config ツールが使用する NIC ID (通常は `nic` n) に各コンピュートノードの MAC アドレスまたはデバイス名を指定します。
3
linux_bond: 分離ネットワーク用のコントロールプレーンの Linux ボンディングを作成します。この例では、nic3nic4 に active-backup モードで Linux ボンディングを作成します。
4 5
type: vlan: Linux ボンディングに VLAN を割り当てます。この例では、internalapi および storage ネットワークの VLAN ID を bond-api に割り当てます。
6
ovs_user_bridge: OVS-DPDK ポートでブリッジを設定します。この例では、テナントネットワークの nic7nic8 に対応する 2 つの DPDK ポートを持つ DPDK ボンディングを使用して OVS ユーザーブリッジを作成します。GENEVE トンネルを使用します。
7 9 11
sriov_pf: SR-IOV VF を作成します。この例では、sriov_pf のインターフェイスタイプを、ホストが使用できる物理機能として設定します。
8 10 12
numvfs: 必要な VF の数のみを設定します。

10.10.2. サンプルテンプレート - 分割された NIC

このサンプルテンプレートでは、分割された NIC 上に RHOSO ネットワークを設定します。この例では、カスタムリソース (CR) 定義のうち、NIC が分割されている部分のみを示しています。

       edpm_network_config_os_net_config_mappings:
         dellr750:
           dmiString: system-product-name
           id: PowerEdge R750
           nic1: eno8303
           nic2: ens1f0
           nic3: ens1f1
           nic4: ens1f2
           nic5: ens1f3
           nic6: ens2f0np0
           nic7: ens2f1np1
       edpm_network_config_template: |
         ---
         {% set mtu_list = [ctlplane_mtu] %}
         {% for network in nodeset_networks %}
         {{ mtu_list.append(lookup(vars, networks_lower[network] ~ _mtu)) }}
         {%- endfor %}
         {% set min_viable_mtu = mtu_list | max %}
         network_config:
         - type: interface
           name: nic1
           use_dhcp: false
         - type: interface
           name: nic2
           use_dhcp: false
           addresses:
           - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
           routes:
           - default: true
             next_hop: {{ ctlplane_gateway_ip }}
         - type: sriov_pf
           name: nic3
           mtu: 9000
           numvfs: 5
           use_dhcp: false
           defroute: false
           nm_controlled: true
           hotplug: true
         - type: sriov_pf
           name: nic4
           mtu: 9000
           numvfs: 5
           use_dhcp: false
           defroute: false
           nm_controlled: true
           hotplug: true
         - type: linux_bond
           name: bond_api
           use_dhcp: false
           bonding_options: "mode=active-backup"
           dns_servers: {{ ctlplane_dns_nameservers }}
           members:
           - type: sriov_vf
             device: nic3
             vfid: 0
             vlan_id: {{ lookup(vars, networks_lower[internalapi] ~ _vlan_id) }}
           - type: sriov_vf
             device: nic4
             vfid: 0
             vlan_id: {{ lookup(vars, networks_lower[internalapi] ~ _vlan_id) }}
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[internalapi] ~ _ip) }}/{{ lookup(vars, networks_lower[internalapi] ~ _cidr) }}
         - type: linux_bond
           name: storage_bond
           use_dhcp: false
           bonding_options: "mode=active-backup"
           dns_servers: {{ ctlplane_dns_nameservers }}
           members:
           - type: sriov_vf
             device: nic3
             vfid: 1
             vlan_id: {{ lookup(vars, networks_lower[storage] ~ _vlan_id) }}
           - type: sriov_vf
             device: nic4
             vfid: 1
             vlan_id: {{ lookup(vars, networks_lower[storage] ~ _vlan_id) }}
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[storage] ~ _ip) }}/{{ lookup(vars, networks_lower[storage] ~ _cidr) }}
         - type: linux_bond
           name: mgmtst_bond
           use_dhcp: false
           bonding_options: "mode=active-backup"
           dns_servers: {{ ctlplane_dns_nameservers }}
           members:
           - type: sriov_vf
             device: nic3
             vfid: 2
             vlan_id: {{ lookup(vars, networks_lower[storagemgmt] ~ _vlan_id) }}
           - type: sriov_vf
             device: nic4
             vfid: 2
             vlan_id: {{ lookup(vars, networks_lower[storagemgmt] ~ _vlan_id) }}
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[storagemgmt] ~ _ip) }}/{{ lookup(vars, networks_lower[storagemgmt] ~ _cidr) }}
         - type: ovs_user_bridge
           name: br-link0
           use_dhcp: false
           mtu: 9000
           ovs_extra: "set port br-link0 tag={{ lookup(vars, networks_lower[tenant] ~ _vlan_id) }}"
           addresses:
           - ip_netmask: {{ lookup(vars, networks_lower[tenant] ~ _ip) }}/{{ lookup(vars, networks_lower[tenant] ~ _cidr) }}
           members:
           - type: ovs_dpdk_bond
             name: dpdkbond0
             mtu: 9000
             rx_queue: 1
             members:
             - type: ovs_dpdk_port
               name: dpdk0
               members:
               - type: sriov_vf
                 device: nic3
                 vfid: 3
             - type: ovs_dpdk_port
               name: dpdk1
               members:
               - type: sriov_vf
                 device: nic4
                 vfid: 3
         - type: ovs_user_bridge
           name: br-dpdk0
           use_dhcp: false
           mtu: 9000
           rx_queue: 1
           members:
             - type: ovs_dpdk_port
               name: dpdk2
               members:
                 - type: interface
                   name: nic5
         - type: sriov_pf
           name: nic6
           mtu: 9000
           numvfs: 5
           use_dhcp: false
           defroute: false
         - type: sriov_pf
           name: nic7
           mtu: 9000
           numvfs: 5
           use_dhcp: false
           defroute: false

10.11. データプレーンのデプロイ

OpenStackDataPlaneDeployment CRD を使用して、データプレーンノード上のサービスを設定し、データプレーンをデプロイします。OpenStackDataPlaneDeployment カスタムリソース (CR) を作成して、データプレーンでの Ansible の実行を制御します。OpenStackDataPlaneDeployment CR は、それぞれ 1 つの Ansible 実行をモデル化します。

OpenStackDataPlaneDeployment の実行が正常に完了すると、OpenStackDataPlaneDeployment または関連する OpenStackDataPlaneNodeSet リソースが変更されても、Ansible は自動的に再実行されません。別の Ansible 実行を開始するには、別の OpenStackDataPlaneDeployment CR を作成する必要があります。

OpenStackDataPlaneNodeSet CR をデプロイする OpenStackDataPlaneDeployment (CR) を作成します。

手順

  1. ワークステーションに openstack_data_plane_deploy.yaml という名前のファイルを作成し、OpenStackDataPlaneDeployment CR を定義します。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: openstack-data-plane 
    1
    1
    OpenStackDataPlaneDeployment CR 名は一意である必要があり、小文字の英数字、- (ハイフン)、または . (ピリオド) が含まれ、先頭と末尾は英数字である必要があります。この例の名前を、デプロイメント内のノードセットを反映する名前に更新します。
  2. デプロイするすべての OpenStackDataPlaneNodeSet CR を追加します。

    spec:
      nodeSets:
        - openstack-data-plane
        - <nodeSet_name>
        - ...
        - <nodeSet_name>
      services:
      ...
    • & lt;nodeSet_name > をデータプレーンのデプロイメントに追加する OpenStackDataPlaneNodeSet CR の名前( openstack_preprovisioned_node_set.yaml または openstack_unprovisioned_node_set.yaml など)に置き換えます。
  3. openstack_data_plane_deploy.yaml デプロイメントファイルを保存します。
  4. データプレーンをデプロイします。

    $ oc create -f openstack_data_plane_deploy.yaml -n openstack

    デプロイメントの実行中に Ansible ログを表示できます。

    $ oc get pod -l app=openstackansibleee -w
    $ oc logs -l app=openstackansibleee -f --max-log-requests 10
  5. データプレーンがデプロイされていることを確認します。

    $ oc get openstackdataplanedeployment -n openstack
    出力例
    NAME                   STATUS   MESSAGE
    openstack-data-plane   True     Setup Complete
  6. NodeSet Ready メッセージが表示されるまで、oc get コマンドを繰り返します。

    $ oc get openstackdataplanenodeset -n openstack
    出力例
    NAME                   STATUS   MESSAGE
    openstack-data-plane   True     NodeSet Ready

    返されるステータスの意味は、データプレーンの状態 を参照してください。

    データプレーンがデプロイされていないことをステータスが示している場合は、デプロイメントのトラブルシューティングを行います。詳細は、データプレーンの作成とデプロイのトラブルシューティング を参照してください。

  7. Compute ノードを、それが接続されている Compute セルにマップします。

    $ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose

    追加のセルを作成しなかった場合は、このコマンドによって Compute ノードが cell1 にマップされます。

検証

  • openstackclient Pod のリモートシェルにアクセスし、デプロイされた Compute ノードがコントロールプレーンに表示されることを確認します。

    $ oc rsh -n openstack openstackclient
    $ openstack hypervisor list

10.12. データプレーンの状態

各データプレーンリソースには、status サブリソース内に、デプロイの進行状況など、リソースの全体的な状態を示す一連の状態があります。

OpenStackDataPlaneNodeSet の場合は、OpenStackDataPlaneDeployment が開始して正常に終了するまで、Ready 状態が False になります。デプロイが成功すると、Ready 状態が True に設定されます。その後デプロイすると、デプロイが成功するまで、Ready 状態が False に設定されます。デプロイが成功すると、Ready 状態が True に設定されます。

Expand
表10.12 OpenStackDataPlaneNodeSet CR の状態
状態説明

Ready

  • "True": OpenStackDataPlaneNodeSet CR が正常にデプロイされました。
  • "False": デプロイがまだ要求されていないか、失敗したか、またはその他の失敗状態になっています。

SetupReady

"True": リソースのすべてのセットアップタスクが完了しています。セットアップタスクには、SSH 鍵シークレットの検証、リソースの他のフィールドの検証、各リソースの Ansible インベントリーの作成があります。各サービス固有の状態は、そのサービスのデプロイが完了すると、"True" に設定されます。サービスの状態をチェックすると、デプロイが完了したサービスや失敗したサービスを確認できます。

DeploymentReady

"True": NodeSet が正常にデプロイされました。

InputReady

"True": 必要な入力が利用可能で準備ができています。

NodeSetDNSDataReady

"True": DNSData リソースの準備ができています。

NodeSetIPReservationReady

"True": IPSet リソースの準備ができています。

NodeSetBaremetalProvisionReady

"True": ベアメタルノードがプロビジョニングされ、準備ができています。

Expand
表10.13 OpenStackDataPlaneNodeSet の status フィールド
status フィールド説明

Deployed

  • "True": OpenStackDataPlaneNodeSet CR が正常にデプロイされました。
  • "False": デプロイがまだ要求されていないか、失敗したか、またはその他の失敗状態になっています。

DNSClusterAddresses

 

CtlplaneSearchDomain

 
Expand
表10.14 OpenStackDataPlaneDeployment CR の状態
状態説明

Ready

  • "True": データプレーンが正常にデプロイされました。
  • "False": データプレーンのデプロイが失敗したか、その他の失敗状態になっています。

DeploymentReady

"True": データプレーンが正常にデプロイされました。

InputReady

"True": 必要な入力が利用可能で準備ができています。

<NodeSet> Deployment Ready

"True": 指定された名前の NodeSet のデプロイが成功し、NodeSet のすべてのサービスが成功したことを示しています。

<NodeSet> <Service> Deployment Ready

"True": 指定された名前の NodeSet および Service のデプロイが成功しました。各 <NodeSet> <Service> Deployment Ready 固有の状態は、指定された名前の NodeSet の該当するサービスが正常に完了すると、"True" に設定されます。NodeSet のすべてのサービスが完了すると、<NodeSet> Deployment Ready 状態は "True" に設定されます。サービスの状態は、どのサービスでデプロイメントが完了したか、またはどのサービスがどの NodeSets で失敗したかを示します。

Expand
表10.15 OpenStackDataPlaneDeployment の status フィールド
status フィールド説明

Deployed

  • "True": データプレーンが正常にデプロイされました。すべての NodeSet のすべてのサービスが成功しました。
  • "False": デプロイがまだ要求されていないか、失敗したか、またはその他の失敗状態になっています。
Expand
表10.16 OpenStackDataPlaneService CR の状態
状態説明

Ready

"True": サービスが作成され、使用できる状態です。"False": サービスの作成に失敗しました。

10.13. データプレーンの作成とデプロイのトラブルシューティング

サービスが正しくデプロイまたは動作していない場合、デプロイのトラブルシューティングを行うには、サービスのジョブ状態メッセージを確認し、ノードセットのログを確認します。

10.13.1. サービスのジョブ状態メッセージの確認

環境内の各データプレーンデプロイメントには、関連するサービスがあります。これらの各サービスには、そのサービスに対して実行されている AnsibleEE ジョブの現在のステータスに対応するジョブ状態メッセージがあります。この情報は、サービスが正しくデプロイまたは動作していない場合に、デプロイメントのトラブルシューティングを行うために使用できます。

手順

  1. すべてのデプロイメントの名前とステータスを確認します。

    $ oc get openstackdataplanedeployment

    次の出力例は、2 つのデプロイメントが現在進行中であることを示しています。

    $ oc get openstackdataplanedeployment
    
    NAME                   NODESETS             STATUS   MESSAGE
    edpm-compute   ["openstack-edpm-ipam"]   False    Deployment in progress
  2. Ansible 実行ジョブを取得して検査します。

    Kubernetes ジョブには、OpenStackDataPlaneDeployment の名前でラベルが付けられます。このラベルを使用して、各 OpenStackDataPlaneDeployment のジョブをリスト表示できます。

     $ oc get job -l openstackdataplanedeployment=edpm-compute
     NAME                                                 STATUS     COMPLETIONS   DURATION   AGE
     bootstrap-edpm-compute-openstack-edpm-ipam           Complete   1/1           78s        25h
     configure-network-edpm-compute-openstack-edpm-ipam   Complete   1/1           37s        25h
     configure-os-edpm-compute-openstack-edpm-ipam        Complete   1/1           66s        25h
     download-cache-edpm-compute-openstack-edpm-ipam      Complete   1/1           64s        25h
     install-certs-edpm-compute-openstack-edpm-ipam       Complete   1/1           46s        25h
     install-os-edpm-compute-openstack-edpm-ipam          Complete   1/1           57s        25h
     libvirt-edpm-compute-openstack-edpm-ipam             Complete   1/1           2m37s      25h
     neutron-metadata-edpm-compute-openstack-edpm-ipam    Complete   1/1           61s        25h
     nova-edpm-compute-openstack-edpm-ipam                Complete   1/1           3m20s      25h
     ovn-edpm-compute-openstack-edpm-ipam                 Complete   1/1           78s        25h
     run-os-edpm-compute-openstack-edpm-ipam              Complete   1/1           33s        25h
     ssh-known-hosts-edpm-compute                         Complete   1/1           19s        25h
     telemetry-edpm-compute-openstack-edpm-ipam           Complete   1/1           2m5s       25h
     validate-network-edpm-compute-openstack-edpm-ipam    Complete   1/1           16s        25h

    oc logs -f job/<job-name> を使用してログを確認できます。たとえば、configure-network ジョブからログを確認する必要がある場合は、以下のようになります。

     $ oc logs -f jobs/configure-network-edpm-compute-openstack-edpm-ipam | tail -n2
     PLAY RECAP *********************************************************************
     edpm-compute-0             : ok=22   changed=0    unreachable=0    failed=0    skipped=17   rescued=0    ignored=0
10.13.1.1. ジョブ状態メッセージ

AnsibleEE ジョブには、サービスジョブの現在の状態を示す状態メッセージが関連付けられています。この状態メッセージは、oc get job <job_name> コマンド出力の MESSAGE フィールドに表示されます。クエリーを実行すると、ジョブが次のいずれかの状態を返します。

  • Job not started: ジョブが開始していません。
  • Job not found: ジョブが見つかりませんでした。
  • Job is running: ジョブが現在実行中です。
  • Job complete: ジョブの実行が完了しました。
  • Job error occurred <error_message>: ジョブが予期せず実行を停止しました。<error_message> は、特定のエラーメッセージに置き換えられます。

特定のジョブ状態メッセージを表示しているサービスをさらに調査するには、コマンド oc logs job/<service> を使用してログを表示します。たとえば、repo-setup-openstack-edpm サービスのログを表示するには、コマンド oc logs job/repo-setup-openstack-edpm を使用します。

10.13.2. ノードセットのログの確認

ノードセットのログにアクセスして、デプロイの問題を確認できます。

手順

  1. OpenStackAnsibleEE ラベルを持つ Pod を取得します。

    $ oc get pods -l app=openstackansibleee
    configure-network-edpm-compute-j6r4l   0/1     Completed           0          3m36s
    validate-network-edpm-compute-6g7n9    0/1     Pending             0          0s
    validate-network-edpm-compute-6g7n9    0/1     ContainerCreating   0          11s
    validate-network-edpm-compute-6g7n9    1/1     Running             0          13s
  2. 確認する Pod に SSH で接続します。

    1. 実行中の Pod:

      $ oc rsh validate-network-edpm-compute-6g7n9
    2. 実行中でない Pod:

      $ oc debug configure-network-edpm-compute-j6r4l
  3. /runner/artifacts マウント内のディレクトリーをリスト表示します。

    $ ls /runner/artifacts
    configure-network-edpm-compute
    validate-network-edpm-compute
  4. 必要なアーティファクトの stdout を表示します。

    $ cat /runner/artifacts/configure-network-edpm-compute/stdout

第11章 RHOSO クラウドへのアクセス

ワークステーションからリモートシェルを介して OpenStackClient Pod にアクセスするか、ブラウザーを使用して Dashboard サービス (horizon) インターフェイスにアクセスすることにより、Red Hat OpenStack Services on OpenShift (RHOSO) クラウドにアクセスして、データプレーンでアクションを実行できます。

11.1. OpenStackClient Pod へのアクセス

ワークステーションからリモートシェルを介して OpenStackClient Pod を使用することで、デプロイされたデータプレーンで Red Hat OpenStack Services on OpenShift (RHOSO) コマンドを実行できます。OpenStackClient Pod は、OpenStack Operator によって OpenStackControlPlane リソースの一部として作成されます。OpenStackClient Pod には、データプレーンでアクションを実行するために必要なクライアントツールと認証情報が格納されています。

前提条件

  • cluster-admin 権限を持つユーザーとして、Red Hat OpenShift Container Platform (RHOCP) クラスターにアクセスできるワークステーションにログオンしている。

手順

  1. OpenStackClient Pod のリモートシェルにアクセスします。

    $ oc rsh -n openstack openstackclient
  2. openstack コマンドを実行します。たとえば、以下のコマンドを使用して default ネットワークを作成できます。

    $ openstack network create default
  3. OpenStackClient Pod を終了します。

    $ exit

11.2. Dashboard サービス (horizon) インターフェイスへのアクセス

ブラウザーで Dashboard サービスのエンドポイント URL を指定すると、Dashboard サービス (horizon) インターフェイスにアクセスできます。

前提条件

  • コントロールプレーンでダッシュボードサービスが有効になっている。ダッシュボードサービスを有効化する方法は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズDashboard サービス (horizon) インターフェイスの有効化 を参照してください。
  • 管理者ユーザーとしてダッシュボードにログインする必要があります。

手順

  1. osp-secret シークレットの AdminPassword パラメーターから管理者パスワードを取得します。

    $ oc get secret osp-secret -o jsonpath='{.data.AdminPassword}' | base64 -d
  2. Dashboard サービスのエンドポイント URL を取得します。

    $ oc get horizons horizon -o jsonpath='{.status.endpoint}'
  3. ブラウザーを開きます。
  4. ダッシュボードのエンドポイント URL を入力します。
  5. admin のユーザー名と管理者のパスワードを入力してダッシュボードにログインします。

第12章 Red Hat OpenStack Services on OpenShift 環境の NFV のチューニング

このセクションには、{rhoso_long} NFV 環境を調整する方法に関する情報が記載されています。

12.1. NFV 環境でのポートセキュリティーの管理

ポートセキュリティーは、不正なアクセスを防ぐ手段です。発信元ネットワークポートのソース IP およびソース MAC アドレスと一致しない送信トラフィックをブロックします。セキュリティーグループルールを使用して、この挙動を監視または変更することはできません。

Red Hat OpenStack Services on OpenShift (RHOSO) 環境で新しく作成された Networking サービス (neutron) ネットワークでは、port_security_enabled パラメーターがデフォルトで enabled に設定されます。ネットワーク上で新たに作成されるポートは、そのネットワークから port_security_enabled パラメーターの値をコピーします。

ファイアウォールまたはルーターの構築など一部の NFV のユースケースでは、ポートセキュリティーを無効にしなければならない場合があります。

前提条件

  • ワークステーションに oc コマンドラインツールがインストール済みである。
  • cluster-admin 権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。

手順

  1. ワークステーションから OpenStackClient Pod のリモートシェルにアクセスします。

    $ oc rsh -n openstack openstackclient
  2. 特定のポートでポートセキュリティーを無効にするには、以下のコマンドを実行します。

    $ openstack port set --disable-port-security <port-id>
  3. ネットワークで作成されるすべての新規ポートで、ポートセキュリティーの有効化を阻止するには、以下のコマンドを実行します。

    $ openstack network set --disable-port-security <network-id>
  4. openstackclient Pod を終了します。

    $ exit

12.2. VF ポートの作成と使用

さまざまな OpenStack CLI クライアントコマンドを実行することで、Virtual Function (VF) ポートを作成して使用できます。

前提条件

  • ワークステーションに oc コマンドラインツールがインストール済みである。
  • cluster-admin 権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。

手順

  1. ワークステーションから OpenStackClient Pod のリモートシェルにアクセスします。

    $ oc rsh -n openstack openstackclient
  2. 種別 vlan のネットワークを作成します。

    $ openstack network create trusted_vf_network \
    --provider-network-type vlan --provider-segment 111 \
    --provider-physical-network sriov2 --external --disable-port-security
  3. サブネットを作成します。

    $ openstack subnet create --network trusted_vf_network \
      --ip-version 4 --subnet-range 192.168.111.0/24 --no-dhcp \
     subnet-trusted_vf_network
  4. ポートを作成します。

    vnic-type オプションを direct に、binding-profile オプションを true に、それぞれ設定します。

    $ openstack port create --network trusted_vf_network \
    --vnic-type direct --binding-profile trusted=true \
    sriov111_port_trusted
  5. インスタンスを作成し、それを前のステップで作成した信頼済みポートにバインドします。

    $ openstack server create --image rhel --flavor dpdk \
    --network trusted_vf_network --port sriov111_port_trusted \
    --config-drive True --wait rhel-dpdk-sriov_trusted
  6. openstackclient Pod を終了します。

    $ exit

検証

  1. インスタンスを作成したコンピュートノード上で、以下のコマンドを入力します。

    $ ip link
    出力例
    7: p5p2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:1c:40:fa brd ff:ff:ff:ff:ff:ff
        vf 6 MAC fa:16:3e:b8:91:c2, vlan 111, spoof checking off, link-state auto, trust on, query_rss off
        vf 7 MAC fa:16:3e:84:cf:c8, vlan 111, spoof checking off, link-state auto, trust off, query_rss off
  2. VF の信頼ステータスが trust on であることを確認します。上記の出力例には、2 つのポートが含まれる環境の詳細が示されています。vf 6trust on のテキストが含まれている点に注意してください。
  3. Networking サービス (neutron) ネットワークで port_security_enabled: false を設定した場合、あるいは openstack port create コマンドの実行時に引数 --disable-port-security を含める場合には、スプーフィングの確認を無効にできます。

12.3. NUMA 対応 vSwitch の既知の制限

重要

この機能は、このリリースでは テクノロジープレビュー として提供しているため、Red Hat では全面的にはサポートしていません。これは、テスト用途にのみご利用いただく機能です。実稼働環境にはデプロイしないでください。テクノロジープレビュー機能の詳細は、対象範囲の詳細 を参照してください。

このセクションでは、Red Hat OpenStack Services on OpenShift (RHOSO) ネットワーク機能仮想化インフラストラクチャー (NFVi) に NUMA 対応 vSwitch を実装する際の制約を記載しています。

  • 2 ノードのゲスト NUMA トポロジーを指定しなかった場合、2 つの NIC が異なる NUMA ノード上の物理ネットワークに接続された仮想マシンを起動することはできません。
  • 2 ノードのゲスト NUMA トポロジーを指定しなかった場合、1 つの NIC が物理ネットワークに接続され、別の NIC が異なる NUMA ノード上のトンネル化ネットワークに接続された仮想マシンを起動することはできません。
  • 2 ノードのゲスト NUMA トポロジーを指定しなかった場合、異なる NUMA ノード上にある 1 つの仮想ホストポートおよび 1 つの Virtual Function を持つ仮想マシンを起動することはできません。
  • NUMA 対応 vSwitch のパラメーターは、オーバークラウドロールごとに固有です。たとえば、Compute ノード 1 と Compute ノード 2 に、異なる NUMA トポロジーを設定することができます。
  • 仮想マシンのインターフェイスに NUMA アフィニティーを設定する場合は、アフィニティーが単一の NUMA ノードだけを対象にするようにします。NUMA アフィニティーが設定されないインターフェイスは、任意の NUMA ノードに配置することができます。
  • 管理ネットワークではなく、データプレーンネットワークに NUMA アフィニティーを設定します。
  • トンネル化ネットワークの NUMA アフィニティーは、すべての仮想マシンに適用されるグローバルの設定です。

12.4. NFVi 環境における Quality of Service (QoS)

Quality of Service (QoS) を使用して、ネットワーク機能仮想化インフラストラクチャー (NFVi) 内にある Red Hat OpenStack Services on OpenShift (RHOSO) ネットワークの Egress および Ingress トラフィックにレート制限を適用することで、VM インスタンスにさまざまなサービスレベルを提供できます。

NFVi 環境では、QoS のサポートは以下のルール種別に制限されます。

  • SR-IOV での minimum bandwidth (ベンダーによりサポートされる場合)
  • SR-IOV および OVS-DPDK 送信インターフェイスでの bandwidth limit

12.5. DPDK を使用する HCI データプレーンの作成

ハイパーコンバージドノードと共に NFV インフラストラクチャーをデプロイするには、リソースの使用率を最適化するために Compute サービスと Ceph Storage サービスを共存させて設定します。

ハイパーコンバージドインフラストラクチャー (HCI) の詳細は、ハイパーコンバージドインフラストラクチャー環境のデプロイ を参照してください。

12.5.1. NUMA ノード設定の例

パフォーマンスを向上させるために、テナントネットワークおよび Ceph オブジェクトサービスデーモン (OSD) を 1 つの NUMA ノード (例: NUMA-0) に配置し、VNF および NFV 以外の仮想マシンを別の NUMA ノード (例: NUMA-1) に配置します。

Expand
表12.1 CPU の割り当て
NUMA-0NUMA-1

Ceph OSD 数 * 4 HT

VNF および NFV 以外の仮想マシン用のゲスト仮想 CPU

DPDK lcore - 2 HT

DPDK lcore - 2 HT

DPDK PMD - 2 HT

DPDK PMD - 2 HT

Expand
表12.2 CPU 割り当ての例
 NUMA-0NUMA-1

Ceph OSD

32,34,36,38,40,42,76,78,80,82,84,86

 

DPDK-lcore

0,44

1,45

DPDK-pmd

2,46

3,47

nova

 

5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87

12.5.2. HCI-DPDK デプロイメントに推奨される設定

次の表に、HCI デプロイメント用に調整できるパラメーターを示します。

Expand
表12.3 HCI デプロイメント用の調整可能なパラメーター
ブロックデバイスの種別メモリー、デバイスごとの OSD および仮想 CPU

NVMe

メモリー: OSD あたり 5GB、デバイスごとの OSD 数: 4、デバイスごとの vCPU 数: 3

SSD

メモリー: OSD あたり 5GB、デバイスごとの OSD 数: 1、デバイスごとの vCPU 数: 4

HDD

メモリー: OSD あたり 5GB、デバイスごとの OSD 数: 1、デバイスごとの vCPU 数: 1

以下の機能には、同じ NUMA ノードを使用します。

  • ディスクコントローラー
  • ストレージネットワーク
  • ストレージ CPU およびメモリー

DPDK プロバイダーネットワークの以下の機能には、別の NUMA ノードを割り当てます。

  • NIC
  • PMD CPU
  • ソケットメモリー

法律上の通知

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2026 Red Hat
トップに戻る