GKE on AWS 上でワークロードをスケーリングするには、自動的にスケールアウトするように AWSNodePool を構成するか、スケールアップまたはスケールダウンするように AWSNodePool を手動で作成および削除します。
クラスタ オートスケーラー
GKE on AWS は、Kubernetes クラスタ オートスケーラーを実装します。ノードの需要が高い場合、クラスタ オートスケーラーはノードプールにノードを追加します。需要が少ない場合、クラスタのオートスケーラーは指定した最小サイズにスケールダウンします。これにより、ワークロードの可用性が向上し、コストも抑えられます。
概要
クラスタ オートスケーラーは、ワークロードの需要に基づいて、特定のノードプール内のノード数を自動的に変更します。ノードを手動で追加または削除する必要はありません。また、ノードプールを過剰にプロビジョニングする必要もありません。ノードプールの最小サイズと最大サイズを指定すると、クラスタは自動的にスケーリングされます。
クラスタの自動スケーリング時にリソースを削除または移動すると、ワークロードが一時的に中断することがあります。たとえば、ワークロードが 1 つのレプリカで構成されている場合、現在のノードを削除すると、レプリカの Pod は別のノードに再スケジュールされる可能性があります。AWSNodePool でクラスタ オートスケーラーを有効にする前に、一時的な中断が許容されるようにワークロードを設計するか、重要な Pod で割り込みが発生しないように設計してください。
クラスタ オートスケーラーの仕組み
クラスタ オートスケーラーはノードプール単位で機能します。ノードプールを作成するときに、AWSNodePool Kubernetes リソースでノードプールの最小サイズと最大サイズを指定します。
クラスタ オートスケーラーを無効にするには、AWSNodePool の spec.minNodeCount
を spec.maxNodeCount
に設定します。
クラスタ オートスケーラーは、実際のリソース使用率ではなく、ノードプールのノードで実行されている Pod のリソース リクエスト数に基づいて、ノードプールのサイズを自動的に調整します。Pod とノードのステータスを定期的にチェックし、次の処理を行います。
ノードプール内のノード数が不足しているために Pod のスケジューリングができない場合、クラスタ オートスケーラーはノードプールの最大サイズまでノードを追加します。ノードの使用率が低く、ノードプール内のノード数を少なくしてもすべての Pod のスケジューリングが可能な場合、クラスタ オートスケーラーはノードプールの最小サイズになるまでノードを削除します。ノードがタイムアウト後(10 分後)に正常にドレインされなかった場合、ノードは強制終了されます。猶予期間は指定できません。
Pod がリクエストするリソースが少なすぎる場合(たとえば、デフォルト値が過小な場合)、クラスタ オートスケーラーは状況を改善できません。クラスタ オートスケーラーが正常に動作するように、すべてのワークロードで適切なリソース リクエストを行う必要があります。
動作条件
クラスタ オートスケーラーは、次のことを前提としてノードプールのサイズを変更します。
複製対象のすべての Pod を、他のノードで再起動できるものとします。これにより、短い中断が発生する可能性があります。サービスの中断を許容できない場合、クラスタ オートスケーラーの使用はおすすめしません。
1 つのノードプール内のすべてのノードは同じラベルセットを持つものとします。
異なるインスタンス タイプを持つ AWSNodePool がある場合、クラスタ オートスケーラーは、新しいノードのリリースにかかる相対的な費用を考慮し、最も費用のかからないノードプールを拡張しようとします。
最初のクラスタまたはノードプールの作成後に手動で追加されたラベルは追跡されません。クラスタ オートスケーラーによって作成されたノードには、ノードプールの作成時に --node-labels で指定されたラベルが割り当てられます。
ノードプールのサイズを変更する
AWSNodePool には minNodeCount
フィールドと maxNodeCount
フィールドがあります。これらのフィールドで、プール内のワーカーノードの最小数と最大数を宣言します。この値は、AWSNodePool の作成前または作成後に編集できます。
始める前に
ユーザー クラスタの作成の手順に沿ってクラスタをプロビジョニングします。クラスタを作成する YAML ファイル(cluster-0.yaml
など)を用意します。
ノードプールの自動スケーリングの有効化
anthos-aws
ディレクトリからanthos-gke
を使用して、コンテキストを管理サービスに切り替えます。cd anthos-aws anthos-gke aws management get-credentials
クラスタ オートスケーラーを有効にするには、AWSNodePool のマニフェストを編集します。
cluster-0.yaml
ファイルを編集して AWSNodePool セクションを見つけます。spec.minNodeCount
とspec.maxNodeCount
の値を変更します。次の例では、このノードプールの最小サイズを
3
ノードで維持し、クラスタ オートスケーラーで10
ノードまで増やせるようにします。apiVersion: multicloud.cluster.gke.io/v1 kind: AWSNodePool metadata: name: cluster-0-pool-0 spec: clusterName: cluster-0 version: 1.25.5-gke.2100 minNodeCount: 3 maxNodeCount: 10 ...
次に、YAML を適用してノードプールのサイズを変更します。
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f cluster-0.yaml
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.25.5-gke.2100
新しい AWSNodePool を手動で作成する
新しい AWSNodePool を作成してクラスタをスケーリングすることもできます。新しい AWSNodePool を作成するときに、インスタンス サイズをスケールアップまたはスケールダウンできます。
kubectl get
を使用して、既存の AWSNodePool の構成マニフェストを取得します。env HTTPS_PROXY=http://localhost:8118 \ kubectl get awsnodepool cluster-0-pool-0 -o yaml > new_nodepool.yaml
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.25.5-gke.2100 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
マニフェストを管理クラスタに適用して、新しい AWSNodePool を作成します。
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f new_nodepool.yaml
次のステップ
Ingress でバックアップした Service をデプロイする。
その他のオプションを確認するには、AWSNodePool のリファレンス ドキュメントをご覧ください。