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

このドキュメントでは、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 以上である必要があります。 ノードプールは、ノード数をゼロにスケールダウンできません。

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

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

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

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

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

詳細

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