Kubernetes: scalabilità automatica

Autoscalingè una delle funzionalità chiave del cluster Kubernetes. È una funzionalità in cui il cluster è in grado di aumentare il numero di nodi all'aumentare della richiesta di risposta del servizio e diminuire il numero di nodi al diminuire del requisito. Questa funzione di auto scaling è attualmente supportata in Google Cloud Engine (GCE) e Google Container Engine (GKE) e inizierà presto con AWS.

Per configurare un'infrastruttura scalabile in GCE, dobbiamo prima avere un progetto GCE attivo con funzionalità di monitoraggio cloud di Google, registrazione cloud di Google e stackdriver abilitato.

Innanzitutto, configureremo il cluster con pochi nodi in esecuzione al suo interno. Una volta fatto, dobbiamo impostare la seguente variabile d'ambiente.

Variabile d'ambiente

export NUM_NODES = 2
export KUBE_AUTOSCALER_MIN_NODES = 2
export KUBE_AUTOSCALER_MAX_NODES = 5
export KUBE_ENABLE_CLUSTER_AUTOSCALER = true

Una volta terminato, avvieremo il cluster eseguendolo kube-up.sh. Questo creerà un cluster insieme al componente aggiuntivo auto-scalare del cluster.

./cluster/kube-up.sh

Alla creazione del cluster, possiamo controllare il nostro cluster utilizzando il seguente comando kubectl.

$ kubectl get nodes
NAME                             STATUS                       AGE
kubernetes-master                Ready,SchedulingDisabled     10m
kubernetes-minion-group-de5q     Ready                        10m
kubernetes-minion-group-yhdx     Ready                        8m

Ora possiamo distribuire un'applicazione sul cluster e quindi abilitare il programma di scalabilità automatica del pod orizzontale. Questo può essere fatto usando il seguente comando.

$ kubectl autoscale deployment <Application Name> --cpu-percent = 50 --min = 1 --
max = 10

Il comando precedente mostra che manterremo almeno una e massimo 10 repliche del POD all'aumentare del carico sull'applicazione.

Possiamo controllare lo stato del programma di scalabilità automatica eseguendo il file $kubclt get hpacomando. Aumenteremo il carico sui pod utilizzando il seguente comando.

$ kubectl run -i --tty load-generator --image = busybox /bin/sh
$ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

Possiamo controllare il file hpa correndo $ kubectl get hpa comando.

$ kubectl get hpa
NAME         REFERENCE                     TARGET CURRENT
php-apache   Deployment/php-apache/scale    50%    310%

MINPODS  MAXPODS   AGE
  1        20      2m
  
$ kubectl get deployment php-apache
NAME         DESIRED    CURRENT    UP-TO-DATE    AVAILABLE   AGE
php-apache      7          7           7            3        4m

Possiamo controllare il numero di pod in esecuzione utilizzando il seguente comando.

jsz@jsz-desk2:~/k8s-src$ kubectl get pods
php-apache-2046965998-3ewo6 0/1        Pending 0         1m
php-apache-2046965998-8m03k 1/1        Running 0         1m
php-apache-2046965998-ddpgp 1/1        Running 0         5m
php-apache-2046965998-lrik6 1/1        Running 0         1m
php-apache-2046965998-nj465 0/1        Pending 0         1m
php-apache-2046965998-tmwg1 1/1        Running 0         1m
php-apache-2046965998-xkbw1 0/1        Pending 0         1m

E infine, possiamo ottenere lo stato del nodo.

$ kubectl get nodes
NAME                             STATUS                        AGE
kubernetes-master                Ready,SchedulingDisabled      9m
kubernetes-minion-group-6z5i     Ready                         43s
kubernetes-minion-group-de5q     Ready                         9m
kubernetes-minion-group-yhdx     Ready                         9m