このドキュメントでは、Google Distributed Cloud でのユーザー クラスタの自動スケーリングについて説明します。
クラスタの自動スケーリングでは、ワークロードの要求に基づいてノードプール内のノード数が増減されます。
始める前に
クラスタ オートスケーラーの制限事項を確認します。
クラスタ オートスケーラーは、以下を前提とします。
複製対象のすべての Pod は、他のノードで再起動できるものとします。これにより、短い停止が発生する可能性があります。サービスの中断を許容できない場合、クラスタ オートスケーラーの使用はおすすめしません。
ユーザーや管理者がノードを手動で管理することはありません。ノードプールに対して自動スケーリングが有効になっている場合は、ノードプールの
replicas
フィールドをオーバーライドできません。1 つのノードプール内のすべてのノードは同じラベルセットを持つものとします。
クラスタの自動スケーリングの仕組み
クラスタ オートスケーラーはノードプール単位で機能します。ノードプールの自動スケーリングを有効にする場合は、そのプールのノードの最小数と最大数を指定します。
クラスタ オートスケーラーは、(実際のリソース使用率ではなく)ノードで実行されている Pod のリソース要求に基づいて、プール内のノード数を自動的に増減します。Pod とノードのステータスを定期的にチェックし、次の処理を行います。
プール内のノード数が不足しているために Pod のスケジューリングができない場合、クラスタ オートスケーラーは指定された最大数までノードを追加します。
ノードの使用率が低く、プール内のノード数を減らした状態ですべての Pod のスケジューリングが可能な場合、クラスタ オートスケーラーはノードを指定された最小数まで削除します。ノードを正しい方法でドレインできない場合、ノードは強制終了され、アタッチされた Kubernetes マネージド ディスクの接続が安全に解除されます。
Pod がリクエストするリソースが少なすぎる場合(あるいは、実際の要件に対して過小なデフォルト値をそのまま使用している場合)、ノードでリソース不足が発生しても、クラスタ オートスケーラーで状況を改善することができません。すべてのワークロードに明示的なリソース リクエストを行うことで、クラスタ オートスケーラーを正確に動作させることができます。
個々のノードプールでは、minReplicas
は 1 以上を指定する必要があります。ただし、未保持のユーザー クラスタノードの合計は、常に 3 以上にする必要があります。つまり、自動スケーリングされたすべてのノードプールの minReplicas
値の合計と、自動スケーリングされていないすべてのノードプールの replicas
値の合計との和を 3 以上にする必要があります。
クラスタ オートスケーラーは、さまざまなノードプール内のインスタンス タイプの相対的なコストを考慮して、可能な限り無駄を最小限に抑える方法でノードプールを拡張しようとします。
自動スケーリングを使用してユーザー クラスタを作成する
ノードプールに対して自動スケーリングを有効にしたユーザー クラスタを作成するには、ユーザー クラスタ構成ファイルのノードプールの autoscaling
セクションに入力します。次に例を示します。
nodePools: - name: pool‐1 … replicas: 3 ... autoscaling: minReplicas: 1 maxReplicas: 5
前述の構成では、3 つのレプリカを持つノードプールを 1 つ作成し、最小ノードプール サイズを 1、最大ノードプール サイズを 5 として自動スケーリングを適用します。
minReplicas
値には 1 以上を指定してください。ノードプールを 0 ノードにスケールダウンすることはできません。
自動スケーリングを使用してノードプールを追加する
自動スケーリング対応のノードプールを既存のクラスタに追加するには:
ユーザー クラスタの構成ファイルを編集して新しいノードプールを追加し、プールの
autoscaling
セクションを追加します。replicas
、minReplicas
、maxReplicas
の値を必要に応じて設定します。次に例を示します。nodePools: - name: my-new-node-pool … replicas: 3 ... autoscaling: minReplicas: 2 maxReplicas: 6
クラスタを更新します。
gkectl update cluster --config USER_CLUSTER_CONFIG \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
既存のノードプールに対して自動スケーリングを有効にする
既存のクラスタ内のノードプールの自動スケーリングを有効にするには:
ユーザー クラスタの構成ファイルで特定の
nodePool
を編集し、autoscaling
セクションを追加します。必要に応じてminReplicas
とmaxReplicas
の値を設定します。nodePools: - name: my-existing-node-pool … replicas: 3 ... autoscaling: minReplicas: 1 maxReplicas: 5
クラスタを更新します。
gkectl update cluster --config USER_CLUSTER_CONFIG \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
既存のノードプールの自動スケーリングを無効にする
特定のノードプールの自動スケーリングを無効にするには:
ユーザー クラスタの構成ファイルを編集し、そのノードプールの
autoscaling
セクションを削除します。gkectl update cluster
を実行します。
クラスタ オートスケーラーの動作を確認する
クラスタ オートスケーラーの動作は、いくつかの方法で特定できます。
クラスタ オートスケーラーのログを確認する
まず、クラスタ オートスケーラー Pod の名前を確認します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n USER_CLUSTER_NAME | grep cluster-autoscaler
クラスタ オートスケーラー Pod のログを確認します。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG logs cluster-autoscaler-POD_NAME --container cluster-autoscaler -n USER_CLUSTER_NAME
POD_NAME は、クラスタ オートスケーラー Pod の名前に置き換えます。
構成マップを確認する
クラスタ オートスケーラーは、kube-system/cluster-autoscaler-status
構成マップを公開します。
構成マップを表示するには:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get configmap cluster-autoscaler-status -n kube-system -o yaml
クラスタの自動スケーリング イベントを確認します。
クラスタの自動スケーリング イベントを確認できます。
- Pod(特に、スケジュールできない Pod、十分に活用されていないノード)
- ノード上
kube-system/cluster-autoscaler-status
構成マップ上。
制限事項
クラスタ オートスケーラーには次の制限事項があります。
フィルタを変更したカスタム スケジュール設定はサポートされていません。
Pod の
PriorityClass
値が-10
以下の場合、ノードはスケールアップされません。詳細については、クラスタ オートスケーラーが Pod の優先度とプリエンプションでどのような役割を果たしているかをご覧ください。Windows ノードプールの自動スケーリングはサポートされていません。
トラブルシューティング
場合によっては、クラスタ オートスケーラーのスケールダウンが完全でなく、スケールダウン後に余分なノードが存在することがあります。これは、必要なシステム Pod が別のノード用にスケジュールされているときに発生する可能性があります。これらのポッドを別のノードに移動するためのトリガーがないためです。使用率が低いノードがいくつかありますが、スケールダウンされません。どうしてでしょうか?をご覧ください。この制限を回避するには、Pod Disruption Budget を構成できます。
クラスタのダウンスケーリングに問題がある場合は、Pod のスケジューリングと停止をご覧ください。
kube-system
Pod にPodDisruptionBudget
を追加する必要が生じることがあります。kube-system
Pod にPodDisruptionBudget
を手動で追加する方法の詳細については、Kubernetes クラスタ オートスケーラーに関するよくある質問をご覧ください。スケールダウンする場合、クラスタ オートスケーラーは、Pod に設定されているスケジューリング ルールとエビクション ルールを考慮します。この制限により、オートスケーラーによってノードが削除されるのを防ぐことができます。次のいずれかの条件を持つ Pod が含まれていると、ノードの削除を防ぐことができます。
Pod のアフィニティまたは反アフィニティ ルールにより、再スケジューリングが防止される。
Pod にローカル ストレージがある。
Pod が、Deployment、StatefulSet、Job、ReplicaSet などのコントローラによって管理されていない。
Pod が kube-system 名前空間にあり、PodDisruptionBudget がない。
アプリケーションの PodDisruptionBudget でも、自動スケーリングを防止できます。ノードを削除すると予算を超過する場合、クラスタはスケールダウンされません。
詳細
クラスタ オートスケーラーの詳細と停止を防ぐ方法については、Kubernetes クラスタ オートスケーラーに関するよくある質問で、以下の項目をご覧ください。
- スケールダウンの仕組みをご覧ください。
- スケールダウン時にクラスタ オートスケーラーは PodDisruptionBudget と連携しますか?
- クラスタ オートスケーラーによるノードの削除を防ぐ Pod の種類はありますか?