ユーザー クラスタのスケーリング

Anthos clusters on AWS 上でワークロードをスケーリングするには、自動的にスケールアウトするように AWSNodePool を構成するか、スケールアップまたはスケールダウンするように AWSNodePool を手動で作成および削除します。

Cluster Autoscaler

Anthos clusters on AWS は、Kubernetes クラスタ オートスケーラーを実装します。ノードの需要が高い場合、クラスタ オートスケーラーはノードプールにノードを追加します。需要が少ない場合、クラスタのオートスケーラーは指定した最小サイズにスケールダウンします。これにより、ワークロードの可用性が向上し、コストも抑えられます。

概要

クラスタ オートスケーラーは、ワークロードの需要に基づいて、特定のノードプール内のノード数を自動的に変更します。ノードを手動で追加または削除する必要はありません。また、ノードプールを過剰にプロビジョニングする必要もありません。ノードプールの最小サイズと最大サイズを指定すると、クラスタは自動的にスケーリングされます。

クラスタの自動スケーリング時にリソースを削除または移動すると、ワークロードが一時的に中断することがあります。たとえば、ワークロードが 1 つのレプリカで構成されている場合、現在のノードを削除すると、レプリカの Pod は別のノードに再スケジュールされる可能性があります。AWSNodePool でクラスタ オートスケーラーを有効にする前に、一時的な中断が許容されるようにワークロードを設計するか、重要な Pod で割り込みが発生しないように設計してください。

クラスタ オートスケーラーの仕組み

クラスタ オートスケーラーはノードプール単位で機能します。ノードプールを作成するときに、AWSNodePool Kubernetes リソースでノードプールの最小サイズと最大サイズを指定します。

クラスタ オートスケーラーを無効にするには、AWSNodePool の spec.minNodeCountspec.maxNodeCount に設定します。

クラスタ オートスケーラーは、実際のリソース使用率ではなく、ノードプールのノードで実行されている Pod のリソース リクエスト数に基づいて、ノードプールのサイズを自動的に調整します。Pod とノードのステータスを定期的にチェックし、次の処理を行います。

ノードプール内のノード数が不足しているために Pod のスケジューリングができない場合、クラスタ オートスケーラーはノードプールの最大サイズまでノードを追加します。ノードの使用率が低く、ノードプール内のノード数を少なくしてもすべての Pod のスケジューリングが可能な場合、クラスタ オートスケーラーはノードプールの最小サイズになるまでノードを削除します。ノードがタイムアウト後(10 分後)に正常にドレインされなかった場合、ノードは強制終了されます。猶予期間は指定できません。

Pod がリクエストするリソースが少なすぎる場合(たとえば、デフォルト値が過小な場合)、クラスタ オートスケーラーは状況を改善できません。クラスタ オートスケーラーが正常に動作するように、すべてのワークロードで適切なリソース リクエストを行う必要があります。

動作条件

クラスタ オートスケーラーは、次のことを前提としてノードプールのサイズを変更します。

  • 複製対象のすべての Pod を、他のノードで再起動できるものとします。これにより、短い中断が発生する可能性があります。サービスの中断を許容できない場合、クラスタ オートスケーラーの使用はおすすめしません。

  • 1 つのノードプール内のすべてのノードは同じラベルセットを持つものとします。

  • 異なるインスタンス タイプを持つ AWSNodePool がある場合、クラスタ オートスケーラーは、新しいノードのリリースにかかる相対的な費用を考慮し、最も費用のかからないノードプールを拡張しようとします。

  • 最初のクラスタまたはノードプールの作成後に手動で追加されたラベルは追跡されません。クラスタ オートスケーラーによって作成されたノードには、ノードプールの作成時に --node-labels で指定されたラベルが割り当てられます。

ノードプールのサイズを変更する

AWSNodePool には minNodeCount フィールドと maxNodeCount フィールドがあります。これらのフィールドで、プール内のワーカーノードの最小数と最大数を宣言します。この値は、AWSNodePool の作成前または作成後に編集できます。

始める前に

ユーザー クラスタの作成の手順に沿ってクラスタをプロビジョニングします。クラスタを作成する YAML ファイル(cluster-0.yaml など)を用意します。

ノードプールの自動スケーリングの有効化

  1. anthos-aws ディレクトリから anthos-gke を使用して、コンテキストを管理サービスに切り替えます。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. クラスタ オートスケーラーを有効にするには、AWSNodePool のマニフェストを編集します。cluster-0.yaml ファイルを編集して AWSNodePool セクションを見つけます。spec.minNodeCountspec.maxNodeCount の値を変更します。

    次の例では、このノードプールの最小サイズを 3 ノードで維持し、クラスタ オートスケーラーで 10 ノードまで増やせるようにします。

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: cluster-0-pool-0
    spec:
      clusterName: cluster-0
      version: 1.24.6-gke.1300
      minNodeCount: 3
      maxNodeCount: 10
      ...
    
  3. 次に、YAML を適用してノードプールのサイズを変更します。

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl apply -f cluster-0.yaml
    
  4. AWSNodePool リソースは Resizing 状態に移行します。AWSNodePool がスケーリングを完了すると、Provisioned 状態になります。

    env HTTPS_PROXY=http://localhost:8118 \
        kubectl get AWSNodePools
    

    次の出力は、AWSNodePool が Resizing であることを示しています。サイズ変更オペレーションには数分かかることがあります。

    NAME               CLUSTER     STATE     AGE   VERSION
    cluster-0-pool-0   cluster-0   Resizing  3h    1.24.6-gke.1300
    

新しい AWSNodePool を手動で作成する

新しい AWSNodePool を作成してクラスタをスケーリングすることもできます。新しい AWSNodePool を作成するときに、インスタンス サイズをスケールアップまたはスケールダウンできます。

  1. kubectl get を使用して、既存の AWSNodePool の構成マニフェストを取得します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
    
  2. new_nodepool.yaml を編集して、次の例に存在しないセクションを削除します。ファイルを保存します。

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.24.6-gke.1300
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional
    
  3. マニフェストを管理クラスタに適用して、新しい AWSNodePool を作成します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f new_nodepool.yaml
    

次のステップ

Ingress でバックアップした Service をデプロイする。

その他のオプションを確認するには、AWSNodePool のリファレンス ドキュメントをご覧ください。