ネットワーク機能仮想化環境のデプロイ
Red Hat OpenStack Services on OpenShift におけるネットワーク機能仮想化 (NFV) の計画、インストール、および設定
概要
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 でアカウントを作成できます。
- 次のリンクをクリックして、問題の作成 ページを開きます (問題の作成)。
- Summary フィールドと Description フィールドに入力します。Description フィールドに、ドキュメントの URL、章またはセクション番号、および問題の詳しい説明を入力します。フォーム内の他のフィールドは変更しないでください。
- 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 のアーキテクチャーおよびコンポーネント
- 仮想ネットワーク機能 (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 システム
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 デプロイメントが失敗します。
| パラメーター | 設定 |
|---|---|
|
| Disabled |
|
| Disabled |
|
| Enabled |
|
| Enabled |
|
| Enabled |
|
| Enabled |
|
| Performance |
|
| Enabled |
|
| 確定的なパフォーマンスを必要とする NFV デプロイメントでは無効になっています。他のすべてのシナリオで有効です。 |
|
| Intel カードで VFIO 機能が必要な場合には Enabled |
|
| 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 ノードトポロジー
標準的なトポロジーでは、デュアルコアソケットの 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 トポロジー
この図は、アプリケーションレベルで 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 トポロジー
第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 ノードに 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 は役立ちます。
5.3. TCP セグメンテーションオフロードを使用する OVS-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) クラスターにアクセスできるワークステーションにログオンしている。
手順
事前にプロビジョニングされたノードを使用したデータプレーンノードセットの作成 または プロビジョニングされていないノードを使用したデータプレーンノードセットの作成 の手順を実行する場合は、
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: | ...- ノードセットの作成手順を完了します。
検証
ノードセットの手順を完了したら、コンピュートノードで次のコマンドを実行します。
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 ノードの例
各 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
図5.4 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 初期化リソースの単一インスタンスを設定します。
手順
-
cluster-admin権限を持つユーザーとして RHOCP Web コンソールにログインします。 - Operators → OperatorHub を選択します。
-
Filter by keyword に
OpenStackと入力します。 -
Red Hatというソースラベルが付いた OpenStack Operator タイルをクリックします。 - Operator の情報を確認してから、Install をクリックします。
- Install Operator ページで、Installed Namespace リストから "Operator recommended Namespace: openstack-operators" を選択します。
- Install Operator ページで、Update approval リストから "Manual" を選択します。保留中の Operator 更新を手動で承認する方法は、RHOCP Operator ガイドの 保留中の Operator 更新の手動承認 を参照してください。
-
Install をクリックして、Operator を
openstack-operatorsnamespace で使用できるようにします。Status がSucceededの場合、OpenStack Operator はインストールされています。 - Create OpenStack をクリックして、Create OpenStack ページを開きます。
-
Create OpenStack ページで、Create をクリックして、OpenStack Operator 初期化リソースのインスタンスを作成します。
openstackインスタンスの Status がConditions: 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-api、cinder-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 クラスターにアクセスできるワークステーションにログオンしている。
手順
デプロイする RHOSO 環境用の
openstackプロジェクトを作成します。$ oc new-project openstackOpenStack Operator による特権 Pod の作成を有効にするために、
openstacknamespace にラベルが付いていることを確認します。$ 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オプション:
openstacknamespace でコマンドを実行するときに namespace の指定を不要にするには、デフォルトのnamespaceをopenstackに設定します。$ 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 がインストールされている。
手順
-
ワークステーションに
SecretCR (例:openstack_service_secret.yaml) を作成します。 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 コマンドを使用してSecretCR を生成している場合は、<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)
クラスターに
SecretCR を作成します。$ oc create -f openstack_service_secret.yaml -n openstackSecretCR が作成されたことを確認します。$ 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 に配置できます。
| ネットワーク名 | CIDR | NetConfig allocationRange | MetalLB IPAddressPool 範囲 | net-attach-def ipam 範囲 | OCP ワーカー nncp 範囲 |
|---|---|---|---|---|---|
|
| 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 |
|
| 10.0.0.0/24 | 10.0.0.100 - 10.0.0.250 | 該当なし | 該当なし | 該当なし |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 172.23.0.0/24 | 該当なし | 該当なし | 172.23.0.30 - 172.23.0.70 | 該当なし |
|
| 172.26.0.0/24 | 該当なし | 該当なし | 172.26.0.30 - 172.26.0.70 | 172.26.0.10 - 172.26.0.20 |
|
| 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 |
|
| 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 アドレスを持つ eth2 と eth3 を使用してファブリックへの接続を確立するネットワークと、トラフィックのソースとして使用されるグローバル bgpmainnet を示しています。
| ネットワーク名 | Zone 0 | Zone 1 | Zone 2 |
|---|---|---|---|
|
BGP Net1 ( | 100.64.0.0/24 | 100.64.1.0 | 100.64.2.0 |
|
BGP Net2 ( | 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 クラスター内の各ワーカーノード上の各分離ネットワークのインターフェイスを設定します。
手順
-
ワークステーションに
NodeNetworkConfigurationPolicy(nncp) CR ファイル (例:openstack-nncp.yaml) を作成します。 RHOCP クラスター内のワーカーノードの名前を取得します。
$ oc get nodes -l node-role.kubernetes.io/worker -o jsonpath="{.items[*].metadata.name}"ネットワーク設定を確認します。
$ oc get nns/<worker_node> -o yaml | more-
<worker_node>は、手順 2 で取得したワーカーノードの名前 (例:worker-1) に置き換えます。各ワーカーノードに対してこの手順を繰り返します。
-
nncpCR ファイルで、RHOCP クラスター内の各ワーカーノードの分離ネットワークそれぞれのインターフェイスを設定します。ネットワーク分離を設定する必要があるデフォルトの物理データセンターネットワークの詳細は、デフォルトの Red Hat OpenStack Services on OpenShift ネットワーク を参照してください。次の例では、
nncpCR は、ワーカーノード 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: ""クラスターに
nncpCR を作成します。$ oc apply -f openstack-nncp.yamlnncpCR が作成されたことを確認します。$ 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) を作成します。
手順
-
ワークステーションに
NetworkAttachmentDefinition(net-attach-def) CR ファイル (例:openstack-net-attach-def.yaml) を作成します。 NetworkAttachmentDefinitionCR ファイルで、各分離ネットワークのNetworkAttachmentDefinitionリソースを設定して、サービスデプロイメント Pod をネットワークに割り当てます。次の例では、次のネットワークのNetworkAttachmentDefinitionリソースを作成します。-
macvlanタイプのinternalapi、storage、ctlplane、および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":nncpCR で定義されている、ネットワークに関連付けられたノードインターフェイス名。 -
"ipam":whereaboutsCNI IPAM プラグインは、作成された Pod に.30 - .70の範囲の IP を割り当てます。 -
"range_start" - "range_end": IP アドレスプールの範囲が、MetalLBIPAddressPoolの範囲およびNetConfig allocationRangeと重複しないようにしてください。
-
クラスターに
NetworkAttachmentDefinitionCR を作成します。$ oc apply -f openstack-net-attach-def.yamlNetworkAttachmentDefinitionCR が作成されたことを確認します。$ oc get net-attach-def -n openstack
8.3.3. RHOSO ネットワーク VIPS 用の RHOCP の準備 リンクのコピーリンクがクリップボードにコピーされました!
MetalLB Operator を使用して、分離ネットワーク上の内部サービスエンドポイントを公開します。仮想 IP (VIP) のアナウンス方法を定義するには L2Advertisement リソースを作成し、VIP として使用できる IP を設定するには IPAddressPool リソースを作成する必要があります。レイヤー 2 モードでは、1 つのノードがローカルネットワークにサービスをアドバタイズする役割を担います。
手順
-
ワークステーションに
IPAddressPoolCR ファイル (例:openstack-ipaddresspools.yaml) を作成します。 IPAddressPoolCR ファイルで、分離ネットワークの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の範囲が、whereaboutsIPAM の範囲および NetConfigallocationRangeと重複しないようにしてください。
その他の
IPAddressPoolリソースパラメーターを設定する方法は、RHOCP ネットワーク ガイドの MetalLB アドレスプールの設定 を参照してください。-
クラスターに
IPAddressPoolCR を作成します。$ oc apply -f openstack-ipaddresspools.yamlIPAddressPoolCR が作成されたことを確認します。$ oc describe -n metallb-system IPAddressPool-
ワークステーションに
L2AdvertisementCR ファイル (例:openstack-l2advertisement.yaml) を作成します。 L2AdvertisementCR ファイルで、L2AdvertisementCR を設定して、どのノードがローカルネットワークにサービスをアドバタイズするかを定義します。各ネットワークに 1 つのL2Advertisementリソースを作成します。次の例の各
L2AdvertisementCR では、ネットワークアドレスプールから要求された 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 の設定 を参照してください。-
クラスターに
L2AdvertisementCR を作成します。$ oc apply -f openstack-l2advertisement.yamlL2AdvertisementCR が作成されたことを確認します。$ 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"]クラスターにネットワークバックエンドとして OVNKubernetes がある場合は、MetalLB がセカンダリーネットワークインターフェイスで動作できるように、グローバル転送を有効にする必要があります。
クラスターが使用するネットワークバックエンドを確認します。
$ oc get network.operator cluster --output=jsonpath='{.spec.defaultNetwork.type}'バックエンドが OVNKubernetes の場合は、次のコマンドを実行してグローバル IP 転送を有効にします。
$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge
8.4. データプレーンネットワークの作成 リンクのコピーリンクがクリップボードにコピーされました!
データプレーンネットワークを作成するには、NetConfig カスタムリソース (CR) を定義し、データプレーンネットワークのすべてのサブネットを指定します。データプレーン用に少なくとも 1 つのコントロールプレーンネットワークを定義する必要があります。また、VLAN ネットワークを定義して、InternalAPI、Storage、External などのコンポーザブルネットワークのネットワーク分離を作成することもできます。各ネットワーク定義には IP アドレスの割り当てを含める必要があります。
NetConfig CRD 定義と仕様スキーマを表示するには、次のコマンドを使用します。
$ oc describe crd netconfig
$ oc explain netconfig.spec
手順
-
ワークステーションに
openstack_netconfig.yamlという名前のファイルを作成します。 openstack_netconfig.yamlに次の設定を追加して、NetConfigCR を作成します。apiVersion: network.openstack.org/v1beta1 kind: NetConfig metadata: name: openstacknetconfig namespace: openstackopenstack_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:NetConfigallocationRange。allocationRangeが、MetalLBIPAddressPoolの範囲および IP アドレスプール範囲と重複しないようにしてください。 -
spec.networks.subnets.excludeAddresses: オプション: データプレーンノードで使用してはならない割り当て範囲の IP アドレスのリスト。 -
spec.networks.subnets.vlan: ネットワーク VLAN。デフォルトの RHOSO ネットワークの詳細は、デフォルトの Red Hat OpenStack Services on OpenShift ネットワーク を参照してください。
-
-
openstack_netconfig.yaml定義ファイルを保存します。 データプレーンネットワークを作成します。
$ oc create -f openstack_netconfig.yaml -n openstackデータプレーンネットワークが作成されたことを確認するために、
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-operatorsnamespace とコントロールプレーンの 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 メカニズムドライバーも追加する必要があります。
手順
デプロイする RHOSO 環境用の
openstackプロジェクトを作成します。$ oc new-project openstackOpenStack Operator による特権 Pod の作成を有効にするために、
openstacknamespace にラベルが付いていることを確認します。$ 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ワークステーションに
openstack_control_plane.yamlという名前のファイルを作成して、OpenStackControlPlaneCR を定義します。apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack-control-plane namespace: openstackRed Hat OpenStack Services on OpenShift へのセキュアなアクセスの提供 で、RHOSO サービス Pod へのセキュアなアクセスを提供するために作成した
SecretCR を指定します。apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack-control-plane spec: secret: osp-secretRed 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注記ストレージクラスの詳細は、ストレージクラスの作成 を参照してください。
次のサービス設定を追加します。
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-api、nova-metadata、nova-scheduler、nova-conductor) がデプロイされます。novncproxyサービスも、デフォルトでcell1に対して有効になります。データプレーンの DNS サービス:
dns: template: options:1 - key: server2 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: 3Identity サービス (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: 3Image サービス (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: 1Memcached:
memcached: templates: memcached: replicas: 3Networking サービス (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> は、vhostソケットへの絶対パス(例:/var/lib/vhost_sockets)に置き換えます。 -
<network_name1>と<network_name2>は、ゲートウェイが存在する物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワークprovider:*nameフィールドで設定します。) -
<VLAN-ID1>と `<VLAN-ID2>` を、使用している VLAN ID に置き換えます。
-
SR-IOV を使用する場合は、
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: 100GiOVN:
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-secretRabbitMQ:
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: LoadBalancerTelemetry サービス (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フィールドが存在している必要があります。
コントロールプレーンを作成します。
$ oc create -f openstack_control_plane.yaml -n openstack注記コントロールプレーンを作成すると、
OpenStackClientPod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。$ oc rsh -n openstack openstackclientRHOCP が
OpenStackControlPlaneCR に関連するリソースを作成するまで待機します。コントロールプレーンのデプロイのステータスを確認します。$ oc get openstackcontrolplane -n openstack- 出力例
NAME STATUS MESSAGE openstack-control-plane Unknown Setup startedステータスが "Setup complete" であれば、
OpenStackControlPlaneリソースが作成されています。ヒントデプロイの進行状況を追跡するには、
getコマンドの末尾に-wオプションを追加します。注記コントロールプレーンを作成すると、
OpenStackClientPod も作成されます。この Pod にリモートシェル (rsh) を介してアクセスして、RHOSO CLI コマンドを実行できます。$ oc rsh -n openstack openstackclient
オプション:
openstacknamespace 内の Pod を確認して、コントロールプレーンがデプロイされていることを確認します。$ oc get pods -n openstackすべての Pod が完了または実行中の状態であれば、コントロールプレーンがデプロイされています。
検証
OpenStackClientPod へのリモートシェル接続を開きます。$ oc rsh -n openstack openstackclient内部サービスエンドポイントが各サービスに登録されていることを確認します。
$ 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 | +--------------+-----------+---------------------------------------------------------------+
OpenStackClientPod を終了します。$ 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. コントロールプレーンからのサービスの削除 リンクのコピーリンクがクリップボードにコピーされました!
デプロイ後にサービスを無効にすると、コントロールプレーンからサービスとサービスデータベースを完全に削除できます。多くのサービスはデフォルトで有効になっています。そのため、replicas が 0 に設定されているためにサービス Pod が作成されない場合でも、OpenStack Operator がサービスデータベースや Identity サービス (keystone) ユーザーなどのリソースを作成します。
サービスは慎重に削除してください。サービスを削除することは、サービス Pod を停止することと同じではありません。サービスの削除は元に戻せません。サービスを無効にすると、サービスデータベースが削除され、そのサービスを参照していたリソースが追跡されなくなります。サービスを削除する前に、サービスデータベースのバックアップを作成してください。
手順
-
ワークステーションで
OpenStackControlPlaneCR ファイルを開きます。 コントロールプレーンから削除するサービスを見つけて無効にします。
cinder: enabled: false apiOverride: route: {} ...コントロールプレーンを更新します。
$ oc apply -f openstack_control_plane.yaml -n openstackRHOCP が無効なサービスに関連するリソースを削除するまで待機します。次のコマンドを実行して、ステータスを確認します。
$ oc get openstackcontrolplane -n openstack NAME STATUS MESSAGE openstack-control-plane Unknown Setup startedステータスが "Setup complete" であれば、無効にしたサービスで
OpenStackControlPlaneリソースが更新されています。ヒントデプロイの進行状況を追跡するには、
getコマンドの末尾に-wオプションを追加します。オプション:
openstacknamespace 内の Pod を確認して、無効にしたサービスの Pod がリストに表示されなくなったことを確認します。$ oc get pods -n openstackサービスが削除されていることを確認します。
$ oc get cinder -n openstackサービスが正常に削除されていれば、このコマンドで次のメッセージが返されます。
No resources found in openstack namespace.サービスの 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. 関連情報 リンクのコピーリンクがクリップボードにコピーされました!
- Kubernetes NMState Operator
- The Kubernetes NMState project
- MetalLB を使用した負荷分散
- MetalLB ドキュメント
- MetalLB in layer 2 mode
- Specify network interfaces that LB IP can be announced from
- 複数ネットワーク
- Using the Multus CNI in OpenShift
- macvlan plugin
- whereabouts IPAM CNI plugin - Extended configuration
- 動的プロビジョニング
- Block Storage バックアップサービスの設定
- Image サービス (glance) の設定
第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 に、事前にプロビジョニングされたノードとプロビジョニングされていないノードの両方を含めることはできません。
データプレーンを作成してデプロイするには、次のタスクを実行する必要があります。
-
Ansible がデータプレーンノードでコマンドを実行するために使用する、各ノードセットの
SecretCR を作成します。 -
データプレーンのノードとレイアウトを定義する
OpenStackDataPlaneNodeSetCR を作成します。 -
指定の
OpenStackDataPlaneNodeSetCR のリストに対して、ソフトウェアをデプロイおよび設定する Ansible 実行をトリガーするOpenStackDataPlaneDeploymentCR を作成します。
次の手順では、事前プロビジョニングされたノードを含むシンプルなノードセットと、ノードセットのデプロイ中にプロビジョニングする必要があるベアメタルノードを含むシンプルなノードセットの 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 はこのユーザーと鍵を使用してコマンドを実行します。データプレーン内の
OpenStackDataPlaneNodeSetCR ごとに SSH 鍵を作成できます。- コンピュートノード間のインスタンスの移行を可能にする SSH 鍵
前提条件
-
事前にプロビジョニングされたノードが、パスワードなしの
sudo権限を持つユーザーの$HOME/.ssh/authorized_keysファイル内の SSH 公開鍵を使用して設定されている。詳細は、RHEL の 基本システム設定 ガイドの sudo アクセスの管理 を参照してください。
手順
プロビジョニングされていないノードの場合は、Ansible の SSH 鍵ペアを作成します。
$ ssh-keygen -f <key_file_name> -N "" -t rsa -b 4096-
<key_file_name>は、鍵ペアに使用する名前に置き換えます。
-
Ansible 用の
SecretCR を作成し、クラスターに適用します。$ 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オプションを含めます。
-
コンピュートノードを作成する場合は、移行用のシークレットを作成します。
インスタンス移行用の SSH 鍵ペアを作成します。
$ ssh-keygen -f ./nova-migration-ssh-key -t ecdsa-sha2-nistp521 -N ''移行用の
SecretCR を作成し、クラスターに適用します。$ 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 -
Red Hat カスタマーポータルに登録されていないノードの場合は、subscription-manager 認証情報用の
SecretCR を作成してノードを登録します。$ 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に設定したパスワードに置き換えます。
-
Red Hat レジストリーの認証情報を含む
SecretCR を作成します。$ 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 を参照してください。
コンピュートノードを作成する場合は、libvirt のシークレットを作成します。
ワークステーションに
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フィールドを使用してユーザー名とパスワードを設定します。
SecretCR を作成します。$ oc apply -f secret_libvirt.yaml -n openstack
SecretCR が作成されたことを確認します。$ 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 コントロールプレーンにアクセスできるワークステーションにログオン済みである。
手順
CPU ピニングと PCI パススルーの設定を定義する
ConfigMapCR を作成し、ワークステーション上の 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 アドレスと名前を指定します。
-
ConfigMapCR ファイルを使用して、ConfigMapオブジェクトを作成します。- 例
$ oc create -f sriov-pinning-passthru.yaml -n openstack
SR-IOV カスタムサービスを定義する
OpenStackDataPlaneServiceCR を作成し、ワークステーション上の YAML ファイル (例:nova-custom-sriov.yaml) に保存します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: nova-custom-sriovConfigMapCR をカスタムサービスに追加し、このサービスを実行するノードセットの接続先セルのSecretCR を指定します。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-bundleAnsible 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-bundleplaybook: サービスで使用できるデフォルトの Playbook を識別します。この場合は、Compute サービス (nova) です。デフォルト Playbook のリストは、https://openstack-k8s-operators.github.io/edpm-ansible/playbooks.html で確認してください。
custom-nova-sriovサービスを作成します。$ oc apply -f nova-custom-sriov.yaml -n openstackカスタムサービスが作成されたことを確認します。
$ 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 コントロールプレーンにアクセスできるワークステーションにログオン済みである。
手順
パラメーターの設定を定義する
ConfigMapCR を作成し、ワークステーション上の 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 ネットワークに接続されたインスタンスのブロックライブマイグレーションを正常に実行するために必要です。
-
ConfigMapCR ファイルを使用して、ConfigMapオブジェクトを作成します。- 例
$ oc create -f dpdk-custom.yaml -n openstack
OVS-DPDK カスタムサービスを定義する
OpenStackDataPlaneServiceCR を作成し、ワークステーション上の YAML ファイル (例:nova-custom-ovsdpdk.yaml) に保存します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: nova-custom-ovsdpdk namespace: openstackConfigMapCR をカスタムサービスに追加し、このサービスを実行するノードセットの接続先セルのSecretCR を指定します。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-bundleAnsible 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-bundleplaybook: サービスで使用できるデフォルトの Playbook を識別します。この場合は、Compute サービス (nova) です。デフォルト Playbook のリストは、https://openstack-k8s-operators.github.io/edpm-ansible/playbooks.html で確認してください。
nova-custom-ovsdpdkサービスを作成します。$ oc apply -f nova-custom-ovsdpdk.yaml -n openstackカスタムサービスが作成されたことを確認します。
$ 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 から継承された値をオーバーライドします。
手順
ワークステーションに
openstack_preprovisioned_node_set.yamlという名前のファイルを作成し、OpenStackDataPlaneNodeSetCR を定義します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-data-plane1 namespace: openstack spec: env: - name: ANSIBLE_FORCE_COLOR value: "True"- 1
OpenStackDataPlaneNodeSetCR 名は、一意であり、小文字の英数字と-(ハイフン) または.(ピリオド) のみが含まれ、先頭と末尾は英数字で、最大長 53 文字である必要があります。この例の名前を、セット内のノードを表す名前に更新してください。
このセット内のノードが事前にプロビジョニングされていることを指定します。
preProvisioned: trueAnsible がデータプレーンノードに接続できるようにするために作成した SSH 鍵シークレットを追加します。
nodeTemplate: ansibleSSHPrivateKeySecret: <secret-key>-
<secret-key>は、データプレーンシークレットの作成 でこのノードセット用に作成した SSH 鍵のSecretCR の名前 (例:dataplane-ansible-ssh-private-key-secret) に置き換えます。
-
-
ログを保存するために、Red Hat OpenShift Container Platform (RHOCP) クラスターの
openstacknamespace に永続ボリューム要求 (PVC) を作成します。volumeModeをFilesystemに、accessModesをReadWriteOnceに設定します。NFS ボリュームプラグインを使用する PersistentVolume (PV) からのログのストレージを要求しないでください。NFS は FIFO と互換性がないため、ansible-runnerはログを保存するために書き込む FIFO ファイルを作成します。PVC の詳細は、RHOCP ストレージ ガイドの 永続ストレージについて、および デプロイメントのプランニング の Red Hat OpenShift Container Platform クラスターの要件 を参照してください。 データプレーンノードの永続的なロギングを有効にします。
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 ストレージの名前に置き換えます。
-
-
このグループ内のノードセットの共通設定を
nodeTemplateセクションに追加します。このOpenStackDataPlaneNodeSet内の各ノードがこの設定を継承します。共通のノード属性を設定するために使用できるプロパティーの詳細は、OpenStackDataPlaneNodeSetCR のspecプロパティー を参照してください。 Red Hat カスタマーポータルに登録されていないノードのオペレーティングシステムを登録し、ノードのリポジトリーを有効にします。次の手順は、ノードを CDN に登録する方法を示しています。Red Hat Satellite 6.13 にノードを登録する方法の詳細は、ホストの管理 を参照してください。
subscription-managerの認証情報を含むSecretCR を作成します。apiVersion: v1 kind: Secret metadata: name: subscription-manager data: username: <base64_encoded_username> password: <base64_encoded_password>Red Hat レジストリーの認証情報を含む
SecretCR を作成します。$ 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 を参照してください。
ユーザー名とパスワードのソースとして使用する
SecretCR を指定します。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}
このノードセット内の各ノードを定義します。
nodes: edpm-compute-0:1 hostName: edpm-compute-0 networks:2 - name: ctlplane subnetName: subnet1 defaultRoute: true fixedIP: 192.168.122.1003 - 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: true5 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注記-
nodesセクションに定義するノードには、nodeTemplateセクションで設定されているのと同じ Ansible 変数を設定できます。Ansible 変数が特定のノードとnodeTemplateセクション内の両方に設定されている場合は、ノード固有の値がnodeTemplateセクションの値をオーバーライドします。 -
ノードのすべての
nodeTemplateAnsible 変数を複製してデフォルトをオーバーライドし、ノード固有の値を設定する必要はありません。設定する必要があるのは、オーバーライドするノードの 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 を参照してください。
詳細は以下を参照してください。
-
servicesセクションに、データプレーンノードで実行されるサービスの一覧を追加します。nova を、またはnova-custom-sriovnova-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 ...-
openstack_preprovisioned_node_set.yaml定義ファイルを保存します。 データプレーンリソースを作成します。
$ oc create -f openstack_preprovisioned_node_set.yaml -n openstackデータプレーンリソースが作成されたことを確認します。
$ oc get openstackdataplanenodeset -n openstack NAME STATUS MESSAGE openstack-data-plane False Deployment not started返されるステータスの意味は、データプレーンの状態 を参照してください。
ノードセットの
Secretリソースが作成されたことを確認します。$ oc get secret | grep openstack-data-plane dataplanenodeset-openstack-data-plane Opaque 1 3m50sサービスが作成されたことを確認します。
$ 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) がインストールされ、プロビジョニング用に設定されている。詳細は、デプロイメントの計画 の ベアメタルデータプレーンノードのプロビジョニングの計画 を参照してください。
-
BareMetalHostCR が、各ベアメタルデータプレーンノード用に登録および検査されている。各ベアメタルノードが検査後にAvailable状態になっている必要があります。ベアメタルノードの設定の詳細は、Red Hat OpenShift Container Platform (RHOCP) インストール後の設定 ガイドの ベアメタルの設定 を参照してください。
手順
ワークステーションに
openstack_unprovisioned_node_set.yamlという名前のファイルを作成し、OpenStackDataPlaneNodeSetCR を定義します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-data-plane1 namespace: openstack spec: tlsEnabled: true env: - name: ANSIBLE_FORCE_COLOR value: "True"- 1
OpenStackDataPlaneNodeSetCR 名は、一意であり、小文字の英数字と-(ハイフン) または.(ピリオド) のみが含まれ、先頭と末尾は英数字で、最大長 53 文字である必要があります。この例の名前を、セット内のノードを表す名前に更新してください。
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>は、ノードは対応するBareMetalHostCR で定義されている namespace に置き換えます。 -
<ansible_ssh_user>は、Ansible SSH ユーザーのユーザー名に置き換えます。 -
<bmh_label>は、ノードの対応するBareMetalHostCR で定義されているメタデータラベル (例:openstack) に置き換えます。app、workload、nodeNameなどのメタデータラベルは、ノードにラベル付けするためのキーと値のペアです。対応するBareMetalHostCR 内のラベルと一致する 1 つ以上のラベルに基づいてデータプレーンノードを選択するには、bmhLabelSelectorフィールドを設定します。 -
<interface>は、ノードが接続するコントロールプレーンインターフェイス (例:enp6s0) に置き換えます。
-
デフォルトでは、BMO によって
openshift-machine-apinamespace 内のBareMetalHostCR が管理されます。すべての namespace を監視するようにProvisioningCR を更新する必要があります。$ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"watchAllNamespaces": true }}'Ansible がデータプレーンノードに接続できるようにするために作成した SSH 鍵シークレットを追加します。
nodeTemplate: ansibleSSHPrivateKeySecret: <secret-key>-
<secret-key>は、データプレーンシークレットの作成 で作成した SSH 鍵のSecretCR の名前 (例:dataplane-ansible-ssh-private-key-secret) に置き換えます。
-
-
ログを保存するために、RHOCP クラスターの
openstacknamespace に永続ボリューム要求 (PVC) を作成します。volumeModeをFilesystemに、accessModesをReadWriteOnceに設定します。NFS ボリュームプラグインを使用する PersistentVolume (PV) からのログのストレージを要求しないでください。NFS は FIFO と互換性がないため、ansible-runnerはログを保存するために書き込む FIFO ファイルを作成します。PVC の詳細は、RHOCP ストレージ ガイドの 永続ストレージについて、および デプロイメントのプランニング の Red Hat OpenShift Container Platform クラスターの要件 を参照してください。 データプレーンノードの永続的なロギングを有効にします。
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 ストレージの名前に置き換えます。
-
このグループ内のノードセットの共通設定を
nodeTemplateセクションに追加します。このOpenStackDataPlaneNodeSet内の各ノードがこの設定を継承します。詳細は以下を参照してください。
このノードセット内の各ノードを定義します。
nodes: edpm-compute-0:1 hostName: edpm-compute-0 networks:2 - name: ctlplane subnetName: subnet1 defaultRoute: true fixedIP: 192.168.122.1003 - 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: true5 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注記-
nodesセクションに定義するノードには、nodeTemplateセクションで設定されているのと同じ Ansible 変数を設定できます。Ansible 変数が特定のノードとnodeTemplateセクション内の両方に設定されている場合は、ノード固有の値がnodeTemplateセクションの値をオーバーライドします。 -
ノードのすべての
nodeTemplateAnsible 変数を複製してデフォルトをオーバーライドし、ノード固有の値を設定する必要はありません。設定する必要があるのは、オーバーライドするノードの 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 を参照してください。
ノード属性を設定するために使用できるプロパティーの詳細は、
OpenStackDataPlaneNodeSetCR のプロパティー を参照してください。-
servicesセクションに、データプレーンノードで実行されるサービスの一覧を追加します。nova を、またはnova-custom-sriovnova-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 ...-
openstack_unprovisioned_node_set.yaml定義ファイルを保存します。 データプレーンリソースを作成します。
$ oc create -f openstack_unprovisioned_node_set.yaml -n openstackデータプレーンリソースが作成されたことを確認します。
$ oc get openstackdataplanenodeset -n openstack NAME STATUS MESSAGE openstack-data-plane False Deployment not started返されるステータスの意味は、「データプレーンの状態」を参照してください。
ノードセットの
Secretリソースが作成されたことを確認します。$ oc get secret -n openstack | grep openstack-data-plane dataplanenodeset-openstack-data-plane Opaque 1 3m50sサービスが作成されたことを確認します。
$ 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 内のノードの共通属性を定義します。これらの共通属性は、個々のノードの定義でオーバーライドできます。
| フィールド | 説明 |
|---|---|
|
| ノードに接続するための SSH 秘密鍵が含まれる SSH 秘密鍵シークレットの名前。 シークレット名の形式: Secret.data.ssh-privatekey 詳細は、SSH 認証シークレットの作成 を参照してください。
デフォルト: |
|
|
管理に使用するネットワークの名前 (SSH/Ansible)。デフォルト: |
|
|
|
|
|
Ansible の設定オプション。詳細は、 |
|
| Ansible Execution Pod にマウントするファイル。 |
|
|
|
|
|
|
10.7.2. nodes リンクのコピーリンクがクリップボードにコピーされました!
この OpenStackDataPlaneNodeSet 内のノードのノード名とノード固有の属性を定義します。nodeTemplate で定義された共通属性をオーバーライドします。
| フィールド | 説明 |
|---|---|
|
|
Ansible の設定オプション。詳細は、 |
|
| Ansible Execution Pod にマウントするファイル。 |
|
| ノード名。 |
|
| 管理に使用するネットワークの名前 (SSH/Ansible)。 |
|
| ノードの NetworkData 設定。 |
|
| インスタンスのネットワーク。 |
|
| ノード固有のユーザーデータ。 |
10.7.3. ansible リンクのコピーリンクがクリップボードにコピーされました!
Ansible 設定オプションのグループを定義します。
| フィールド | 説明 |
|---|---|
|
|
データプレーンシークレットの作成 で作成したシークレットに関連付けられているユーザー。デフォルト: |
|
| Ansible 接続用の SSH ホスト。 |
|
| Ansible 接続用の SSH ポート。 |
|
|
ノードのセットをカスタマイズする Ansible 変数。このプロパティーを使用すると、各 注記
|
|
|
Ansible 変数の入力元ソースのリスト。重複するキーを持つ |
10.7.4. ansibleVarsFrom リンクのコピーリンクがクリップボードにコピーされました!
Ansible 変数の入力元ソースのリストを定義します。
| フィールド | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
10.8. ネットワークインターフェイスの設定オプション リンクのコピーリンクがクリップボードにコピーされました!
次の表は、Red Hat OpenStack Services on OpenShift (RHOSO) 環境のネットワークインターフェイスを設定する際に使用できるオプションを説明しています。
RHOSO では Linux ブリッジはサポートされません。代わりに、Linux ボンディングや RHOSO トラフィック用の専用 NIC などの方法を使用してください。
10.8.1. interface リンクのコピーリンクがクリップボードにコピーされました!
単一のネットワークインターフェイスを定義します。ネットワークインターフェイスの name には、実際のインターフェイス名 (eth0、eth1、enp0s25) または一連の番号付きインターフェイス (nic1、nic2、nic3) が使用されます。eth0 や eno2 などの名前付きインターフェイスではなく、nic1 や nic2 などの番号付きインターフェイスを使用する場合、ロール内のホストのネットワークインターフェイスがまったく同じである必要はありません。たとえば、あるホストに em1 と em2 のインターフェイスが指定されており、別のホストには eno1 と eno2 が指定されていても、両ホストの NIC は nic1 および nic2 として参照することができます。
番号によるインターフェイスの順序は、名前によるネットワークインターフェイス種別の順序に対応します。
ethXインターフェイス (eth0、eth1など)。udevで一貫したデバイス命名がオフになっている場合、名前はこの形式で表示されます。enoXおよびemXインターフェイス (eno0、eno1、em0、em1など)。通常はオンボードインターフェイスです。
enXとその他のインターフェイス (enp3s0、enp3s1、ens3など)。英数字順に表示されます。これらは、通常アドオンのインターフェイスです。
番号による NIC スキームには、アクティブなインターフェイスだけが含まれます (たとえば、インターフェイスにスイッチに接続されたケーブルがあるかどうかが考慮されます)。4 つのインターフェイスを持つホストと、6 つのインターフェイスを持つホストがある場合は、nic1 から nic4 を使用して各ホストで 4 本のケーブルだけを結線します。
| オプション | デフォルト | 説明 |
|---|---|---|
|
|
インターフェイスの名前。ネットワークインターフェイスの | |
|
| False | DHCP を使用して IP アドレスを取得します。 |
|
| False | DHCP を使用して v6 の IP アドレスを取得します。 |
|
| インターフェイスに割り当てられる IP アドレスのリスト | |
|
| インターフェイスに割り当てられるルートのリスト。詳細は、「routes」 を参照してください。 | |
|
| 1500 | 接続の最大伝送単位 (MTU: Maximum Transmission Unit) |
|
| False |
プライマリーインターフェイスとしてインターフェイスを定義します。 |
|
| False | システム名の代わりにデバイスのエイリアス設定を記述します。 |
|
| None | DHCP クライアントに渡す引数 |
|
| None | インターフェイスに使用する DNS サーバーのリスト |
|
|
特定の NIC で VXLAN を使用する際にスループットを向上させるには、このオプションを |
- 例
...
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オプション
| オプション | デフォルト | 説明 |
|---|---|---|
| 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) で、複数の interface、ovs_bond、vlan オブジェクトを接続するブリッジを定義します。
ネットワークインターフェイス種別 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オプション
| オプション | デフォルト | 説明 |
|---|---|---|
| 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 サービスにより提供されるデフォルトのルートを使用します。 |
| 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 カーネルボンディングがサポートされます。
| ボンディング種別 | 種別の値 | 許可されるブリッジ種別 | 許可されるメンバー |
|---|---|---|---|
| OVS カーネルボンディング |
|
|
|
| OVS-DPDK ボンディング |
|
|
|
| Linux カーネルボンディング |
|
|
|
ovs_bridge と ovs_user_bridge を同じノード上で組み合わせないでください。
ovs_bond-
Open vSwitch (OVS) で、複数の
interfacesを結合するボンディングを定義します。これにより、冗長性や帯域幅が向上します。
| オプション | デフォルト | 説明 |
|---|---|---|
| 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_extra | ボンディングのネットワーク設定ファイルで OVS_EXTRA パラメーターとして設定するオプションのセット | |
| defroute | True |
DHCP サービスにより提供されるデフォルトのルートを使用します。 |
| persist_mapping | False | システム名の代わりにデバイスのエイリアス設定を記述します。 |
| dhclient_args | None | DHCP クライアントに渡す引数 |
| dns_servers | None | ボンディングに使用する DNS サーバーのリスト |
ovs_option | 説明 |
|---|---|
|
|
送信元負荷分散 (slb) は、送信元 MAC アドレスと出力 VLAN に基づいてフローのバランスを取り、トラフィックパターンの変化に応じて定期的に再調整します。 |
|
|
|
|
|
Link Aggregation Control Protocol (LACP) の動作を制御します。LACP をサポートしているのは特定のスイッチのみです。お使いのスイッチが LACP に対応していない場合には |
|
| LACP が失敗した場合は、ボンドモードとしてアクティブバックアップを設定します。 |
|
| LACP のハートビートを 1 秒 (高速) または 30 秒 (低速) に設定します。デフォルトは低速です。 |
|
| リンク検出に miimon ハートビート (miimon) またはモニターキャリア (carrier) を設定します。デフォルトは carrier です。 |
|
| miimon を使用する場合には、ハートビートの間隔をミリ秒単位で設定します。 |
|
| フラッピングを防止するためにリンクがアクティブになっている必要がある間隔 (ミリ秒) を設定します。 |
|
| ボンドメンバー間でフローがリバランスする間隔 (ミリ秒) を設定します。この値をゼロに設定すると、ボンドメンバー間のフローのリバランスが無効になります。 |
- 例 - 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 エージェントを再起動すると、コントロールプレーンが一時的に中断される可能性があります。
| 目的 | OVS ボンディングモード | 互換性のある LACP オプション | 備考 |
| 高可用性 (active-passive) |
|
| |
| スループットの向上 (active-active) |
|
|
|
|
|
|
|
10.8.6. linux_bond リンクのコピーリンクがクリップボードにコピーされました!
複数の interfaces を結合する Linux ボンディングを定義します。これにより、冗長性や帯域幅が向上します。bonding_options パラメーターには、カーネルベースのボンディングオプションを指定するようにしてください。
| オプション | デフォルト | 説明 |
|---|---|---|
| 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 ボンディングの | |
| defroute | True |
DHCP サービスにより提供されるデフォルトのルートを使用します。 |
| persist_mapping | False | システム名の代わりにデバイスのエイリアス設定を記述します。 |
| dhclient_args | None | DHCP クライアントに渡す引数 |
| dns_servers | None | ボンディングに使用する DNS サーバーのリスト |
- Linux ボンディングの
bonding_optionsパラメーター -
bonding_optionsパラメーターは、Linux ボンディング用の特定のボンディングオプションを設定します。下表の後に記載された Linux ボンディングの例を参照してください。
bonding_options | 説明 |
|---|---|
|
|
ボンディングモードを設定します。この例では、 |
|
| LACP パケットの送信間隔を 1 秒または 30 秒に定義します。 |
|
| インターフェイスをトラフィックに使用する前にそのインターフェイスがアクティブである必要のある最低限の時間を定義します。この最小設定は、ポートフラッピングによる停止を軽減するのに役立ちます。 |
|
| ドライバーの 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、ブリッジ、またはボンディングに適用するルートのリストを定義します。
| オプション | デフォルト | 説明 |
|---|---|---|
| ip_netmask | None | 接続先ネットワークの IP およびネットマスク |
| default | False |
このルートをデフォルトルートに設定します。 |
| 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 の
edpmAnsible 変数で定義された値を使用して、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_groupをhugetlbfsに設定すると、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:
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:
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
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
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
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
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
name: nic9
numvfs: 10
mtu: 9000
use_dhcp: false
promisc: true
- type: sriov_pf
name: nic10
numvfs: 10
mtu: 9000
use_dhcp: false
promisc: true
- type: sriov_pf
name: nic11
numvfs: 5
mtu: 9000
use_dhcp: false
promisc: true
- type: sriov_pf
name: nic12
numvfs: 5
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 ボンディングを作成します。この例では、nic3とnic4に active-backup モードで Linux ボンディングを作成します。- 4 5
type: vlan: Linux ボンディングに VLAN を割り当てます。この例では、internalapiおよびstorageネットワークの VLAN ID をbond-apiに割り当てます。- 6
ovs_user_bridge: OVS-DPDK ポートでブリッジを設定します。この例では、テナントネットワークのnic7とnic8に対応する 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) を作成します。
手順
ワークステーションに
openstack_data_plane_deploy.yamlという名前のファイルを作成し、OpenStackDataPlaneDeploymentCR を定義します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-data-plane1 - 1
OpenStackDataPlaneDeploymentCR 名は一意である必要があり、小文字の英数字、-(ハイフン)、または.(ピリオド) が含まれ、先頭と末尾は英数字である必要があります。この例の名前を、デプロイメント内のノードセットを反映する名前に更新します。
デプロイするすべての
OpenStackDataPlaneNodeSetCR を追加します。spec: nodeSets: - openstack-data-plane - <nodeSet_name> - ... - <nodeSet_name> services: ...-
&
lt;nodeSet_name> をデータプレーンのデプロイメントに追加するOpenStackDataPlaneNodeSetCR の名前(openstack_preprovisioned_node_set.yamlまたはopenstack_unprovisioned_node_set.yamlなど)に置き換えます。
-
&
-
openstack_data_plane_deploy.yamlデプロイメントファイルを保存します。 データプレーンをデプロイします。
$ 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データプレーンがデプロイされていることを確認します。
$ oc get openstackdataplanedeployment -n openstack- 出力例
NAME STATUS MESSAGE openstack-data-plane True Setup Complete
NodeSet Readyメッセージが表示されるまで、oc getコマンドを繰り返します。$ oc get openstackdataplanenodeset -n openstack- 出力例
NAME STATUS MESSAGE openstack-data-plane True NodeSet Ready返されるステータスの意味は、データプレーンの状態 を参照してください。
データプレーンがデプロイされていないことをステータスが示している場合は、デプロイメントのトラブルシューティングを行います。詳細は、データプレーンの作成とデプロイのトラブルシューティング を参照してください。
Compute ノードを、それが接続されている Compute セルにマップします。
$ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose追加のセルを作成しなかった場合は、このコマンドによって Compute ノードが
cell1にマップされます。
検証
openstackclientPod のリモートシェルにアクセスし、デプロイされた Compute ノードがコントロールプレーンに表示されることを確認します。$ oc rsh -n openstack openstackclient $ openstack hypervisor list
10.12. データプレーンの状態 リンクのコピーリンクがクリップボードにコピーされました!
各データプレーンリソースには、status サブリソース内に、デプロイの進行状況など、リソースの全体的な状態を示す一連の状態があります。
OpenStackDataPlaneNodeSet の場合は、OpenStackDataPlaneDeployment が開始して正常に終了するまで、Ready 状態が False になります。デプロイが成功すると、Ready 状態が True に設定されます。その後デプロイすると、デプロイが成功するまで、Ready 状態が False に設定されます。デプロイが成功すると、Ready 状態が True に設定されます。
| 状態 | 説明 |
|---|---|
|
|
|
|
| "True": リソースのすべてのセットアップタスクが完了しています。セットアップタスクには、SSH 鍵シークレットの検証、リソースの他のフィールドの検証、各リソースの Ansible インベントリーの作成があります。各サービス固有の状態は、そのサービスのデプロイが完了すると、"True" に設定されます。サービスの状態をチェックすると、デプロイが完了したサービスや失敗したサービスを確認できます。 |
|
| "True": NodeSet が正常にデプロイされました。 |
|
| "True": 必要な入力が利用可能で準備ができています。 |
|
| "True": DNSData リソースの準備ができています。 |
|
| "True": IPSet リソースの準備ができています。 |
|
| "True": ベアメタルノードがプロビジョニングされ、準備ができています。 |
| status フィールド | 説明 |
|---|---|
|
|
|
|
| |
|
|
| 状態 | 説明 |
|---|---|
|
|
|
|
| "True": データプレーンが正常にデプロイされました。 |
|
| "True": 必要な入力が利用可能で準備ができています。 |
|
|
"True": 指定された名前の |
|
|
"True": 指定された名前の |
| status フィールド | 説明 |
|---|---|
|
|
|
| 状態 | 説明 |
|---|---|
|
| "True": サービスが作成され、使用できる状態です。"False": サービスの作成に失敗しました。 |
10.13. データプレーンの作成とデプロイのトラブルシューティング リンクのコピーリンクがクリップボードにコピーされました!
サービスが正しくデプロイまたは動作していない場合、デプロイのトラブルシューティングを行うには、サービスのジョブ状態メッセージを確認し、ノードセットのログを確認します。
10.13.1. サービスのジョブ状態メッセージの確認 リンクのコピーリンクがクリップボードにコピーされました!
環境内の各データプレーンデプロイメントには、関連するサービスがあります。これらの各サービスには、そのサービスに対して実行されている AnsibleEE ジョブの現在のステータスに対応するジョブ状態メッセージがあります。この情報は、サービスが正しくデプロイまたは動作していない場合に、デプロイメントのトラブルシューティングを行うために使用できます。
手順
すべてのデプロイメントの名前とステータスを確認します。
$ oc get openstackdataplanedeployment次の出力例は、2 つのデプロイメントが現在進行中であることを示しています。
$ oc get openstackdataplanedeployment NAME NODESETS STATUS MESSAGE edpm-compute ["openstack-edpm-ipam"] False Deployment in progressAnsible 実行ジョブを取得して検査します。
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 25hoc 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. ノードセットのログの確認 リンクのコピーリンクがクリップボードにコピーされました!
ノードセットのログにアクセスして、デプロイの問題を確認できます。
手順
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確認する Pod に SSH で接続します。
実行中の Pod:
$ oc rsh validate-network-edpm-compute-6g7n9実行中でない Pod:
$ oc debug configure-network-edpm-compute-j6r4l
/runner/artifactsマウント内のディレクトリーをリスト表示します。$ ls /runner/artifacts configure-network-edpm-compute validate-network-edpm-compute必要なアーティファクトの
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) クラスターにアクセスできるワークステーションにログオンしている。
手順
OpenStackClientPod のリモートシェルにアクセスします。$ oc rsh -n openstack openstackclientopenstackコマンドを実行します。たとえば、以下のコマンドを使用してdefaultネットワークを作成できます。$ openstack network create defaultOpenStackClientPod を終了します。$ exit
11.2. Dashboard サービス (horizon) インターフェイスへのアクセス リンクのコピーリンクがクリップボードにコピーされました!
ブラウザーで Dashboard サービスのエンドポイント URL を指定すると、Dashboard サービス (horizon) インターフェイスにアクセスできます。
前提条件
- コントロールプレーンでダッシュボードサービスが有効になっている。ダッシュボードサービスを有効化する方法は、Red Hat OpenStack Services on OpenShift デプロイメントのカスタマイズ の Dashboard サービス (horizon) インターフェイスの有効化 を参照してください。
- 管理者ユーザーとしてダッシュボードにログインする必要があります。
手順
osp-secretシークレットのAdminPasswordパラメーターから管理者パスワードを取得します。$ oc get secret osp-secret -o jsonpath='{.data.AdminPassword}' | base64 -dDashboard サービスのエンドポイント URL を取得します。
$ oc get horizons horizon -o jsonpath='{.status.endpoint}'- ブラウザーを開きます。
- ダッシュボードのエンドポイント URL を入力します。
-
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 コントロールプレーンにアクセスできるワークステーションにログオン済みである。
手順
ワークステーションから OpenStackClient Pod のリモートシェルにアクセスします。
$ oc rsh -n openstack openstackclient特定のポートでポートセキュリティーを無効にするには、以下のコマンドを実行します。
$ openstack port set --disable-port-security <port-id>ネットワークで作成されるすべての新規ポートで、ポートセキュリティーの有効化を阻止するには、以下のコマンドを実行します。
$ openstack network set --disable-port-security <network-id>openstackclientPod を終了します。$ exit
12.2. VF ポートの作成と使用 リンクのコピーリンクがクリップボードにコピーされました!
さまざまな OpenStack CLI クライアントコマンドを実行することで、Virtual Function (VF) ポートを作成して使用できます。
前提条件
-
ワークステーションに
ocコマンドラインツールがインストール済みである。 -
cluster-admin権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。
手順
ワークステーションから OpenStackClient Pod のリモートシェルにアクセスします。
$ oc rsh -n openstack openstackclient種別
vlanのネットワークを作成します。- 例
$ openstack network create trusted_vf_network \ --provider-network-type vlan --provider-segment 111 \ --provider-physical-network sriov2 --external --disable-port-security
サブネットを作成します。
- 例
$ openstack subnet create --network trusted_vf_network \ --ip-version 4 --subnet-range 192.168.111.0/24 --no-dhcp \ subnet-trusted_vf_network
ポートを作成します。
- 例
vnic-typeオプションをdirectに、binding-profileオプションをtrueに、それぞれ設定します。$ openstack port create --network trusted_vf_network \ --vnic-type direct --binding-profile trusted=true \ sriov111_port_trusted
インスタンスを作成し、それを前のステップで作成した信頼済みポートにバインドします。
- 例
$ openstack server create --image rhel --flavor dpdk \ --network trusted_vf_network --port sriov111_port_trusted \ --config-drive True --wait rhel-dpdk-sriov_trusted
openstackclientPod を終了します。$ exit
検証
インスタンスを作成したコンピュートノード上で、以下のコマンドを入力します。
$ 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
-
VF の信頼ステータスが
trust onであることを確認します。上記の出力例には、2 つのポートが含まれる環境の詳細が示されています。vf 6にtrust onのテキストが含まれている点に注意してください。 -
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) に配置します。
| NUMA-0 | NUMA-1 |
|---|---|
| Ceph OSD 数 * 4 HT | VNF および NFV 以外の仮想マシン用のゲスト仮想 CPU |
| DPDK lcore - 2 HT | DPDK lcore - 2 HT |
| DPDK PMD - 2 HT | DPDK PMD - 2 HT |
| NUMA-0 | NUMA-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 デプロイメント用に調整できるパラメーターを示します。
| ブロックデバイスの種別 | メモリー、デバイスごとの 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
- ソケットメモリー