TL;DR
- スケールアップはリソース不足のPodが作成されたタイミング
- スケールダウンは(1)ノードの要求リソースが50%以下,(2)全てのPodが他のノードに移動可能,(3)ノード削除不可のアノテーションがされていない,この状態が10分間続いた場合に行われる.
- 基本的に1ノードずつスケールダウンされるが,空のノードの場合は10ノードまで一度に削除される
参考にした資料
資料内の用語について
- スケールアップ(scale-up):ノードプールのサイズアップ(ノード追加)
- スケールダウン(scale-down):ノードプールのサイズダウン(ノード削除)
通常はスケールアップといえばノードの性能自体を上げることをいうが(スケールダウンはその逆),上の資料ではノードの数を増やすことを意味している.ノード自体の増減は一般にスケールイン・アウトというのでちょっと紛らわしい.
スケールアップの条件
Kubernetesのスケールアップは単純で以下の条件を満たすと行われる.
- Kubernetesでは10秒ごと(--scan-intervalで指定)にUnschedulable状態になっているPodをチェックし,そのPodがあればノードが追加される
ちなみに,ノードが追加されるとPodのエラー内容が「リソース不足」から「ノードの状態がReadyではない」に変わって,その後ノードの準備が出来たらスケジューリングされる.
スケールダウンの条件
スケールダウンの条件は少し複雑になっている.
- CPU・メモリのリクエストの合計がノードの容量の50%以下になっている(しきい値は変更可能)
- ノードの内の全てのPod(daemonsetなどのPodを除く)が他のノードに移動可能な場合.Podの設定によってはリソースが空いていても他のノードに移動できない場合がある.
- ノードにスケールダウン不可のアノテーションがされていない場合.
以上の条件に当てはまるかをスケールアップのときと同じで10秒毎にチェックされるが,スケールダウンの場合にはこの状態が10分続いた場合にのみノードが削除される.(この時間についてもフラグなどで変更可能)
スケールダウンは基本的には1ノードずつ行われる.これは特定のノードを削除した後にも他のノードが以上の条件を満たしているか保証されていないためである.ただし,最初のノードが削除されてからまた10分測り直しというわけではなく,連続で削除される可能性はある.
※ただ例外的に**「空のノード」は一度に10ノードまで**削除することが出来る.
スケールダウン時のPodについて
スケールダウンされた場合,ノードにTaintを付与して再度スケジューリング不可の状態にしてPodの削除を行う.これでKubernetesが自動的に他のノードでPodの再作成を行う.