2020/01/25 GKE/k8s でscale to zero

cloud.google.com


調べたいこと

  • ノードプールが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-flsk8kube-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

スケールダウンした