Automatisch opschalen

Zoals je wellicht weet kun je pods opschalen (scalen) door in de Deployment of ReplicaSet de waarde van ‘replicas’ te verhogen. Dit is wellicht een methode die je gebruikt als je van te voren kunt inzien hoeveel replicas je nodig hebt, maar als je dat niet weet is het een betere optie om automatisch te scalen.

Hiervoor zijn zogenaamde ‘metrics’ beschikbaar die detecteren of de pods over een bepaalde waarde (treshold) gaan voor wat betreft CPU gebruik of enkele andere metrics zoals netwerk-traffic. De metrics-API-server is hiervoor verantwoordelijk en vraagt periodiek naar de metrics van de nodes via ‘kubelet‘. Kubelet maakt gebruik van de cAdvisor, een service die standaard aanwezig is in een Docker omgeving. Daarnaast wordt door kubelet ook metrics doorgegeven aan o.a. de external.metrics.k8s.io die gebruikt kan worden door Horizontal Pod Autoscaling. Zie ook dit artikel op kubernets.io.

verticaal schalen in Kubernetes houdt in meer CPUs of memory aan een reeds bestaande pod toevoegen

Horizontal Pod Autoscaling (hpa)

HPA is het automatisch schalen van het aantal pods dat is nodig om te voldoen aan de ingestelde waarde van bepaalde metrics. Indien nodig zal de Autoscaler de waarde van ‘replicas’ in Deployments of ReplicaSets aanpassen. Een voorbeeld van een hpa.yaml manifest:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
  namespace: nginx
spec:
metrics:
- resource:
  name: cpu
  target:
    averageUtilization: 60
    type: Utilization
  type: Resource
maxReplicas: 4
minReplicas: 2
scaleTargetRef:
  apiVersion: apps/v1
  kind: Deployment
  name: nginx-deployment

Hierin wort aangegeven dat de deployment kan schalen naar 4 replicas. Dit gebeurt dan als de CPU utilization boven de 60% gaat komen.

Om de huidige HPA te zien:

$ kubectl -n nginx get hpa nginx-hpa
NAME      REFERENCE                   TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-hpa Deployment/nginx-deployment 0%/60%  2       4       2        23m

Er zijn minimaal 2 replicas aanwezig, via een busybox pod kan een CPU load genereert worden die de HPA zal activeren en zal opschalen naar maximaal 4 replicas.

$ kubectl -n nginx run -it load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://nginx-svc; done"

In een andere terminal kan nu de HPA bekeken worden:

$ watch kubectl -n nginx get hpa nginx-hpa
NAME      REFERENCE                   TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-hpa Deployment/nginx-deployment 83%/60% 2        4      4        37m

De timing voor opschalen en afschalen is vastgelegd in Kubernetes via een aantal (in te stellen) settings. Zo is er een setting voor de interval van de metrics opvragen (default 30 dec), een setting voor de tijd dat een pod in Ready-status komt (default 30 sec) en een andere settings voor het down-scalen (default 5 min).

Vanaf Kubernetes version 1.23 kunnen ook Custom Metrics gebruikt worden voor HPA zoals bv. network requests. Zie dit artikel: Custom metrics HPA