Kubernetes Cluster Autoscalerの使用
Kubernetes Cluster Autoscalerを使用して、Kubernetes Engine (OKE)を使用して作成したクラスタ上の管理対象ノード・プールを自動的にサイズ変更する方法をご紹介します。
Kubernetes Cluster Autoscalerは仮想ノード・プールでは使用できません。
Kubernetes Cluster Autoscalerを使用すると、アプリケーション・ワークロードの要求に基づいてクラスタの管理対象ノード・プールのサイズを自動的に変更できます。クラスタのノード・プールのサイズを自動的に変更することで、アプリケーションの可用性を確保し、コストを最適化できます。
Kubernetesクラスタ・オートスケーリング:
- 不十分なリソース制約のためにクラスタでポッドをスケジュールできない場合に、ワーカー・ノードをノード・プールに追加します。
- ノードが長時間使用されておらず、ポッドを他の既存のノードに配置できる場合に、ワーカー・ノードをノード・プールから削除します。
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分に設定します。通常、新しいワーカー・ノードがプロビジョニングされ、これよりも大幅に短い時間で「準備完了」状態に移行します。ただし、多数のノードが同時にノード・プールに追加されると、プロビジョニングに時間がかかる場合があります。コンソールのワーカー・ノードの横に、初期化に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は、構成パラメータを使用してクラスタのノード・プールのサイズを変更します。
Kubernetes Engineによって作成されたクラスタの管理に使用できる構成パラメータとその指定方法は、Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用しているか、クラスタ・アドオンとして使用しているかによって異なります。
-
Kubernetes Cluster Autoscalerのスタンドアロン・プログラムとして使用
Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用している場合は、構成ファイルで構成パラメータを指定します。
Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用する場合、次の構成パラメータを使用してKubernetes Engineによって作成されたクラスタを管理することはできません:
--node-group-auto-discovery
: サポートされていません(クラウド・プロバイダ固有)。--node-autoprovisioning-enabled=true
: サポートされていません。--gpu-total
: サポートされていません(クラウド・プロバイダ固有)。--expander=price
: サポートされていません(クラウド・プロバイダ固有)。
前述のパラメータを除き、Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用する場合は、任意の構成パラメータを使用できます。
Kubernetes Cluster Autoscaler構成パラメータの完全なリストは、GitHubのCluster Autoscaler FAQのWhat are the parameters to CA?を参照してください。
-
Kubernetes Cluster Autoscalerのクラスタ・アドオンとして使用
Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用している場合は、構成ファイル(CLIまたはAPIを使用する場合)またはコンソールで構成パラメータを指定します。
Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用する場合、次の構成パラメータを使用してKubernetes Engineによって作成されたクラスタを管理することはできません:
--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 FAQのWhat types of pods can prevent CA from removing a node?を参照してください。
- TerraformとKubernetes Cluster Autoscalerの両方を使用してノード・プールを管理している場合、Terraformは、Kubernetes Cluster Autoscalerによって行われたノード・プールのサイズに対する変更を元に戻す可能性があることに注意してください。このような動作を回避するには、Terraform
ignore_changes
機能を使用します。この機能は、Terraformが単一オブジェクトを別のプロセスとともに管理する責任を担う状況に特化しています。たとえば、将来変更される可能性のあるデータを参照してリソースが作成されたが、その作成後にそれらの潜在的なデータ変更がリソースに影響を与えないようにする場合です。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を使用してKubernetes Engineで作成したクラスタを管理するには、クラスタで次のように特定のバージョンのKubernetesが実行されている必要があります:
- Kubernetes Cluster Autoscalerをスタンドアロン・プログラムとして使用する場合、クラスタはKubernetesバージョン1.17以降を実行している必要があります。
- Kubernetes Cluster Autoscalerをクラスタ・アドオンとして使用する場合、クラスタでKubernetesバージョン1.25以降が実行されている必要があります。
- Kubernetes Cluster Autoscalerは、管理対象ノード・プールで使用できますが、仮想ノード・プールでは使用できません。