DEV Community

Sina Tavakkol
Sina Tavakkol

Posted on

40 Days Of Kubernetes (17/40)

Day 17/40

Kubernetes Autoscaling | HPA Vs VPA

Video Link
@piyushsachdeva
Git Repository
My Git Repo

In this section, we're going to explain Auto Scaling, HPA and VPA.
Scaling is changing your workloads to meet the demand and it can be manually or automatically.

Three common solutions for scaling applications in Kubernetes environments are:

  1. Horizontal Pod Autoscaler (HPA): Automatically adds or removes for example pod replicas.
  2. Vertical Pod Autoscaler (VPA): Automatically adds or adjusts resources for example CPU and memory reservations for your pods.
  3. Cluster Autoscaler: Automatically adds or removes nodes in a cluster based on all pods’ requested resources.

source

Image description
(Photo from the video)

Image description
(Photo from the video)

There are another types of autoscaling for instance:

  • Event based autoscaling (KEDA)
  • Cron/Schedule based autoscaling

Image description
Image Source


Image description
Image Source


Image description
Image Source


Demo

For doing some hands-on demo, we need the metrics-server pod is running.

root@localhost:~# kubectl get pods -n kube-system
NAME                                               READY   STATUS    RESTARTS      AGE
coredns-7db6d8ff4d-bftnd                           1/1     Running   1 (13d ago)   14d
coredns-7db6d8ff4d-zs54d                           1/1     Running   1 (13d ago)   14d
etcd-lucky-luke-control-plane                      1/1     Running   1 (13d ago)   14d
kindnet-fbwgj                                      1/1     Running   1 (13d ago)   14d
kindnet-hxb7v                                      1/1     Running   1 (13d ago)   14d
kindnet-kh5s6                                      1/1     Running   1 (13d ago)   14d
kube-apiserver-lucky-luke-control-plane            1/1     Running   1 (13d ago)   14d
kube-controller-manager-lucky-luke-control-plane   1/1     Running   1 (13d ago)   14d
kube-proxy-42h2f                                   1/1     Running   1 (13d ago)   14d
kube-proxy-dhzrs                                   1/1     Running   1 (13d ago)   14d
kube-proxy-rlzwk                                   1/1     Running   1 (13d ago)   14d
kube-scheduler-lucky-luke-control-plane            1/1     Running   1 (13d ago)   14d
metrics-server-55677cdb4c-t5wrw                    1/1     Running   0             108s

Enter fullscreen mode Exit fullscreen mode
  • The deployment yaml file:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: registry.k8s.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache
Enter fullscreen mode Exit fullscreen mode

It implements 2 workloads in one yaml file, one for deployment and one for service with 3 - between them.
Let's run them

root@localhost:~# kubectl apply -f day17-deploy.yaml
deployment.apps/php-apache created
service/php-apache created
root@localhost:~# kubectl get po,deploy,svc
NAME                              READY   STATUS    RESTARTS   AGE
pod/php-apache-678865dd57-rlgqw   1/1     Running   0          67s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   1/1     1            1           67s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   14d
service/php-apache   ClusterIP   10.96.250.6   <none>        80/TCP    67s
Enter fullscreen mode Exit fullscreen mode

We define 50% threshold for cpu usage for the deployment and minimum and maximum replica for it.

root@localhost:~# kubectl autoscale deploy php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
root@localhost:~# kubect get hpa
kubect: command not found
root@localhost:~# kubectl get hpa
NAME         REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   cpu: 0%/50%   1         10        1          17s
Enter fullscreen mode Exit fullscreen mode

Now, we generate some loads on the deployment and see what will be happened.

root@localhost:~# kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!
Enter fullscreen mode Exit fullscreen mode
root@localhost:~# kubectl get po,deploy,svc,hpa
NAME                              READY   STATUS    RESTARTS   AGE
pod/load-generator                1/1     Running   0          9s
pod/php-apache-678865dd57-rlgqw   1/1     Running   0          13m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   1/1     1            1           13m

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   14d
service/php-apache   ClusterIP   10.96.250.6   <none>        80/TCP    13m

NAME                                             REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/php-apache   Deployment/php-apache   cpu: 0%/50%   1         10        1          6m45s
Enter fullscreen mode Exit fullscreen mode
root@localhost:~# kubectl get po,deploy,svc,hpa
NAME                              READY   STATUS    RESTARTS   AGE
pod/load-generator                1/1     Running   0          30s
pod/php-apache-678865dd57-g4gl6   1/1     Running   0          6s
pod/php-apache-678865dd57-rlgqw   1/1     Running   0          13m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   2/2     2            2           13m

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   14d
service/php-apache   ClusterIP   10.96.250.6   <none>        80/TCP    13m

NAME                                             REFERENCE               TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/php-apache   Deployment/php-apache   cpu: 61%/50%   1         10        1          7m6s
Enter fullscreen mode Exit fullscreen mode
root@localhost:~# kubectl get po,deploy,svc,hpa
NAME                              READY   STATUS    RESTARTS   AGE
pod/load-generator                1/1     Running   0          99s
pod/php-apache-678865dd57-g4gl6   1/1     Running   0          75s
pod/php-apache-678865dd57-gfjpb   1/1     Running   0          15s
pod/php-apache-678865dd57-gh5fl   1/1     Running   0          60s
pod/php-apache-678865dd57-hkn4b   1/1     Running   0          60s
pod/php-apache-678865dd57-k4g55   1/1     Running   0          45s
pod/php-apache-678865dd57-rlgqw   1/1     Running   0          15m
pod/php-apache-678865dd57-td5ht   1/1     Running   0          45s
pod/php-apache-678865dd57-w69s2   1/1     Running   0          15s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   8/8     8            8           15m

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   14d
service/php-apache   ClusterIP   10.96.250.6   <none>        80/TCP    15m

NAME                                             REFERENCE               TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/php-apache   Deployment/php-apache   cpu: 59%/50%   1         10        6          8m15s
Enter fullscreen mode Exit fullscreen mode

And when we stop the loads, the replicas start to decreasing

OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!^Cpod "load-generator" deleted
pod default/load-generator terminated (Error)
Enter fullscreen mode Exit fullscreen mode
root@localhost:~# kubectl get po,deploy,svc,hpa
NAME                              READY   STATUS    RESTARTS   AGE
pod/php-apache-678865dd57-rlgqw   1/1     Running   0          21m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   1/1     1            1           21m

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP   14d
service/php-apache   ClusterIP   10.96.250.6   <none>        80/TCP    21m

NAME                                             REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/php-apache   Deployment/php-apache   cpu: 0%/50%   1         10        2          14m

Enter fullscreen mode Exit fullscreen mode

Top comments (0)