3.3. OpenShift Container Platform etcd ホストの推奨プラクティス
etcd は、OpenShift Container Platform が設定に使用するキーと値の分散ストアです。
OpenShift Container Platform のバージョン | etcd のバージョン | ストレージスキーマのバージョン |
3.3 以前 | 2.x | v2 |
3.4 および 3.5 | 3.x | v2 |
3.6 | 3.x | v2 (アップグレード) |
3.6 | 3.x | v3 (新規インストール) |
3.7 以降 | 3.x | v3 |
etcd 3.x では、クラスターのサイズに拘わらず、CPU、メモリー、ネットワーク、ディスク要件を軽減する、スケーラビリティーおよびパフォーマンスの重要な強化機能が導入されました。また、etcd 3.x は、オンディスク etcd データベースの 2 段階移行をスムーズに行うため、後方互換のあるストレージ API を実装します。移行の目的で、OpenShift Container Platform 3.5 の etcd 3.x で使用されるストレージモードは v2 モードのままとなっています。OpenShift Container Platform 3.6 の時点で、新規インストールで v3 のストレージモードが使用されます。OpenShift Container Platform の以前のバージョンからアップグレードしても、v2 から v3 に自動で 移行されません。提供されている Playbook を使用して、ドキュメントに記載のプロセスに従い、データを移行する必要があります。
etcd のバージョン 3 では、on-disk etcd データベースの 2 ステップ移行を簡素化する後方互換性対応のストレージ API を実装します。移行の目的で、OpenShift Container Platform 3.5 の etcd 3.x で使用されるストレージモードは v2 モードのままとなっています。OpenShift Container Platform 3.6 の時点で、新規インストールで v3 のストレージモードが使用されます。OpenShift Container Platform 3.7 へのアップグレードプロセスの一環として、必要な場合は etcd ストレージ API を v3 にアップグレードします。バージョン 3.7 以降では、v3 API を使用する必要があります。
新規インストールでストレージモードを v3 に変更するのに加え、OpenShift Container Platform 3.6 は、全 OpenShift Container Platform タイプに対して強制的に quorum reads を実行します。これは、etcd に対するクエリーが古くなったデータを返さないようにするために実行されます。単一ノードの etcd クラスターでは、古くなったデータが入っていても懸念はありません。実稼働クラスターで一般的に使用される高可用性の etcd デプロイメントでは、quorum read はクエリーの結果が有効になるようにします。quorum read は、データベース用語で 線形化可能性 のことで、すべてのクライアントにクラスターが最新の状態に更新されたものが表示され、同じ順番の読み取りおよび書き込みが表示されます。パフォーマンスの向上に関する情報は、etcd 3.1 の announcement を参照してください。
OpenShift Container Platform は、etcd を使用して Kubernetes 自体が必要な情報以外の追加情報を保存する点を留意することが重要です。たとえば、Kubernetes 以外に OpenShift Container Platform が追加する機能で必要になるので、OpenShift Container Platform は、etcd にあるイメージ、ビルド、他のコンポーネントの情報を保存します。最終的に、etcd ホストのパフォーマンスやサイジングに関する指針やその他の推奨事項は、Kubernetes とは顕著に異なります。Red Hat は最も正確な推奨事項を提案できるように、OpenShift Container Platform のユースケースやパラメーターを念頭において、etcd のスケーラビリティーやパフォーマンスをテストしています。
パフォーマンスの向上は、cluster-loader ユーティリティーで 300 ノードの OpenShift Container Platform 3.6 クラスターを使用して、定量化されています。etcd 3.x (ストレージモード v2) と etcd 3.x (ストレージモード v3) を比較すると、以下の図に示されるようにパフォーマンスの向上が明確に確認できます。
負荷のある状態でのストレージ IOPS が大幅に減少している:
安定した状態でのストレージ IOPS が大幅に減少している:
同じ I/O データの表示。 両モードでの平均 IOPS
API サーバー (マスター) と etcd プロセス両方の CPU 使用率が減少している:
API サーバー (マスター) と etcd プロセスの両方のメモリー使用率も減少している:
OpenShift Container Platform で etcd をプロファイリングした後に、etcd は少量のストレージインプットおよびアウトプットを頻繁に実行しています。SSD など、少量の読み取り/書き込み操作をすばやく処理するストレージで etcd を使用することを強く推奨します。
etcd 3.1 の 3 ノードクラスター (quorum reads を強制実行してストレージ v3 モードを使用) で実行したサイズ I/O 操作を確認してみると、読み取りサイズは以下のようになります。
また、書き込みサイズは以下のようになります。
etcd プロセスは通常はメモリー集約型であり、マスター/ API サーバープロセスは CPU 集約型です。これらは、単一マシンや仮想マシン内で共同設置する上で有効なペアになります。これにより、1 台のマシンまたは仮想マシン内の適切なコロケーションペアが作成されます。etcd とマスターホスト間の通信を最適化するには、同じホストに共存させるか、専用のネットワークを指定します。
3.3.1. OpenStack の PCI パススルーを使用した etcd ノードへのストレージ提供
大規模な環境で etcd を安定させるために etcd ノードにストレージをすばやく提供するには、NVMe (Non-Volatile Memory express) デバイスを直接 etcd ノードに渡す PCI パススルーを使用します。これを Red Hat OpenStack 11 以降で設定するには、PCI デバイスが存在する OpenStack コンピュートノードで以下を実行してください。
- Intel Vt-x が BIOS で有効化されているようにします。
-
IOMMU (Input-Output Memory Management Unit) を有効化します。/etc/sysconfig/grub ファイルで、
GRUB_CMDLINX_LINUX
の行末に、引用符で囲ってintel_iommu=on iommu=pt
を追加します。 以下を実行して /etc/grub2.cfg を再生成します。
$ grub2-mkconfig -o /etc/grub2.cfg
- システムを再起動します。
コントローラーの /etc/nova.conf を以下のように設定します。
[filter_scheduler] enabled_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,PciPassthroughFilter available_filters=nova.scheduler.filters.all_filters [pci] alias = { "vendor_id":"144d", "product_id":"a820", "device_type":"type-PCI", "name":"nvme" }
-
コントローラーで
nova-api
とnova-scheduler
を再起動します。 コンピュートノードの /etc/nova/nova.conf で以下のように設定します。
[pci] passthrough_whitelist = { "address": "0000:06:00.0" } alias = { "vendor_id":"144d", "product_id":"a820", "device_type":"type-PCI", "name":"nvme" }
パススルーする NVMe デバイスの
address
、vendor_id
およびproduct_id
の必須値を取得するには、以下を実行します。# lspci -nn | grep devicename
-
コンピュートノードで
nova-compute
を再起動します。 - 実行する OpenStack バージョンで NVMe を使用するように設定し、etcd ノードで起動します。