2020/01/25 GKE/k8s でscale to zero
調べたいこと
- ノードプールが0個にまでスケールダウンするか
- どれくらいの早さでスケールダウン可能と検知されるか
- 初期サイズ0でノードプールが作れるか
- リージョナルクラスタのとき、特定のゾーンだけでも0個にまでスケールダウンするか(ゾーンごとに不揃いになれるか)
- kube-systemのpodがあってもちゃんとスケールダウンできるか
実験用クラスタ
- バージョン v1.15.7-gke.2
- リージョナルクラスタ
- プリエンプティブ
- default-pool: n1-standard-1, autoscale(0~1), inititial: 1
- pool-1: n1-standard-2, autoscale(0~3), initial: 0
スケールの最小が0であれば初期サイズ0でクラスタ構築できた
スケールアウト確認
適当なJobを、サイズ0状態のノードプールでしか起動できないrequestを付けてデプロイ
https://cloud.google.com/kubernetes-engine/docs/how-to/jobs#creating_a_job
apiVersion: batch/v1 kind: Job metadata: # Unique key of the Job instance name: example-job spec: template: metadata: name: example-job spec: containers: - name: pi image: perl command: ["perl"] args: ["-Mbignum=bpi", "-wle", "print bpi(2000)"] resources: requests: memory: "1Gi" # Do not restart containers after they exit restartPolicy: Never
gke-standard-cluster-1-pool-2-5b0626e0-k4m2 Ready <none> 73s v1.15.7-gke.2
スケールアウトした
スケールダウン確認
10分立つとノードが消えた
What are the parameters to CA? github.com
scale-down-unneeded-time
パラメータがデフォルトで 10 minutes
GKEだと、組み込みのオートスケーラの設定は変えられない模様
(組み込みのオートスケーラをOFFにして自分でオートスケーラをセットアップする技があるっぽい・・・?)
kube-system podが走っているノードのスケールダウン
I have a couple of nodes with low utilization, but they are not scaled down. Why? github.com
What types of pods can prevent CA from removing a node? github.com
kube-system配下のpodは、DaemonSetやkube-proxyを除いて、デフォルトでは移動されずオートスケールダウンを阻害する模様
How to set PDBs to enable CA to move kube-system pods? github.com
PDBを明示的に付与すると移動させることができる
現状
kubectl describe no | grep -e Name: -e kube-system
Name: gke-standard-cluster-1-default-pool-4c3839c2-jlcv kube-system fluentd-gcp-v3.1.1-rnnpt 100m (10%) 1 (106%) 200Mi (7%) 500Mi (18%) 53m kube-system kube-dns-5dbbd9cc58-flsk8 260m (27%) 0 (0%) 110Mi (4%) 170Mi (6%) 53m kube-system kube-dns-autoscaler-6b7f784798-ppj8j 20m (2%) 0 (0%) 10Mi (0%) 0 (0%) 53m kube-system kube-proxy-gke-standard-cluster-1-default-pool-4c3839c2-jlcv 100m (10%) 0 (0%) 0 (0%) 0 (0%) 53m kube-system prometheus-to-sd-6j4vr 1m (0%) 3m (0%) 20Mi (0%) 20Mi (0%) 53m Name: gke-standard-cluster-1-default-pool-da57e6c7-pwzb kube-system fluentd-gcp-v3.1.1-v5kqs 100m (10%) 1 (106%) 200Mi (7%) 500Mi (18%) 53m kube-system heapster-664fdc77f4-9xjls 63m (6%) 63m (6%) 215840Ki (7%) 215840Ki (7%) 53m kube-system kube-dns-5dbbd9cc58-4nfr2 260m (27%) 0 (0%) 110Mi (4%) 170Mi (6%) 53m kube-system kube-proxy-gke-standard-cluster-1-default-pool-da57e6c7-pwzb 100m (10%) 0 (0%) 0 (0%) 0 (0%) 53m kube-system l7-default-backend-84c9fcfbb-ffgxf 10m (1%) 10m (1%) 20Mi (0%) 20Mi (0%) 53m kube-system prometheus-to-sd-94nvv 1m (0%) 3m (0%) 20Mi (0%) 20Mi (0%) 53m Name: gke-standard-cluster-1-default-pool-ea34b5f9-l0xq kube-system event-exporter-v0.3.0-74bf544f8b-jdzp6 0 (0%) 0 (0%) 0 (0%) 0 (0%) 53m kube-system fluentd-gcp-scaler-dd489f778-chg6d 0 (0%) 0 (0%) 0 (0%) 0 (0%) 53m kube-system fluentd-gcp-v3.1.1-fxnhq 100m (10%) 1 (106%) 200Mi (7%) 500Mi (18%) 53m kube-system kube-proxy-gke-standard-cluster-1-default-pool-ea34b5f9-l0xq 100m (10%) 0 (0%) 0 (0%) 0 (0%) 53m kube-system metrics-server-v0.3.3-6d96fcc55-jcr2l 48m (5%) 143m (15%) 105Mi (3%) 355Mi (13%) 53m kube-system prometheus-to-sd-8mc5s 1m (0%) 3m (0%) 20Mi (0%) 20Mi (0%) 53m kube-system stackdriver-metadata-agent-cluster-level-59f55f888f-5lsws 40m (4%) 0 (0%) 50Mi (1%) 0 (0%) 53m
DaemonSet
kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE fluentd-gcp-v3.1.1 3 3 3 3 3 beta.kubernetes.io/fluentd-ds-ready=true,beta.kubernetes.io/os=linux 99m metadata-proxy-v0.1 0 0 0 0 0 beta.kubernetes.io/metadata-proxy-ready=true,beta.kubernetes.io/os=linux 99m nvidia-gpu-device-plugin 0 0 0 0 0 <none> 99m prometheus-to-sd 3 3 3 3 3 beta.kubernetes.io/os=linux 99m
kube-dns-5dbbd9cc58-flsk8
とkube-dns-autoscaler-6b7f784798-ppj8j
が移動できれば gke-standard-cluster-1-default-pool-4c3839c2-jlcv
がスケールダウンできる
apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: kube-dns-pdb namespace: kube-system spec: maxUnavailable: 1 selector: matchLabels: k8s-app: kube-dns
apiVersion: policy/v1beta1 kind: PodDisruptionBudget metadata: name: kube-dns-autoscaler-pdb namespace: kube-system spec: maxUnavailable: 1 selector: matchLabels: k8s-app: kube-dns-autoscaler
PDBを設定してみる
10分待ってもスケールダウンしない・・・
kubectl describe no gke-standard-cluster-1-default-pool-4c3839c2-jlcv
Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 481m (51%) 1003m (106%) memory 340Mi (12%) 690Mi (26%) ephemeral-storage 0 (0%) 0 (0%) attachable-volumes-gce-pd 0 0
よく見たらギリギリCPUのリクエストが51%だった・・・
手動でリソースをすこし寄せる
cordonしたうえで削除して無理やり別のノードへ配備させる
kubectl cordon gke-standard-cluster-1-default-pool-4c3839c2-jlcv
kubectl delete po -n kube-system kube-dns-5dbbd9cc58-jz78s
Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 221m (23%) 1003m (106%) memory 230Mi (8%) 520Mi (19%) ephemeral-storage 0 (0%) 0 (0%) attachable-volumes-gce-pd 0 0
10分後
kubectl get ev -w
0s Normal ScaleDown node/gke-standard-cluster-1-default-pool-4c3839c2-jlcv marked the node as toBeDeleted/unschedulable 0s Normal NodeNotReady node/gke-standard-cluster-1-default-pool-4c3839c2-jlcv Node gke-standard-cluster-1-default-pool-4c3839c2-jlcv status is now: NodeNotReady 0s Normal Deleting node gke-standard-cluster-1-default-pool-4c3839c2-jlcv because it does not exist in the cloud provider node/gke-standard-cluster-1-default-pool-4c3839c2-jlcv Node gke-standard-cluster-1-default-pool-4c3839c2-jlcv event: DeletingNode 0s Normal RemovingNode node/gke-standard-cluster-1-default-pool-4c3839c2-jlcv Node gke-standard-cluster-1-default-pool-4c3839c2-jlcv event: Removing Node gke-standard-cluster-1-default-pool-4c3839c2-jlcv from Controller
kubectl get no
NAME STATUS ROLES AGE VERSION gke-standard-cluster-1-default-pool-da57e6c7-pwzb Ready <none> 118m v1.15.7-gke.2 gke-standard-cluster-1-default-pool-ea34b5f9-l0xq Ready <none> 118m v1.15.7-gke.2
スケールダウンした