このドキュメントでは、Kubernetes クラスターのワークロードの要件を満たすために、Kubernetes クラスターのノードを自動スケーリングする方法について説明します。 Alibaba Cloud Container Service for Kubernetes (ACK) では、クラスター自動スケーラープログラムを使用して、Kubernetes クラスターのノードを自動スケーリングする機能を提供します。

背景情報

クラスター自動スケーラーを設定して、一般インスタンス、GPU、プリエンプティブルインスタンスタイプなど、Kubernetes クラスターにさまざまな ECS インスタンスタイプを追加できます。 複数のゾーン、インスタンスタイプ、および自動スケーリングモードを設定できます。

クラスター自動スケーラーの概要

クラスター自動スケーラーは、Kubernetes クラスター内のポッドのノードでのリソースの使用に基づいて、Kubernetes クラスターのサイズを変更します。 リソースの使用状況は、ポッドのリソース要求に基づいて計算されます。

ポッドが、関連付けられたノードが提供できるリソースよりも多くのリソースを要求した場合、そのポッドは保留中 (pending) のステータスになります。 その時点で、自動スケーラーはクラスターのサイズに対する変更を計算します。 自動スケーリンググループに設定したリソースのタイプとしきい値に対して、要求されたリソースを提供するために必要なノードの数が計算されます。

たとえば、自動スケーリンググループ内のノード数に低しきい値を設定すると、クラスター自動スケーラーはノードを削除し、ポッドが要求できるリソースの量を減らします。

  • デフォルトでは、アカウントはすべてのクラスターで最大 30 個の従量課金 ECS インスタンスを使用でき、1 つの VPC のルートテーブルには、最大 50 個のエントリを含めることができます。 1 つの VPC のルートテーブルで使用可能な ECS インスタンス、またはエントリの数を増やすには、チケットを起票し、サポートセンターへお問い合わせください。
  • シングルタイプの ECS インスタンスの場合、一度に許可される 1 つのタイプでの ECS インスタンスの数は頻繁に変化します。 したがって、1 つの ECS で複数の ECS インスタンスタイプを設定することを推奨します。
  • 高速スケーリングモードを設定したノードがシャットダウンされ、再利用されると、NotReady ステータスになります。 ノードがクラスター自動スケーラーによって再利用されると、ノードは Ready ステータスになります。
  • 高速スケーリングモードを設定したノードがシャットダウンされ、再利用されると、ノードに接続されているディスクのみが課金されます (ただし、ノードがローカルディスク "ecs.d1ne.2xlarge" などを使用する場合を除きます)。

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

  1. Container Service コンソール にログインします。
  2. Container Service-Kubernetes の左側のナビゲーションウインドウで、 [クラスター] > [クラスター] を選択します。
  3. 対象となるクラスターを見つけます。 次に、[操作 ] 列で、 [詳細] > [自動スケーリング] を選択します。

自動スケーリングサービスとクラスターに必要な権限を付与する

  • 自動スケーリングサービスの有効化
    1. 表示されたダイアログボックスで、[ESS] をクリックします。
    2. [今すぐ有効化] をクリックします。
    3. 条件を読んで確認し、[自動スケーリングサービス契約に同意します] チェックボックスをオンにして、 [今すぐ有効化] をクリックします。
    4. [コンソール] をクリックします。
    5. [権限設定] をクリックします。
    6. [承認することに同意する] をクリックして、ESS にクラウドリソースへのアクセス権限を付与します。

    結果の検証

    ページが自動的に Auto Scaling コンソールにリダイレクトされる場合、有効化に成功しました。

  • ESS 権限付与ポリシーをクラスターに追加する
    1. 次のダイアログボックスで、Worker RAM ロール (KubernetesWorkerRole[xxx]) をクリックします。
      この操作を実行する前に、プライマリアカウントを使用してコンソールにログインする必要があります。
    2. 対象となる権限付与ポリシーの右側で、[権限表示] をクリックします。
    3. ページの右上隅で、 [権限付与ポリシーの変更] をクリックします。
    4. [ポリシー ドキュメント] エリアの [操作] フィールドで、以下のポリシーを追加します。
      
      "ess:Describe*", 
      "ess:CreateScalingRule", 
      "ess:ModifyScalingGroup", 
      "ess:RemoveInstances", 
      "ess:ExecuteScalingRule", 
      "ess:ModifyScalingRule", 
      "ess:DeleteScalingRule", 
      "ecs:DescribeInstanceTypes",
      "ess:DetachInstances"
      これらのポリシーを追加する前に、[操作] フィールドの最後の行の末尾にコンマ (,) を追加する必要があります。
    5. [ポリシードキュメントの編集] をクリックします。

クラスター自動スケーリングパラメーターを設定する

  1. [自動スケーリング] ページで、次のパラメーターを設定します。
    設定項目 説明
    クラスター 対象となるクラスター名
    スケールインしきい値 ノードリソースの合計量に対して、要求されたノードリソースの量がこのしきい値を下回ると、クラスターノード内で自動的にスケーリングされます。
    Kubernetes クラスターの自動スケーリング機能を有効にすると、クラスターノードをスケールアウトするタイミングが自動的に決定されます。 したがって、クラスターのノードでスケーリングするタイミングを決定するには、システムが使用するしきい値を設定するだけで済みます。
    スケールインの遅延 スケールインしきい値に達した後、システムがクラスター内で自動的にスケーリングするのを待機する必要がある場合の期間。 デフォルト値は 10 分です。
    クールダウン クラスターノード数が増減した後、システムがクラスターを自動的にスケールインまたはスケールアウトしない期間 (分単位)。 デフォルト値は 10 分です。
  2. 自動スケーリングする対象となるリソースタイプ (CPU または GPU を指定可) の右側で、[作成] をクリックします。
    [スケーリンググループ設定] ページで、以下のパラメーターを設定し、スケーリンググループを作成します。
    設定項目 説明
    リージョン スケーリンググループがデプロイされるリージョンです。 スケーリンググループと、そのグループが配置されているクラスターが同じリージョンを共有していることを確認する必要があります。 リージョンは変更できません。
    ゾーン スケーリンググループが作成されるゾーンです。
    VPC スケーリンググループが作成されるネットワークです。 スケーリンググループとそのグループが配置されているクラスターが同じリージョンにあることを確認する必要があります。
    Worker ノードを設定します。
    設定項目 説明
    インスタンスタイプ スケーリンググループ内のインスタンスのタイプを設定します。
    システムディスク スケーリンググループのシステムディスクを設定します。
    データディスクのアタッチ スケーリンググループを作成する際に、データディスクをマウントします。 デフォルトでは、データディスクはマウントされていません。
    インスタンス数 スケーリンググループ内のインスタンス数を設定します。
    • この数値には、クラスター内の既存のインスタンスは含まれません。
    • デフォルトでは、このパラメーター値は 0 です。このパラメーターが 0 を超えると、クラスターは、スケーリンググループとスケーリンググループが配置されている Kubernetes クラスターにインスタンスを追加します。
    キーペア 自動スケーリングによって追加されたノードへのログインに使用するキーペアを設定します。 Elastic Compute Service (ECS) コンソールで新しいキーペアを作成できます。
    キーペアでのログインのみがサポートされています。
    RDS ホワイトリスト 自動スケーリングによって追加されたノードがアクセスできる Relational Database Service (RDS) インスタンスを設定します。
  3. [OK] をクリックします。

結果の検証

  • CPU のスケーリンググループが [自動スケーリング] ページに表示されることを直接確認できます。
  • 作成された自動スケーリングコンポーネントを確認するには、次の手順に従います。
    1. 左側のナビゲーションウィンドウで、[アプリケーション] > [デプロイメント] を選択します。
    2. 対象となるクラスターおよび kube-system 名前空間を選択します。"cluster-autoscaler" という名称のコンポーネントが作成されたことを確認できます。

トラブルシューティング

  • クラスター自動スケーラーがより多くのリソースを要求したポッドにノードを追加できない場合は、次のチェックを実行できます。
    • 自動スケーリンググループに設定した ECS インスタンスによって提供されるリソースの量が、ポッドによって要求されるリソースの量より多いことを確認します。
    • 上記の手順に従って、必要な権限が付与されていることを確認します。 各ターゲットクラスターに必要な権限を付与する必要があります。
    • ターゲット Kubernetes クラスターがインターネットに接続されていることを確認します。 クラスター自動スケーラーは、Alibaba Cloud から API アクションを呼び出すため、クラスターノードにインターネット経由でアクセスできることを確認する必要があります。
  • クラスター自動スケーラーが、自動スケーリンググループからノードを削除できない場合は、次のチェックを実行できます。
    • すべてのノードのポッドのリソース要求しきい値が、クラスター内のスケーリングに使用されたしきい値よりも大きくなっていないことを確認します。
    • kube-system 名前空間に属するポッドを実行しているノードがないことを確認します。
    • 制約のあるスケジューリングポリシーが設定されているポッドを実行しているノードがないことを確認します。 これは、制約のあるスケジューリングポリシーによってポッドが固定ノードに制限される可能性があるためです。
    • 許可された最小値に達した PodDisruptionBudget オブジェクトを含むポッドがないことを確認します。 詳細については、『How do Disruption Budgets work』をご参照ください。 詳細については、『How do Disruption Budgets work』をご参照ください。

    詳細は、『Cluster autoscaler』をご参照ください。