第7章 OpenShift Container Platform クラスターへの自動スケーリングの適用
自動スケーリングの OpenShift Container Platform クラスターへの適用には、クラスターへの Cluster Autoscaler のデプロイと各マシンタイプの Machine Autoscaler のデプロイが必要です。
Cluster Autoscaler は、Machine API Operator が動作しているクラスターでのみ設定できます。
7.1. Cluster Autoscaler について リンクのコピーリンクがクリップボードにコピーされました!
Cluster Autoscaler は、現行のデプロイメントのニーズに合わせて OpenShift Container Platform クラスターのサイズを調整します。これは、Kubernetes 形式の宣言引数を使用して、特定のクラウドプロバイダーのオブジェクトに依存しないインフラストラクチャー管理を提供します。Cluster Autoscaler には cluster スコープがあり、特定の namespace には関連付けられていません。
Cluster Autoscaler は、リソース不足のために現在のワーカーノードのいずれにもスケジュールできない Pod がある場合や、デプロイメントのニーズを満たすために別のノードが必要な場合に、クラスターのサイズを拡大します。Cluster Autoscaler は、指定される制限を超えてクラスターリソースを拡大することはありません。
Cluster Autoscaler は、コントロールプレーンノードを管理しない場合でも、クラスター内のすべてのノードのメモリー、CPU、および GPU の合計を計算します。これらの値は、単一マシン指向ではありません。これらは、クラスター全体での全リソースの集約です。たとえば、最大メモリーリソースの制限を設定する場合、Cluster Autoscaler は現在のメモリー使用量を計算する際にクラスター内のすべてのノードを含めます。この計算は、Cluster Autoscaler にワーカーリソースを追加する容量があるかどうかを判別するために使用されます。
作成する ClusterAutoscaler
リソース定義の maxNodesTotal
値が、クラスター内のマシンの想定される合計数に対応するのに十分な大きさの値であることを確認します。この値は、コントロールプレーンマシンの数とスケーリングする可能性のあるコンピュートマシンの数に対応できる値である必要があります。
7.1.1. 自動ノード削除 リンクのコピーリンクがクリップボードにコピーされました!
クラスターオートスケーラーは 10 秒ごとにクラスター内の不要なノードをチェックし、そのノードを削除します。クラスターオートスケーラーは、次の条件が当てはまる場合に、ノードを削除対象とみなします。
-
ノード使用率が、クラスターの ノード使用率 レベルのしきい値を下回っている。ノード使用率レベルとは、要求されたリソースの合計をノードに割り当てられたリソースで除算したものです。
ClusterAutoscaler
カスタムリソースで値が指定されいない場合、クラスターオートスケーラーはデフォルト値の0.5
を使用します。これは 50% の使用率に相当します。 - クラスターオートスケーラーが、ノード上で実行されているすべての Pod を他のノードに移動できる。Kubernetes スケジューラーは、ノード上の Pod のスケジュールを担当します。
- クラスターオートスケーラーに、スケールダウンを無効にするアノテーションがない。
ノードに次のタイプの Pod が存在する場合、クラスターオートスケーラーはノードを削除しません。
- 制限のある Pod Disruption Budget を持つ Pod。
- デフォルトでノードで実行されない kube-system Pod。
- PDB を持たないか、制限が厳しい PDB を持つ kube-system Pod。
- デプロイメント、レプリカセット、またはステートフルセットなどのコントローラーオブジェクトによってサポートされない Pod。
- ローカルストレージを持つ Pod。
- リソース不足、互換性のないノードセレクターまたはアフィニティー、アンチアフィニティーの一致などの理由で、他の場所に移動できない Pod。
-
それらに
"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"
アノテーションがない場合、"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"
アノテーションを持つ Pod。
たとえば、CPU の上限を 64 コアに設定し、それぞれ 8 コアのマシンのみを作成するようにクラスターオートスケーラーを設定したとします。クラスターが 30 コアで起動した場合、クラスターオートスケーラーはさらに最大 4 ノードを追加して 32 コアを増やし、合計 62 コアにすることができます。
7.1.2. 制限事項 リンクのコピーリンクがクリップボードにコピーされました!
クラスターオートスケーラーを設定する場合は、使用に関する追加の制限が適用されます。
- 自動スケーリングされたノードグループにあるノードを直接変更しないようにしてください。同じノードグループ内のすべてのノードには同じ容量およびラベルがあり、同じシステム Pod を実行します。
- Pod の要求を指定します。
- Pod がすぐに削除されるのを防ぐ必要がある場合、適切な PDB を設定します。
- クラウドプロバイダーのクォータが、設定する最大のノードプールに対応できる十分な大きさであることを確認します。
- クラウドプロバイダーで提供されるものなどの、追加のノードグループの Autoscaler を実行しないようにしてください。
クラスターオートスケーラーが自動スケーリング対象のノードグループにノードを追加するのは、その追加によって Pod がスケジュール可能になる場合に限られます。利用可能なノードタイプが Pod 要求の要件を満たすことができない場合、またはその要件を満たすことができるノードグループが最大サイズに達している場合、クラスターオートスケーラーはスケールアップできません。
7.1.3. 他のスケジュール機能との連携 リンクのコピーリンクがクリップボードにコピーされました!
Horizontal Pod Autoscaler (HPA) とクラスターオートスケーラーは、異なる方法でクラスターリソースを変更します。HPA は、現在の CPU 負荷に基づいてデプロイメント、またはレプリカセットのレプリカ数を変更します。負荷が増大すると、HPA はクラスターで利用できるリソース量に関係なく、新規レプリカを作成します。リソースが不足している場合、クラスターオートスケーラーは、HPA によって作成された Pod が実行できるようにリソースを追加します。負荷が減少する場合、HPA は一部のレプリカを停止します。この動作によってノードの使用率が低下するか、ノードが完全に空になった場合、クラスターオートスケーラーは不要なノードを削除します。
クラスターオートスケーラーは Pod の優先度を考慮します。Pod の優先度とプリエンプション機能を使用すると、クラスターに十分なリソースがない場合に優先度に基づいて Pod をスケジュールできますが、クラスターオートスケーラーにより、クラスターにすべての Pod を実行するためのリソースが確保されます。両方の機能の意図を反映するために、クラスターオートスケーラーには、優先度のカットオフ機能が搭載されています。このカットオフ機能を使用すると、"ベストエフォート" の Pod をスケジュールできます。この Pod は、クラスターオートスケーラーによるリソースの増加を引き起こすことなく、予備のリソースが利用可能な場合にのみ実行されます。
カットオフ値よりも低い優先度を持つ Pod は、クラスターのスケールアップを引き起さず、クラスターのスケールダウンを妨げることもありません。これらの Pod を実行するために新規ノードは追加されず、これらの Pod を実行しているノードはリソースを解放するために削除される可能性があります。
7.1.4. Cluster Autoscaler の設定 リンクのコピーリンクがクリップボードにコピーされました!
まず Cluster Autoscaler をデプロイし、リソースの自動スケーリングを OpenShift Container Platform クラスターで管理します。
Cluster Autoscaler のスコープはクラスター全体に設定されるため、クラスター用に 1 つの Cluster Autoscaler のみを作成できます。
7.1.4.1. Cluster Autoscaler リソース定義 リンクのコピーリンクがクリップボードにコピーされました!
次の ClusterAutoscaler
リソース定義に、Cluster Autoscaler のパラメーターとサンプル値を示します。
既存の Cluster Autoscaler の設定を変更すると、Cluster Autoscaler が再起動します。
- 1
- Cluster Autoscaler に追加のノードをデプロイさせるために Pod が超えている必要のある優先順位を指定します。32 ビットの整数値を入力します。
podPriorityThreshold
値は、各 Pod に割り当てるPriorityClass
の値と比較されます。 - 2
- デプロイするノードの最大数を指定します。この値は、Autoscaler が制御するマシンだけでなく、クラスターにデプロイされるマシンの合計数です。この値は、すべてのコントロールプレーンおよびコンピュートマシン、および
MachineAutoscaler
リソースに指定するレプリカの合計数に対応するのに十分な大きさの値であることを確認します。 - 3
- クラスターにデプロイするコアの最小数を指定します。
- 4
- クラスターにデプロイするコアの最大数を指定します。
- 5
- クラスターのメモリーの最小量 (GiB 単位) を指定します。
- 6
- クラスターのメモリーの最大量 (GiB 単位) を指定します。
- 7
- オプション: GPU 対応ノードをデプロイするように Cluster Autoscaler を設定するには、
type
値を指定します。この値は、そのタイプの GPU 対応ノードを管理するマシンセット内のspec.template.spec.metadata.labels[cluster-api/accelerator]
ラベルの値と一致する必要があります。たとえば、この値は、Nvidia T4 GPU を表す場合はnvidia-t4
、A10G GPU を表す場合はnvidia-a10g
になります。詳細は、「Cluster Autoscaler 用の GPU マシンセットのラベル付け」を参照してください。 - 8
- クラスターにデプロイする指定タイプの GPU の最小数を指定します。
- 9
- クラスターにデプロイする指定タイプの GPU の最大数を指定します。
- 10
- ロギングの詳細レベルを
0
から10
の間で指定します。次のログレベルのしきい値は、ガイダンスとして提供されています。-
1
: (デフォルト) 変更に関する基本情報。 -
4
: 一般的な問題をトラブルシューティングするためのデバッグレベルの詳細度。 -
9
: 広範なプロトコルレベルのデバッグ情報。
値を指定しない場合は、デフォルト値の
1
が使用されます。 -
- 11
- 12
- Cluster Autoscaler が不必要なノードを削除できるかどうかを指定します。
- 13
- オプション: ノードが最後に 追加 されてからノードを削除するまで待機する期間を指定します。値を指定しない場合、デフォルト値の
10m
が使用されます。 - 14
- オプション: ノードが最後に 削除 されてからノードを削除するまで待機する期間を指定します。値を指定しない場合、デフォルト値の
0s
が使用されます。 - 15
- オプション: スケールダウンが失敗してからノードを削除するまで待機する期間を指定します。値を指定しない場合、デフォルト値の
3m
が使用されます。 - 16
- オプション: 不要なノードが削除の対象となるまでの期間を指定します。値を指定しない場合、デフォルト値の
10m
が使用されます。 - 17
- オプション: node utilization level を指定します。この使用率レベルを下回るノードは、削除の対象となります。
ノード使用率は、要求されたリソースをそのノードに割り当てられたリソースで割ったもので、
"0"
より大きく"1"
より小さい値でなければなりません。値を指定しない場合、Cluster Autoscaler は 50% の使用率に対応するデフォルト値"0.5"
を使用します。この値は文字列として表現する必要があります。 - 18
- オプション: クラスターオートスケーラーで使用するエクスパンダーを指定します。次の値が有効です。
-
LeastWaste
: スケーリング後にアイドル CPU を最小限に抑えるマシンセットを選択します。複数のマシンセットで同じ量のアイドル CPU が生成される場合、選択によって未使用のメモリーが最小限に抑えられます。 -
Priority
: ユーザーが割り当てた優先度が最も高いマシンセットを選択します。このエクスパンダーを使用するには、マシンセットの優先順位を定義する config map を作成する必要があります。詳細は、「クラスターオートスケーラーの優先度エクスパンダーの設定」を参照してください。 -
Random
: (デフォルト) マシンセットをランダムに選択します。
値を指定しない場合は、デフォルト値
Random
が使用されます。[LeastWaste, Priority]
形式を使用して複数のエクスパンダーを指定できます。クラスターオートスケーラーは、指定された順序に従って各エクスパンダーを適用します。[LeastWaste, Priority]
の例では、クラスターオートスケーラーは最初にLeastWaste
基準に従って評価します。複数のマシンセットがLeastWaste
基準を同等に満たしている場合、クラスターオートスケーラーはPriority
基準に従って評価します。複数のマシンセットが指定されたエクスパンダーのすべてを同等に満たす場合、クラスターオートスケーラーはランダムに 1 つを選択して使用します。 -
スケーリング操作の実行時に、Cluster Autoscaler は、デプロイするコアの最小および最大数、またはクラスター内のメモリー量などの ClusterAutoscaler
リソース定義に設定された範囲内に残ります。ただし、Cluster Autoscaler はそれらの範囲内に留まるようクラスターの現在の値を修正しません。
Cluster Autoscaler がノードを管理しない場合でも、最小および最大の CPU、メモリー、および GPU の値は、クラスター内のすべてのノードのこれらのリソースを計算することによって決定されます。たとえば、Cluster Autoscaler がコントロールプレーンノードを管理しない場合でも、コントロールプレーンノードはクラスターのメモリーの合計に考慮されます。
7.1.4.2. クラスターオートスケーラーの優先度エクスパンダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
クラスターオートスケーラーが優先度エクスパンダーを使用する場合、ユーザーが割り当てた優先度が最も高いマシンセットを使用してスケールアップします。このエクスパンダーを使用するには、マシンセットの優先順位を定義する config map を作成する必要があります。
指定された優先レベルごとに、マシンセットの選択の優先順位を付けるときに使用するマシンセットを識別するための正規表現を作成する必要があります。正規表現は、クラスターオートスケーラーが選択対象として考慮するコンピュートマシンセットの名前と一致する必要があります。
前提条件
- Machine API を使用する OpenShift Container Platform クラスターをデプロイしている。
-
cluster-admin
権限を持つアカウントを使用してクラスターにアクセスできる。 -
OpenShift CLI (
oc
) がインストールされている。
手順
以下のコマンドを実行して、クラスター内のコンピュートマシンセットをリスト表示します。
oc get machinesets.machine.openshift.io
$ oc get machinesets.machine.openshift.io
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 正規表現を使用して、優先レベルを設定するコンピュートマシンセットの名前に一致する 1 つ以上のパターンを作成します。
たとえば、名前に文字列
fast
が含まれるすべてのコンピュートマシンセットに一致させるには、正規表現パターン*fast*
を使用します。次のように config map を定義する
cluster-autoscaler-priority-expander.yml
YAML ファイルを作成します。優先度エクスパンダー config map の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して config map を作成します。
oc create configmap cluster-autoscaler-priority-expander \ --from-file=<location_of_config_map_file>/cluster-autoscaler-priority-expander.yml
$ oc create configmap cluster-autoscaler-priority-expander \ --from-file=<location_of_config_map_file>/cluster-autoscaler-priority-expander.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
以下のコマンドを実行して config map を確認します。
oc get configmaps cluster-autoscaler-priority-expander -o yaml
$ oc get configmaps cluster-autoscaler-priority-expander -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
-
優先度エクスパンダーを使用するには、
ClusterAutoscaler
リソース定義がexpanders: ["Priority"]
パラメーターを使用するように設定されていることを確認します。
7.1.4.3. Cluster Autoscaler 用の GPU マシンセットのラベル付け リンクのコピーリンクがクリップボードにコピーされました!
マシンセットラベルを使用すると、Cluster Autoscaler が GPU 対応ノードのデプロイに使用できるマシンを指定できます。
前提条件
- クラスターが Cluster Autoscaler を使用している。
手順
Cluster Autoscaler が GPU 対応ノードのデプロイに使用するマシンを作成するのに必要なマシンセットに、
cluster-api/accelerator
ラベルを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 英数字、
-
、_
、.
で構成され、先頭と末尾が英数字であるラベルを指定します。たとえば、Nvidia T4 GPU を表すにはnvidia-t4
を使用し、A10G GPU を表すにはnvidia-a10g
を使用します。注記ClusterAutoscaler
CR のspec.resourceLimits.gpus.type
パラメーターにこのラベルの値を指定する必要があります。詳細は、「Cluster Autoscaler リソース定義」を参照してください。
7.1.5. Cluster Autoscaler のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Cluster Autoscaler をデプロイするには、ClusterAutoscaler
リソースのインスタンスを作成します。
手順
-
カスタムリソース定義を含む
ClusterAutoscaler
リソースの YAML ファイルを作成します。 以下のコマンドを実行して、クラスター内にカスタムリソースを作成します。
oc create -f <filename>.yaml
$ oc create -f <filename>.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<filename>
はカスタムリソースファイルの名前です。
次のステップ
- Cluster Autoscaler の設定後に、1 つ以上の Machine Autoscaler を設定する 必要があります。