クラスタ自動スケーリングを有効にする

このドキュメントでは、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 ノードにスケールダウンすることはできません。

自動スケーリングを使用してノードプールを追加する

自動スケーリング対応のノードプールを既存のクラスタに追加するには:

  1. ユーザー クラスタの構成ファイルを編集して新しいノードプールを追加し、プールの autoscaling セクションを追加します。replicasminReplicasmaxReplicas の値を必要に応じて設定します。次に例を示します。

    nodePools:
    - name: my-new-node-pool
      …
      replicas: 3
      ...
      autoscaling:
        minReplicas: 2
        maxReplicas: 6
    
  2. クラスタを更新します。

    gkectl update cluster --config USER_CLUSTER_CONFIG \
      --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

既存のノードプールに対して自動スケーリングを有効にする

既存のクラスタ内のノードプールの自動スケーリングを有効にするには:

  1. ユーザー クラスタの構成ファイルで特定の nodePool を編集し、autoscaling セクションを追加します。必要に応じて minReplicasmaxReplicas の値を設定します。

    nodePools:
    - name: my-existing-node-pool
      …
      replicas: 3
      ...
      autoscaling:
        minReplicas: 1
        maxReplicas: 5
    
  2. クラスタを更新します。

    gkectl update cluster --config USER_CLUSTER_CONFIG \
      --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

既存のノードプールの自動スケーリングを無効にする

特定のノードプールの自動スケーリングを無効にするには:

  1. ユーザー クラスタの構成ファイルを編集し、そのノードプールの autoscaling セクションを削除します。

  2. 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 が別のノード用にスケジュールされているときに発生する可能性があります。これらのポッドを別のノードに移動するためのトリガーがないためです。使用率が低いノードがいくつかありますが、スケールダウンされません。どうしてでしょうか?をご覧ください。この制限を回避するには、Pod Disruption Budget を構成できます。

  • クラスタのダウンスケーリングに問題がある場合は、Pod のスケジューリングと停止をご覧ください。kube-system Pod に PodDisruptionBudget を追加する必要が生じることがあります。kube-system Pod に PodDisruptionBudget を手動で追加する方法の詳細については、Kubernetes クラスタ オートスケーラーに関するよくある質問をご覧ください。

  • スケールダウンする場合、クラスタ オートスケーラーは、Pod に設定されているスケジューリング ルールとエビクション ルールを考慮します。この制限により、オートスケーラーによってノードが削除されるのを防ぐことができます。次のいずれかの条件を持つ Pod が含まれていると、ノードの削除を防ぐことができます。

  • アプリケーションの PodDisruptionBudget でも、自動スケーリングを防止できます。ノードを削除すると予算を超過する場合、クラスタはスケールダウンされません。

詳細

クラスタ オートスケーラーの詳細と停止を防ぐ方法については、Kubernetes クラスタ オートスケーラーに関するよくある質問で、以下の項目をご覧ください。