クラスターで自動スケーリング機能を使用する準備をする
仮想プライベートクラウド クラシック・インフラストラクチャー
cluster-autoscaler アドオンを使用すると、Red Hat® OpenShift® on IBM Cloud® のクラシック・クラスターまたは VPC クラスターのワーカー・プールを、スケジュールされたワークロードのサイズ要件に応じて自動的にスケーリングして、ワーカー・プール内のワーカー・ノード数を増減できます。 「 cluster-autoscaler 」アドオンは、「 Kubernetes Cluster-Autoscaler」プロジェクトに基づいています。 クラスター・バージョンごとにサポートされるアドオン・バージョンのリストについては、 サポートされるクラスター・アドオン・バージョン を参照してください。
予約を使用するワーカー・プールでクラスター自動スケーリング機能を有効にすることはできません。
オートスケールを理解する
-
クラスター自動スケーリング機能は、クラスターを定期的にスキャンし、ユーザーが構成したワークロード・リソース要求やカスタム設定 (スキャン間隔など) に応じて、管理対象のワーカー・プール内のワーカー・ノードの数を調整します。
-
クラスター自動スケーリング機能は、毎分、以下の状況が発生していないか検査します。
- スケールアップすべき保留ポッド: ワーカー・ノードにポッドをスケジュールできるだけの十分なコンピュート・リソースが存在しない場合、そのポッドは保留ポッドと見なされます。 クラスター自動スケーリング機能は保留ポッドを検出すると、ワークロード・リソース要求を満たすために、ゾーン間で均等にワーカー・ノード数を増やします。
- スケールダウンすべき低使用率のワーカー・ノード: デフォルトでは、ワーカー・ノードが、要求された合計コンピュート・リソースの 50% 未満の状態で 10 分以上実行されていて、ワークロードを他のワーカー・ノードにスケジュール変更できる場合、このワーカー・ノードを、低使用率のワーカー・ノードと見なします。 クラスター自動スケーリング機能は、低使用率のワーカー・ノードを検出すると、必要なコンピュート・リソースだけを使用するように、ワーカー・ノードを 1 つずつ減らしていきます。 必要に応じて、デフォルトのスケールダウン使用率しきい値 (50% が 10 分間) をカスタマイズできます。
-
スキャンとスケールアップ/スケールダウンは一定の間隔で継続して行われ、ワーカー・ノード数によっては、完了までに長い時間がかかることがあります (30 分など)。
-
クラスタのオートスケーラーは、実際のワーカーノードの使用状況ではなく、デプロイメントに対して定義された リソース要求に基づいて、ワーカーノードの数を調整します。 ポッドとデプロイメントから適切な量のリソースが要求されない場合は、ユーザーがそれらの構成ファイルを調整する必要があります。
-
クラスター自動スケーリング機能でそれらを自動的に調整することはできません。 また、ワーカーノードは、クラスタの基本機能、デフォルトおよびカスタムの アドオン、 リソースの予約 のために、一定量の演算リソースを使用している点にご留意ください。
-
一般的に、クラスター自動スケーリング機能は、クラスターのワークロードを実行するために必要なワーカー・ノード数を計算します。 クラスターのスケールアップ/スケールダウンは、以下のようなさまざまな要因によって決定されます。
- ユーザーが設定した 1 ゾーンあたりの最小および最大ワーカー・ノード・サイズ。
- 保留中のポッドリソースリクエスト、およびワークロードに関連付けられた特定のメタデータ(アンチアフィニティ、特定のフレーバーにのみポッドを配置するためのラベル、 ポッドのディスラプションバジェットなど)。
- クラスタのオートスケーラーが管理するワーカープール。マルチゾーンクラスタでは、ゾーンをまたがって管理される場合もあります。
-
以前のバージョンのクラスタオートスケーラは、シミュレーションのスケジューリングに既存のワーカーノードのみに依存していました。 例えば、ワーカープールが0ノードまで縮小された場合、オートスケーラーはそのプールのキャパシティやラベルに関する情報を保持していなかったため、ワーカープールを元に戻すことができませんでした。 その結果、スケール・トゥ・ゼロはサポートされなかった。
-
バージョン 2.0.0 以降、オートスケーラーはワーカープールごとにテンプレートノードを作成します。 このテンプレートは、プール内の新規ノードの割り当て可能CPU、メモリ、ラベル、および汚染状態のモデルを提供するために使用されます。
-
さらに、バージョン では 2.0.0、名前
kube-system空間内のiks-ca-configmapに 2 つの新しいオプション設定が追加されました:OSReservedMemoryGiとOSReservedCPUMiliです。- これらの値は、オペレーティングシステムが各ワーカーノードに予約するCPUとメモリの量を表します。
- これらの値は既に定義されているため、カーネル使用率を調整することはできません。
- オートスケーラは、シミュレーションをスケジューリングするために割り当て可能なリソースを計算する際に、ノードの容量からこれらの値を差し引く。
- デフォルトでは、オートスケーラーは推奨されるOS予約値を使用しますが、ユーザーはこれらを上書きして、スケジュール可能な容量を調整できます。
詳細については、『 Kubernetes クラスタ・オートスケーラー よくある質問 』の「 スケールアップはどのように機能しますか? 」および「 スケールダウンはどのように機能しますか? 」をご覧ください。
オートスケールのベストプラクティスとは?
- ワーカー・ノード戦略とワークロード・デプロイメント戦略に従うことによって、クラスター自動スケーリング機能を最大限に活用します。 詳細については、『 Kubernetes クラスタ・オートスケーラーに関するよくある質問 』を参照してください。
- いくつかのテスト・ワークロードを使用してクラスター自動スケーリング機能を試す ことで、 スケールアップとスケールダウンの仕組み、構成すること、および ワーカー・ノードのオーバープロビジョン や アプリの制限 など、必要なその他の側面を把握できます。
- その後、テスト環境をクリーンアップして、クラスター自動スケーリング機能のフレッシュ・インストールでこれらのカスタム値や追加設定を組み込む計画を立てます。
スケールアップとスケールダウンの仕組みを変更できますか?
はい、設定をカスタマイズしたり、 Kubernetes の他のリソースを利用したりすることで、スケールアップやスケールダウンの動作を調整することができます。
-
スケールアップの場合、クラスタ・オートスケーラ ConfigMap の値を
scanInterval、expander、skipNodes、maxNodeProvisionTimeなどにカスタマイズできます。 ワーカー・プールのリソースが不足する前にワーカー・ノードをスケールアップできるように、ワーカー・ノードのオーバープロビジョンの方法を検討します。 また、Kubernetes のポッド中断の割り当て量とポッド優先度のカットオフを設定して、スケールアップの仕組みに影響を与えることができます。 -
スケールダウンを行うには、クラスタのオートスケーラーの ConfigMap の値を、
scaleDownUnneededTime、scaleDownDelayAfterAdd、scaleDownDelayAfterDelete、またはscaleDownUtilizationThresholdなどのようにカスタマイズしてください。
ゾーンあたりの最小サイズを増やすことで、クラスターをそのサイズにスケールアップできますか?
いいえ。minSize を設定しても、自動的にスケールアップはトリガーされません。 minSize は、クラスタのオートスケーラーがゾーンごとのワーカーノード数を特定の数未満に縮小しないようにするためのしきい値です。
- クラスターで、ゾーンあたりの数がまだこれに達していない場合は、より多くのリソースを必要とするワークロード・リソース要求が発生するまで、クラスター自動スケーリング機能によってスケールアップされることはありません。 例えば、3 つのゾーンあたり 1 つのワーカー・ノードが含まれた 1 つのワーカー・プールがある場合に (合計 3 つのワーカー・ノード)、
minSizeをゾーンあたり4に設定した場合は、クラスター自動スケーリング機能によって、ゾーンあたりの追加の 3 つのワーカー・ノード (合計 12 個のワーカー・ノード) が即時にプロビジョンされることはありません。 代わりに、リソース要求によってスケールアップがトリガーされます。 - 15 個のワーカー・ノードのリソースを要求するワークロードを作成した場合、クラスター自動スケーリング機能はこの要求を満たすようにワーカー・プールをスケールアップします。 ここで、「
minSize」とは、たとえその数のワーカーノードを必要とするワークロードを削除したとしても、クラスターのオートスケーラーがゾーンごとに4台未満のワーカーノードまでスケールダウンしないことを意味します。
この動作は、クラスター自動スケーリング機能によって管理されないワーカー・プールとどのように異なりますか?
ワーカー・プールを作成するときには、1 ゾーンあたりのワーカー・ノード数を指定します。 ワーカー・プールのワーカー・ノード数は、ユーザーがワーカー・プールのサイズを変更するか、または 再バランス化するまで変わりません。 ワーカー・プールがワーカー・ノードを自動的に追加/削除することはありません。 スケジュールできる数より多くのポッドがある場合は、ユーザーがワーカー・プールのサイズを変更するまで、余分なポッドは保留状態のままです。 ワーカー・プールに対してクラスター自動スケーリング機能を有効にすると、ポッドの仕様の設定とリソース要求に応じてワーカー・ノード数が増減されます。 手動でワーカー・プールをサイズ変更したり再バランス化したりする必要はありません。
GPUオートスケーリングはどのように機能するのですか?
GPU ワーカーノードの自動スケーリングは、クラスタオートスケーラーバージョン 1.2.4 以降と NVIDIA GPU ワーカーノードフレーバーでのみサポートされます。 スケールアップは、ポッドがGPUリソース不足のためにペンディング状態になったときに起こります。 その後、オートスケーラはノードを追加してクラスタをスケールアップする。 スケールダウンは、利用率が設定された scaleDownGPUUtilizationThreshold を下回ると起こります。
この場合、そのノードはスケールダウンが検討される。
複数のワーカー・プールをすぐに自動スケーリングできますか?
はい。クラスター自動スケーリング機能をインストールした後、構成マップでクラスター内のどのワーカー・プールを自動スケーリングするかを選択できます。 1 つのクラスターにつき 1 つの自動スケーリング機能のみを実行できます。 デフォルト・ワーカー・プール以外のワーカー・プールで自動スケーリング機能を作成して有効にしてください。デフォルト・ワーカー・プールには、自動スケールダウンを妨げる可能性のあるシステム・コンポーネントが含まれているからです。
どうすればクラスター自動スケーリング機能が、アプリで必要なリソースに対応して確実に実行されますか?
クラスタ・オートスケーラーは、ワークロード のリソース要求に応じてクラスタをスケーリングします。 そのため、すべてのデプロイメントについて リソース要求を指定してください。クラスタのオートスケーラーは、このリソース要求に基づいて、ワークロードの実行に必要なワーカーノードの数を算出するからです。 自動スケーリング機能は、ワークロード構成によって要求されるコンピュートの使用量に基づいており、マシン・コストなどの他の要因を考慮していないことに注意してください。
ワーカー・プールをゼロ (0) ノードまでスケールダウンできますか?
はい。 Cluster Autoscaler アドオンのバージョンから 2.0.0、特定のワーカープールをノード数ゼロまでスケールダウンできるようになりました。
- なぜこれが役立つのか?
- ワークロードが実行されていない場合、スケーリングをゼロにすることでコスト削減が可能になります。 オートスケーラーは必要なときに自動的にノードを復旧させます。
- どのように機能しますか。
- 実行可能なポッドが存在しない場合、オートスケーラーはワーカープールを0ノードまで縮小できます。 新しいポッドがリソースを必要とする場合、オートスケーラーは自動的にプールをスケールアップします。
- 何をすればいいですか?
-
- アドオンのバージョンを確認し、 以降 v2.0.0 を使用していることを確認してください。
-
- オートスケーラー設定内のワーカープール用に
minSize = 0設定します。 パブリックALBを有効にしている場合は、高可用性を実現するため、ゾーンごとにminSize = 2設定してください。
- オートスケーラー設定内のワーカープール用に
- クラスタのクォーラム要件とは何ですか?
- クラスター全体をゼロまでスケールダウンすることはできないことに注意してください。 クラスタの健全性を維持し、クォーラム etcd を確保するためには、最低限のノード数が稼働状態を維持する必要があります。 この定足数が満たされた場合、他のワーカープールをゼロに縮小できます。
自動スケーリングのためにデプロイメントを最適化できますか?
はい。デプロイメントにいくつかの Kubernetes 機能を追加して、クラスター自動スケーリング機能によってスケーリングのためにリソース要求がどのように考慮されるかを調整できます。
- ワーカー・プールにテイントを適用することで、一致する容認が適用されたデプロイメントまたはポッドのみをそのワーカー・プールにデプロイできるようにします。
- デフォルト・ワーカー・プール以外のワーカー・プールにラベルを追加します。 このラベルは、ラベル付けされたワーカー・プール内のワーカー・ノード上にデプロイできるワークロードを制限する
nodeAffinityまたはnodeSelectorを指定するために、デプロイメント構成で使用されます。 - ポッドの割り当て制限を活用して、ポッドの急な再スケジューリングや削除を防ぐようにしてください。
- podの優先度を使用している場合、 優先度のしきい値を編集することで、どのような優先度がスケーリングアップを引き起こすかを変更できます。
デフォルトでは、優先度のカットオフはゼロ (
0) です。
自動スケーリングされたワーカー・プールでテイントと容認を使用できますか?
はい。ただし、既存のワーカー・ノードと将来のワーカー・ノードのすべてに同じテイントが設定されるように、テイントはワーカー・プール・レベルで適用してください。 その場合、これらのワークロードが、対応するテイントを持つ自動スケーリングされるワーカープールにスケジューリングされるように、 ワークロード構成に一致する許容範囲を指定する必要があります。 テイントを適用したワーカー・プールでは許容されないワークロードをデプロイすると、そのワーカー・ノードはスケールアップ対象とは見なされないので、クラスターに十分な容量があっても追加のワーカー・ノードが注文されることがあることに注意してください。 一方、テイントを適用したワーカー・プールでも、使用されているリソースがしきい値 (デフォルトでは 50%) 未満であるものは、低使用率ワーカー・ノードとして検出され、スケールダウンの対象と見なされます。
自動スケーリング用のクラスタの準備
IBM Cloud のクラスター自動スケーリング機能アドオンをインストールする前に、自動スケーリングを可能にするためのクラスターの準備を行うことができます。
クラスター自動スケーリング機能アドオンは、ベアメタル・ワーカー・ノードではサポートされません。
-
始める前に、必要な CLI とプラグインをインストールします。
- IBM Cloud CLI (
ibmcloud) - IBM Cloud Kubernetes Service プラグイン (
ibmcloud oc) - IBM Cloud Container Registry プラグイン (
ibmcloud cr) - Kubernetes (
kubectl)
- IBM Cloud CLI (
-
IBM Cloud の ID/アクセス管理の資格情報がクラスターに保管されていることを確認します。 クラスター自動スケーリング機能はこのシークレットを使用して資格情報を認証します。 シークレットが欠落している場合は、資格情報をリセットすることでシークレットを作成します。
oc get secrets -n kube-system | grep storage-secret-store -
defaultワーカー・プール以外のワーカー・プールで自動スケーリングを行うことを計画します。defaultワーカー・プールには、自動スケール・ダウンを防止する可能性のあるシステム・コンポーネントが含まれているためです。 オートスケーリングが有効になっているワーカープールにデプロイしたいワークロードに対して ノードアフィニティを設定できるように、そのワーカープールにラベルを付与してください。 例えば、app: nginxなどのラベルを使用します。 次のオプションから選択します。- 「
default」ワーカープール以外の VPC または クラシックワーカー プールを作成し、自動スケーリングされるワーカープール上で実行するワークロードで使用するラベルを割り当てます。 - 「
default」ワーカープール以外の 既存のワーカープールにラベルを追加します。
- 「
-
自動スケーリング機能に必要なラベルがワーカー・プールに付加されていることを確認します。 出力には、必須の
ibm-cloud.kubernetes.io/worker-pool-idラベルと、ノード・アフィニティー用に以前に作成したラベルが表示されます。 これらのラベルが表示されない場合は、ワーカープールを追加し、 ノードアフィニティ用のラベルを追加してください。ibmcloud oc worker-pool get --cluster CLUSTER_NAME_OR_ID --worker-pool WORKER_POOL_NAME_OR_ID | grep Labelsラベル付きのワーカー・プールの出力例。
Labels: ibm-cloud.kubernetes.io/worker-pool-id=a1aa111111b22b22cc3c3cc444444d44-4d555e5 -
自動スケーリングするワーカー・プールにテイントを適用することで、自動スケーリングされるワーカー・プールで実行したいワークロード以外のワークロードをそのワーカー・プールが受け入れないようにします。 「 コミュニティ「 Kubernetes 」のドキュメント 」では、テインツとトレラレーションについてさらに詳しく学ぶことができます。 例として、
use=autoscale:NoExecuteのテイントを設定することが考えられます。 この例では、「NoExecute」というテイントにより、このテイントに対応する許容設定を持たないポッドが排除されます。
次のステップ
クラスタを準備したら、 クラスタオートスケーラアドオンをインストール します。