Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 36
Name: 1
Health: Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1
longUnregistered=0 cloudProviderTarget=1 (minSize=1, maxSize=3))
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
ScaleUp: NoActivity (ready=1 cloudProviderTarget=1)
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
ScaleDown: NoCandidates (candidates=0)
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
● 各種タイムスタンプ
○ LastProbeTime: 直近でチェックした時間
○ LastTransitionTime: 直近で Node 数が変わった時間
Slide 37
Slide 37 text
Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 37
Name: 1
Health: Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1
longUnregistered=0 cloudProviderTarget=1 (minSize=1, maxSize=3))
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
ScaleUp: NoActivity (ready=1 cloudProviderTarget=1)
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
ScaleDown: NoCandidates (candidates=0)
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
● ScaleUp の状況
InProgress スケールアウト中
Backoff スケールアウト失敗して 5 分休眠 (Exponential Backoff)
NoActivity 何もしていない
Slide 38
Slide 38 text
Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 38
Name: 1
Health: Healthy (ready=1 unready=0 notStarted=0 longNotStarted=0 registered=1
longUnregistered=0 cloudProviderTarget=1 (minSize=1, maxSize=3))
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
ScaleUp: NoActivity (ready=1 cloudProviderTarget=1)
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
ScaleDown: NoCandidates (candidates=0)
LastProbeTime: 2019-12-09 09:35:57.65997218 +0000 UTC ...
LastTransitionTime: 2019-12-06 10:03:17.846305964 +0000 UTC ...
CandidatesPresent スケールイン候補のノードがいる
NoCandidates スケールイン候補のノードがいない
● ScaleDown の状況
○ 右に候補ノード数が表示
Slide 39
Slide 39 text
Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 39
☺ Cluster Autoscaler Basic
☺ Architecture
☺ Status of Autoscaler
☺ Execution Cycle
Slide 40
Slide 40 text
Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 40
クラスタや Pod の情報を取得
スケジューリングできない (Unschedulable) Pod を取得
スケールアウトを実行
必要のない (Unneeded) Node を更新
cluster-autoscaler-status に情報を出力
スケールインを実行
10 秒
待機
Slide 41
Slide 41 text
Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 41
スケジューリングできない (Unschedulable) Pod を取得
スケールアウトを実行
Slide 42
Slide 42 text
Expansion Option の生成 -Pending Pod の検出-
42
Pod A
Pod B
Pod C
Pod D
Pod E
Pod List
Running
Running
Pending
Pending
Pending
Slide 43
Slide 43 text
Expansion Option の生成 -Scheduling Simulation-
43
Pod A
Pod B
Pod List
Pod C
Pod D
Pod E
NodeGroup 1
1 core / 10GiB RAM
NodeGroup 2
4 core / 10GiB RAM
NodeGroup 3
2 core / 10GiB RAM
Taints A
各 NodePool のスペック
Slide 44
Slide 44 text
Expansion Option の生成 -Scheduling Simulation-
44
Pod A
Pod B
Pod List
Pod C
Pod D
Pod E
NodeGroup 1
1 core / 10GiB RAM
NodeGroup 2
4 core / 10GiB RAM
NodeGroup 3
2 core / 10GiB RAM
Taints A
各 NodePool のスペック
Slide 45
Slide 45 text
Expansion Option の生成 -Scheduling Simulation-
45
Pod A
Pod B
Pod List
Pod C
Pod D
Pod E
NodeGroup 1
1 core / 10GiB RAM
NodeGroup 2
4 core / 10GiB RAM
NodeGroup 3
2 core / 10GiB RAM
Taints A
各 NodePool のスペック
Slide 46
Slide 46 text
Expansion Option の生成 -Scheduling Simulation-
46
Pod A
Pod B
Pod List
Pod C
Pod D
Pod E
NodeGroup 1
1 core / 10GiB RAM
NodeGroup 2
4 core / 10GiB RAM
NodeGroup 3
2 core / 10GiB RAM
Taints A
各 NodePool のスペック
Slide 47
Slide 47 text
Expansion Option の生成 -Construct Option-
47
Pod A
Pod B
Pod List
Pod C
Pod D
Pod E
NodeGroup 1
1 core / 10GiB RAM
Expansion Option
NodeGroup 2
4 core / 10GiB RAM
NodeGroup 3
2 core / 10GiB RAM
Taints A
C/E スケジュール可
2 台必要
C/D/E スケジュール可
1 台必要
E スケジュール可
1 台必要
各 NodePool のスペック
Slide 48
Slide 48 text
Expander Strategy による Option の選択
48
C/E スケジュール可
2 台必要
C/D/E スケジュール可
1 台必要
E スケジュール可
1 台必要
Selection
C/E スケジュール可
2 台必要
Strategy: random
Option に含まれなかった Pod D は
次のイテレーションでスケジュール
補足 (スケールアウト)
50
● Pending Pod と書いたが厳密には Unschedulable Pod
○ 設定によっては Pending 内で Pod Priority の低いものは除外される
● Pending Pod が全て新しい (2s 以内) とループを見送る
○ 次のイテレーションでまた増えているかもしれない
○ スケールアウトの頻度を少なくして効率化
● 起動途中のノードも考慮
○ 最大ノード数を超えないようにする
○ (Current Nodes + New Nodes + Upcoming Nodes) <= max
● 自動ノードプロビジョニングもできる (要実装)
○ --node-autoprovisioning-enabled
Slide 51
Slide 51 text
Kubernetes Cluster Autoscaler Deep Dive @Kubernetes Meetup Tokyo #30 51
必要のない (Unneeded) Node を更新
スケールインを実行
Slide 52
Slide 52 text
Unneeded Node の抽出 -Utilization Check-
52
Node A
( 1000m )
Pod
300m
Pod
200m
Pod
100m
Node B
( 1000m )
Pod
200m
Node C
( 1000m )
Pod
900m
Utilization
All Requests
Allocatable
Slide 53
Slide 53 text
Unneeded Node の抽出 -Utilization Check-
53
Node A
( 1000m )
Pod
300m
Pod
200m
Pod
100m
Node B
( 1000m )
Pod
200m
Node C
( 1000m )
Pod
900m
90%
20%
60%
All Requests
Allocatable
Threshold (50%)
Utilization
Slide 54
Slide 54 text
Unneeded Node の抽出 -Rescheduling Simulation-
54
Node A
( 1000m )
Pod
300m
Pod
200m
Pod
100m
Node B
( 1000m )
Pod
200m
Node C
( 1000m )
Pod
900m
90%
20%
60%
Threshold (50%)
Utilization
? ?
Slide 55
Slide 55 text
Unneeded Node の抽出 -Rescheduling Simulation-
55
Node A
( 1000m )
Pod
300m
Pod
200m
Pod
100m
Node B
( 1000m )
Pod
200m
Node C
( 1000m )
Pod
900m
90%
20%
60%
Threshold (50%)
Utilization
OK NG
Slide 56
Slide 56 text
Unneeded Node の抽出 -Rescheduling Simulation-
56
Node A
( 1000m )
Pod
300m
Pod
200m
Pod
100m
Node B
( 1000m )
Pod
200m
Node C
( 1000m )
Pod
900m
90%
20%
60%
Threshold (50%)
Utilization
Unneeded
DeletionCandidateOfClusterAutoscaler=
Slide 57
Slide 57 text
● 先程 Node に付けた Taints の値 (時間) に着目する
Unneeded Node の削除
57
Node B
Node P
Node Y
2020-04-23 13:00
2020-04-23 13:04
2020-04-23 13:09
Current Time
2020-04-23 13:10
Slide 58
Slide 58 text
● 先程 Node に付けた Taints の値 (時間) に着目する
Unneeded Node の削除
58
Node B
Node P
Node Y
2020-04-23 13:00
2020-04-23 13:04
2020-04-23 13:09
Current Time
2020-04-23 13:11
10 分以上前に
付与された Taints
Slide 59
Slide 59 text
● 先程 Node に付けた Taints の値 (時間) に着目する
Unneeded Node の削除
59
Node B
Node P
Node Y
2020-04-23 13:00
2020-04-23 13:04
2020-04-23 13:09
Current Time
2020-04-23 13:11
Taints 付与 & Drain & 削除
ToBeDeletedByClusterAutoscaler=