前回に引き続き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を用いた方が圧倒的に良さそうですね。
コメントを残す