Kubernetes Cluster Autoscalerの使用

Kubernetes Cluster Autoscalerを使用して、Container Engine for Kubernetes (OKE)を使用して作成したクラスタ上の管理対象ノード・プールのサイズを自動的に変更する方法を確認します。

ノート

Kubernetes Cluster Autoscalerを仮想ノード・プールとともに使用することはできません。

Kubernetes Cluster Autoscalerを使用すると、アプリケーション・ワークロードの要求に基づいてクラスタの管理対象ノード・プールのサイズを自動的に変更できます。クラスタのノード・プールのサイズを自動的に変更することで、アプリケーションの可用性を確保し、コストを最適化できます。

Kubernetes Cluster Autoscaler:

  • 不十分なリソース制約のためにクラスタでポッドをスケジュールできない場合に、ワーカー・ノードをノード・プールに追加します。
  • ノードが長時間使用されておらず、ポッドを他の既存のノードに配置できる場合に、ワーカー・ノードをノード・プールから削除します。

Kubernetes Cluster Autoscalerは、ノード・プール内のノードのリソース使用率ではなく、リソース・リクエストに基づいてノード・プールのサイズを自動的に増減します。

Kubernetes Cluster Autoscalerは、ノード・プール単位で動作します。構成ファイルを使用して、拡張および縮小のターゲットとするノード・プール、各ノード・プールの最小サイズと最大サイズ、および自動スケーリングの実行方法を指定します。構成ファイルで参照されていないノード・プールは、Kubernetes Cluster Autoscalerによって管理されません。

Kubernetes Cluster Autoscalerがアプリケーション・ワークロードの要求に基づいてクラスタのノード・プールのサイズを自動的に変更できるようにするには、ポッド仕様に常にリソース・リクエスト制限(resources:の下にrequests:)を含めます。

Kubernetes Cluster Autoscalerは、次の2つの方法でKubernetesクラスタにデプロイできます:

Kubernetes Cluster Autoscalerの詳細は、GitHubのCluster AutoscalerおよびFrequently Asked Questionsを参照してください。

本番環境でKubernetes Cluster Autoscalerを使用する場合の推奨事項

次の推奨事項を検討してください:

  • Kubernetes Cluster Autoscalerによって管理されてないノード・プールが常に1つ以上クラスタにあります。このノード・プールは、クリティカルなクラスタ・アドオンを実行するために必要です。また、Kubernetes Cluster Autoscalerによって管理されないノード・プールを手動でスケーリングする必要があります。
  • 構成ファイルで、Kubernetes Cluster Autoscalerデプロイメントの複数のレプリカを常に定義します。レプリカが1つしかなく、それを除去して再スケジュールできない場合、Kubernetes Cluster Autoscalerはそれ以上ワーカー・ノードを作成できません。
  • 構成ファイルで、max-node-provision-timeを25分に設定します。通常、新しいワーカー・ノードはプロビジョニングされ、これよりもかなり短い時間で「Ready」条件に移行します。ただし、多数のノードが同時にノード・プールに追加されると、プロビジョニングに時間がかかる場合があります。コンソールのワーカー・ノードの横に、初期化に20分超かかることを示す警告が表示されることに注意してください。max-node-provision-timeに指定した時間内にワーカー・ノードが準備完了状態に移行すると考えられる場合、この警告は無視できます。
  • 構成ファイルで、ノード・プールで許可されるノードの最大数を指定します。指定するノードの最大数が、ノード・プールに定義されているワーカー・ノード・シェイプのテナンシ制限を超えないようにしてください。Kubernetes Cluster Autoscalerでは、テナンシ制限を超えるノードは作成されません。テナンシ制限より大きい数を指定すると、Kubernetes Cluster Autoscalerは定期的に追加のノードを作成しようとしますが、テナンシ制限が増加するまで作成しません。
  • Kubernetes Cluster Autoscalerで管理するクラスタを定義する場合は、ノード・プールごとに1つの可用性ドメインを指定して複数のノード・プールを作成することをお薦めします。
  • Kubernetes Cluster Autoscalerがワーカー・ノードを削除するとき、または使用率の低いワーカー・ノードを削除する前にポッドを別のワーカー・ノードに移動するときに発生する可能性のある中断を許容するように、アプリケーションを常に設計します。たとえば、ポッド中断予算を利用するアプリケーションを設計します(KubernetesドキュメントのSpecifying a Disruption Budget for Your Applicationを参照)。
  • Kubernetes Cluster Autoscalerによって管理されるノード・プールは手動で変更しないでください。たとえば、kubectlまたはコンソール(あるいはOracle Cloud Infrastructure CLIまたはAPI)を使用してノードを追加または削除しないでください。Kubernetes Cluster Autoscalerは、そのような変更をオーバーライドしたり、その動作を変更する可能性があります。たとえば、Kubernetes Cluster Autoscalerによって管理されているノード・プール内のすべてのノードを削除する場合は、常にKubernetes Cluster Autoscalerを使用してノード・プールをゼロにスケーリングします。

サポートされているKubernetes Cluster Autoscalerパラメータ

構成パラメータを使用して、Kubernetes Cluster Autoscalerによるクラスタのノード・プールのサイズ変更方法を制御します。

Container Engine for Kubernetesによって作成されたクラスタの管理に使用できる構成パラメータおよびそれらの指定方法は、Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用しているか、クラスタ・アドオンとして使用しているかによって異なります。

  • Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用

    Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用している場合は、構成ファイルに構成パラメータを指定します。

    Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用する場合、次の構成パラメータを使用してContainer Engine for Kubernetesによって作成されたクラスタを管理することはできません:

    • --node-group-auto-discovery : サポートされていません(クラウド・プロバイダ固有)。
    • --node-autoprovisioning-enabled=true : サポートされていません。
    • --gpu-total : サポートされていません(クラウド・プロバイダ固有)。
    • --expander=price : サポートされていません(クラウド・プロバイダ固有)。

    前述のパラメータを除き、Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用する場合は、構成パラメータのいずれかを使用できます。

    Kubernetes Cluster Autoscaler構成パラメータの完全なリストは、GitHubのCluster Autoscaler FAQWhat are the parameters to CA?を参照してください。

  • Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用

    Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用している場合は、構成ファイル(CLIまたはAPIを使用している場合)、またはコンソールで構成パラメータを指定します。

    Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用する場合、次の構成パラメータを使用してContainer Engine for Kubernetesによって作成されたクラスタを管理することはできません:

    • --node-group-auto-discovery : サポートされていません(クラウド・プロバイダ固有)。
    • --node-autoprovisioning-enabled=true : サポートされていません。
    • --gpu-total : サポートされていません(クラウド・プロバイダ固有)。
    • --expander=price : サポートされていません(クラウド・プロバイダ固有)。

    Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用する場合、他の多くのKubernetes Cluster Autoscaler構成パラメータもサポートされないことに注意してください。

    Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用する際にサポートされる構成パラメータと、それらを指定するときに使用する名前のリストは、Cluster Autoscalerアドオン構成引数を参照してください。

Kubernetes Cluster Autoscalerに関するノート

次の点に注意してください:

  • Kubernetes Cluster Autoscalerは、既存のクラスタの既存のノード・プールに対してノードを追加および削除します。具体的には、Kubernetes Cluster Autoscalerは次のことを行います:

    • 追加のクラスタを作成しません。
    • 追加のノード・プールを作成しません。
    • 追加ポッドを作成しません。ポッドの追加は、Horizontal Pod Autoscalerでサポートされています(Kubernetes Horizontal Pod Autoscalerの使用を参照)。
    • コンテナのCPUおよびメモリーのリクエストと制限を調整しません。制限の調整は、Vertical Pod Autoscalerでサポートされています(Kubernetes Vertical Pod Autoscalerの使用を参照)。
  • ノード・プールからワーカー・ノードを削除する場合、Kubernetes Cluster Autoscalerはポッド・スケジューリングおよびエビクション・ルールを考慮します。これらのルールにより、Kubernetes Cluster Autoscalerがワーカー・ノードを削除できないようにすることができます。

    たとえば、デフォルトでは、Kubernetes Cluster Autoscalerは、DaemonSetポッドまたはミラー・ポッドを除き、kube-systemポッド(corednsポッドなど)を実行しているノードを削除しません。この動作は、構成パラメータ(スタンドアロン・プログラムとしてデプロイする場合はskip-nodes-with-system-pods、クラスタ・アドオンとしてデプロイする場合はskipNodesWithSystemPods)を使用して制御できます。デフォルトではtrueに設定されています。

    詳細は、GitHubのCluster Autoscaler FAQWhat types of pods can prevent CA from removing a node?を参照してください。

  • TerraformとKubernetes Cluster Autoscalerの両方を使用してノード・プールを管理している場合、Terraformは、Kubernetes Cluster Autoscalerによって行われたノード・プールのサイズに変更を戻す可能性があります。このような動作を回避するには、Terraformのignore_changes機能を使用します。この機能は、Terraformが1つのオブジェクトを別のプロセスで管理する責任を共有することを目的としています。たとえば、将来変更される可能性のあるデータを参照してリソースが作成された場合でも、それらの潜在的なデータ変更がリソースの作成後にリソースに影響を及ぼすことはありません。ignore_changesメタ引数は、関連付けられたリモート・オブジェクトへの更新を計画するときにTerraformが無視するリソース属性を指定します。詳細は、Terraformドキュメントのライフサイクル・メタ引数を参照してください。

    例:

    resource "node_pool_1" "example" {
      # ...
    
      lifecycle {
        ignore_changes = [
          node_config_details.size
        ]
      }
    }
  • クラスタを新しいバージョンのKubernetesにアップグレードする場合は、Kubernetes Cluster Autoscalerを手動でアップグレードして、クラスタの新しいバージョンのKubernetesと互換性を持たせる必要があります。Kubernetes Cluster Autoscalerは自動的にアップグレードされません。
  • Kubernetes Cluster Autoscalerを使用してContainer Engine for Kubernetesで作成したクラスタを管理するには、クラスタで次のように特定のバージョンのKubernetesが実行されている必要があります:
    • Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用する場合、クラスタはKubernetesバージョン1.17以降を実行している必要があります。
    • Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用する場合は、クラスタでKubernetesバージョン1.25以降が実行されている必要があります。
  • Kubernetes Cluster Autoscalerは管理対象ノード・プールで使用できますが、仮想ノード・プールでは使用できません。