第7章 OpenShift Container Platform クラスターへの自動スケーリングの適用
OpenShift Container Platform クラスターに自動スケーリングを適用して、デプロイメントのニーズに合わせてクラスターのサイズを自動的に調整します。Cluster Autoscaler をデプロイしてから、クラスター内のマシンタイプごとにマシンオートスケーラーをデプロイできます。Cluster Autoscaler の設定後に、1 つ以上の 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. 自動ノード削除 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Autoscaler は 10 秒ごとにクラスター内の不要なノードをチェックし、そのノードを削除します。Cluster Autoscaler は、次の条件が当てはまる場合に、ノードを削除対象とみなします。
-
ノード使用率が、クラスターの ノード使用率 レベルのしきい値を下回っている。ノード使用率レベルとは、要求されたリソースの合計をノードに割り当てられたリソースで除算したものです。
ClusterAutoscalerカスタムリソースで値が指定されいない場合、Cluster Autoscaler はデフォルト値の0.5を使用します。これは 50% の使用率に相当します。 - Cluster Autoscaler が、ノード上で実行されているすべての Pod を他のノードに移動できる。Kubernetes スケジューラーは、ノード上の Pod のスケジュールを担当します。
- Cluster Autoscaler に、スケールダウンを無効にするアノテーションがない。
ノードに次のタイプの Pod が存在する場合、Cluster Autoscaler はノードを削除しません。
- 制限のある 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 コアのマシンのみを作成するように Cluster Autoscaler を設定したとします。クラスターが 30 コアで起動した場合、Cluster Autoscaler はさらに最大 4 ノードを追加して 32 コアを増やし、合計 62 コアにすることができます。
7.1.2. 制限事項 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Autoscaler を設定する場合は、使用に関する追加の制限が適用されます。
- 自動スケーリングされたノードグループにあるノードを直接変更しないようにしてください。同じノードグループ内のすべてのノードには同じ容量およびラベルがあり、同じシステム Pod を実行します。
- Pod の要求を指定します。
- Pod がすぐに削除されるのを防ぐ必要がある場合、適切な PDB を設定します。
- クラウドプロバイダーのクォータが、設定する最大のノードプールに対応できる十分な大きさであることを確認します。
- クラウドプロバイダーで提供されるものなどの、追加のノードグループの Autoscaler を実行しないようにしてください。
Cluster Autoscaler が自動スケーリング対象のノードグループにノードを追加するのは、その追加によって Pod がスケジュール可能になる場合に限られます。利用可能なノードタイプが Pod 要求の要件を満たすことができない場合、またはその要件を満たすことができるノードグループが最大サイズに達している場合、Cluster Autoscaler はスケールアップできません。
7.1.3. 他のスケジュール機能との連携 リンクのコピーリンクがクリップボードにコピーされました!
Horizontal Pod Autoscaler (HPA) と Cluster Autoscaler は、異なる方法でクラスターリソースを変更します。HPA は、現在の CPU 負荷に基づいてデプロイメント、またはレプリカセットのレプリカ数を変更します。負荷が増大すると、HPA はクラスターで利用できるリソース量に関係なく、新規レプリカを作成します。リソースが不足している場合、Cluster Autoscaler は、HPA によって作成された Pod が実行できるようにリソースを追加します。負荷が減少する場合、HPA は一部のレプリカを停止します。この動作によってノードの使用率が低下するか、ノードが完全に空になった場合、Cluster Autoscaler は不要なノードを削除します。
Cluster Autoscaler は Pod の優先度を考慮します。Pod の優先度とプリエンプション機能を使用すると、クラスターに十分なリソースがない場合に優先度に基づいて Pod をスケジュールできますが、Cluster Autoscaler により、クラスターにすべての Pod を実行するためのリソースが確保されます。両方の機能の意図を反映するために、Cluster Autoscaler には、優先度のカットオフ機能が搭載されています。このカットオフ機能を使用すると、"ベストエフォート" の Pod をスケジュールできます。この Pod は、Cluster Autoscaler によるリソースの増加を引き起こすことなく、予備のリソースが利用可能な場合にのみ実行されます。
カットオフ値よりも低い優先度を持つ Pod は、クラスターのスケールアップを引き起さず、クラスターのスケールダウンを妨げることもありません。これらの Pod を実行するために新規ノードは追加されず、これらの Pod を実行しているノードはリソースを解放するために削除される可能性があります。
7.1.4. Cluster Autoscaler リソース定義 リンクのコピーリンクがクリップボードにコピーされました!
次の ClusterAutoscaler リソース定義に、Cluster Autoscaler のパラメーターとサンプル値を示します。
既存の Cluster Autoscaler の設定を変更すると、Cluster Autoscaler が再起動します。
apiVersion: "autoscaling.openshift.io/v1"
kind: "ClusterAutoscaler"
metadata:
name: "default"
spec:
podPriorityThreshold: -10
resourceLimits:
maxNodesTotal: 24
cores:
min: 8
max: 128
memory:
min: 4
max: 256
gpus:
- type: <gpu_type>
min: 0
max: 16
logVerbosity: 4
scaleDown:
enabled: true
delayAfterAdd: 10m
delayAfterDelete: 5m
delayAfterFailure: 30s
unneededTime: 5m
utilizationThreshold: "0.4"
scaleUp:
newPodScaleUpDelay: "10s"
expanders: ["Random"]
| パラメーター | 説明 |
|---|---|
|
|
Cluster Autoscaler に追加のノードをデプロイさせるために Pod が超えている必要のある優先順位を指定します。32 ビットの整数値を入力します。 |
|
|
デプロイするノードの最大数を指定します。この値は、Autoscaler が制御するマシンだけでなく、クラスターにデプロイされるマシンの合計数です。この値は、すべてのコントロールプレーンおよびコンピュートマシン、および |
|
| クラスターにデプロイするコアの最小数を指定します。 |
|
| クラスターにデプロイするコアの最大数を指定します。 |
|
| クラスターのメモリーの最小量 (GiB 単位) を指定します。 |
|
| クラスターのメモリーの最大量 (GiB 単位) を指定します。 |
|
|
オプション: GPU 対応ノードをデプロイするように Cluster Autoscaler を設定するには、 |
|
| クラスターにデプロイする指定タイプの GPU の最小数を指定します。 |
|
| クラスターにデプロイする指定タイプの GPU の最大数を指定します。 |
|
|
ロギングの詳細レベルを
値を指定しない場合は、デフォルト値の |
|
|
このセクションでは、有効な ParseDuration 期間 ( |
|
| Cluster Autoscaler が不必要なノードを削除できるかどうかを指定します。 |
|
|
オプション: ノードが最後に 追加 されてからノードを削除するまで待機する期間を指定します。値を指定しない場合、デフォルト値の |
|
|
オプション: ノードが最後に 削除 されてからノードを削除するまで待機する期間を指定します。値を指定しない場合、デフォルト値の |
|
|
オプション: スケールダウンが失敗してからノードを削除するまで待機する期間を指定します。値を指定しない場合、デフォルト値の |
|
|
オプション: 不要なノードが削除の対象となるまでの期間を指定します。値を指定しない場合、デフォルト値の |
|
| オプション: node utilization level を指定します。この使用率レベルを下回るノードは、削除の対象となります。
ノード使用率は、要求されたリソースをそのノードに割り当てられたリソースで割ったもので、 |
|
|
このセクションでは、新たに保留中となった Pod を認識するまでの待機期間を、有効な ParseDuration 間隔 ( |
|
|
オプション: 新しいノードを追加する前に、スケジュール不可能な新しい Pod を無視する期間を指定します。値を指定しない場合、デフォルト値の |
|
| オプション: Cluster Autoscaler で使用するエクスパンダーを指定します。次の値が有効です。
値を指定しない場合は、デフォルト値
|
スケーリング操作の実行時に、Cluster Autoscaler は、デプロイするコアの最小および最大数、またはクラスター内のメモリー量などの ClusterAutoscaler リソース定義に設定された範囲内に残ります。ただし、Cluster Autoscaler はそれらの範囲内に留まるようクラスターの現在の値を修正しません。
Cluster Autoscaler がノードを管理しない場合でも、最小および最大の CPU、メモリー、および GPU の値は、クラスター内のすべてのノードのこれらのリソースを計算することによって決定されます。たとえば、Cluster Autoscaler がコントロールプレーンノードを管理しない場合でも、コントロールプレーンノードはクラスターのメモリーの合計に考慮されます。
7.1.5. Cluster Autoscaler の優先度エクスパンダーの設定 リンクのコピーリンクがクリップボードにコピーされました!
Cluster Autoscaler がクラスターのサイズを増やすときにどのマシンセットを拡張するかを制御するために、優先度エクスパンダーを設定します。優先度の値と、マシンセットを定義する正規表現をリストすることで、優先度エクスパンダー config map を作成できます。
前提条件
- Machine API を使用する OpenShift Container Platform クラスターをデプロイしている。
-
cluster-admin権限を持つアカウントを使用してクラスターにアクセスできる。 -
OpenShift CLI (
oc) がインストールされている。
手順
以下のコマンドを実行して、クラスター内のコンピュートマシンセットをリスト表示します。
$ oc get machinesets.machine.openshift.io出力例
NAME DESIRED CURRENT READY AVAILABLE AGE archive-agl030519-vplxk-worker-us-east-1c 1 1 1 1 25m fast-01-agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m fast-02-agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m fast-03-agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m fast-04-agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m prod-01-agl030519-vplxk-worker-us-east-1a 1 1 1 1 33m prod-02-agl030519-vplxk-worker-us-east-1c 1 1 1 1 33m正規表現を使用して、優先レベルを設定するコンピュートマシンセットの名前に一致する 1 つ以上のパターンを作成します。
たとえば、名前に文字列
fastが含まれるすべてのコンピュートマシンセットに一致させるには、正規表現パターン*fast*を使用します。次のように config map を定義する
cluster-autoscaler-priority-expander.ymlYAML ファイルを作成します。優先度エクスパンダー config map の例
apiVersion: v1 kind: ConfigMap metadata: name: cluster-autoscaler-priority-expander namespace: openshift-machine-api data: priorities: |- 10: - .*fast.* - .*archive.* 40: - .*prod.*マシンセットの優先順位を定義します。
prioritiesの値は正の整数である必要があります。Cluster Autoscaler は、値の低い優先度の前に値の大きい優先度を使用します。優先度レベルごとに、使用するマシンセットに対応する正規表現を指定します。以下のコマンドを実行して config map を作成します。
$ oc create configmap cluster-autoscaler-priority-expander \ --from-file=<location_of_config_map_file>/cluster-autoscaler-priority-expander.yml
検証
以下のコマンドを実行して config map を確認します。
$ oc get configmaps cluster-autoscaler-priority-expander -o yaml
次のステップ
-
優先度エクスパンダーを使用するには、
ClusterAutoscalerリソース定義がexpanders: ["Priority"]パラメーターを使用するように設定されていることを確認します。
7.1.6. Cluster Autoscaler 用の GPU マシンセットのラベル付け リンクのコピーリンクがクリップボードにコピーされました!
クラスターオートスケーラーが GPU 対応ノードに使用できるマシンを示すために、マシンセットにラベルを付けてください。アクセラレーターラベルを適用することで、オートスケーラーが GPU ワークロードに適したリソースを確実にデプロイできるようになります。
前提条件
- クラスターが Cluster Autoscaler を使用している。
手順
Cluster Autoscaler が GPU 対応ノードのデプロイに使用するマシンを作成するのに必要なマシンセットに、
cluster-api/acceleratorラベルを追加します。apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: name: machine-set-name spec: template: spec: metadata: labels: cluster-api/accelerator: <accelerator_name>ここでは、以下のようになります。
<accelerator_name>英数字、
-、_、.で構成され、先頭と末尾が英数字であるラベルを指定します。たとえば、Nvidia T4 GPU を表すにはnvidia-t4を使用し、A10G GPU を表すにはnvidia-a10gを使用します。注記ClusterAutoscalerCR のspec.resourceLimits.gpus.typeパラメーターにこのラベルの値を指定する必要があります。詳細は、「Cluster Autoscaler リソース定義」を参照してください。
7.1.7. Cluster Autoscaler のデプロイ リンクのコピーリンクがクリップボードにコピーされました!
Cluster Autoscaler をデプロイするには、ClusterAutoscaler リソースのインスタンスを作成します。
手順
-
カスタムリソース定義を含む
ClusterAutoscalerリソースの YAML ファイルを作成します。 以下のコマンドを実行して、クラスター内にカスタムリソースを作成します。
$ oc create -f <filename>.yamlここでは、以下のようになります。
- <filename>
- 作成した YAML ファイルの名前を指定します。