[AWS] cluster-autoscalerを使ってnodegroupのオートスケーリングを実現する

前回に引き続きEKSの記事を書いていきます。
今回はEKSのノードグループのスケーリングについてです。

EKSもECSと同様にAutoScalingGroupでEC2インスタンスが管理されるのですが、負荷やPod数の増減に応じてノード数を変更したい時の設定方法が異なるので記事にしました。

もちろんEKSのメトリクスを参考にAutoScalingGroupのスケーリングポリシーを設定して増減することもできなくはないのですが、今回の記事ではcluster-autoscalerを用います。

cluster-autoscalerとは


cluster-autoscalerとは自動的に適切なノード数に調整してくれるコンポーネントです。

全てのPodが起動できるようにノードを管理し、不要なノードがあればスケールインも行ってくれます。
k8sのバージョン1.8以降から対応しています。

AWSに限らず複数のパブリッククラウドをサポートしており、cluster-autoscalerを導入していれば自動的に適切なスケールが行われるためリソース管理が容易になるというメリットがあります。

使い方やマニフェストはGitHub上で公開されています。

◆cluster-autoscaler
https://github.com/kubernetes/autoscaler

◆AWSドキュメント
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/cluster-autoscaler.html

導入手順


ノードグループを作成しているマニフェストファイルでautoScalerのIAM権限を定義します。
また、cluster-autoscalerで増減するノード数の最低値、上限値も記載してください。

この設定が追加されている状態のノードグループを事前に用意しておきます。

# GitHubからマニフェストファイルをダウンロード
$ wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml

続いてGitHub上で公開されているcluster-autoscaler用のマニフェストファイルを上記コマンドでダウンロードします。


ダウンロードしたマニフェストファイルを開きます。
147行目を必要に応じてEKSクラスターのバージョンに合わせて書き直します。
このバージョンはパッチバージョンまで合致させる必要はありませんが、動作を保証するためにマイナーバージョンまでは一致させておく必要があります。
163行目には<YOUR CLUSTER NAME>と書かれた項目に対象のEKSクラスター名を記入します。


147行目で指定できるバージョンについてはリリースページを参考に対応するイメージのURIへ修正してください。

# クラスターにデプロイする
$ kubectl apply -f cluster-autoscaler-autodiscover.yaml

マニフェストファイルの修正が完了したらApplyを実行してデプロイします。


kube-systemの中にcluster-autoscalerが起動したことを確認してください。
これで導入完了です。

動作について


cluster-autoscalerはあくまでもk8s上で動作するコンポーネントのひとつです。
そのため、AWSコンソールからノードグループを管理するAutoScalingGroupを確認してもスケーリングポリシーは定義されていません。


しかしPodの増減によってノードの過不足が発生すると、自動的にスケールが行われることが確認できます。

# cluster-autoscalerを一時的に停止する
$ kubectl scale deployment cluster-autoscaler -n kube-system --replicas 0

なお、cluster-autoscalerを停止したい場合はcluster-autoscalerを削除するか、Podを0台にすることで一時的に停止させることが可能です。
マニフェストファイルを更新するか、コマンドで一時的にreplicasを0にしてしまうのが良いかもしれません。

おわりに

cluster-autoscalerを使うことでEKSのノード数を自動的に適切なサイズへ変更してくれるようになります。

AWSの機能であるCloudWatchメトリクスとAutoScalingGroupのスケーリングポリシーを使ってノード数を調整することもできますが、無駄なPod配分の検知には工夫が必要になるのでcluster-autoscalerを用いた方が圧倒的に良さそうですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)