Horizontal Pod Autoscaler
PREREQUISITE
For setting up HPA you must have a working kubernetes cluster with proper master and nodes server in proper up and ready state, you may need to edit the cluster to fetch metrics and for that you need to deploy metric-server deployment on to your cluster. To apply HPA follow the steps that are mentioned in this website as below.
UPDATING CLUSTER CONFIGURATION
First edit the cluster configuration by using the below command:-
kops edit cluster
It will show you the cluster configuration, replace the kubelet part in the configuration with the part mentioned below:-
kubelet: anonymousAuth: false authenticationTokenWebhook: true authorizationMode: Webhook
Save this configuration and update your cluster with the command below:-
kops update cluster --name=( cluster -name) --yes
If asks for rolling update then update cluster with rolling update:-
kops rolling - update cluster --yes
NOTE:- It may take some time to update because you have edited the cluster configuration as it may terminate the old instances and bring up the new instances on its own, so have to do nothing just wait for 5-10 minutes.
DEPLOYING METRICS SERVER ON THE CLUSTER FOR HPA
For deploying the metrics server clone the github repository on your server
git clone https ://github.com/kubernetes-incubator/metrics-server.git
Now change to directory metrics-server/deploy/kubernetes
cd metrics-server/ deploy /kubernetes
You will find some yaml files in this location, edit the metrics-server-deployment.yaml file and replace the contents of file with contents mentioned below:-
--- apiVersion : v1 kind : ServiceAccount metadata : name : metrics-server namespace : kube-system --- apiVersion : apps/v1 kind : Deployment metadata : name : metrics-server namespace : kube-system labels : k8s-app : metrics-server spec : selector : matchLabels : k8s-app : metrics-server template : metadata : name : metrics-server labels : k8s-app : metrics-server spec : serviceAccountName : metrics-server volumes : # mount in tmp so we can safely use from-scratch images and/or read-only containers - name : tmp-dir emptyDir : {} containers : - name : metrics-server image : k8s.gcr.io/metrics-server-amd64:v0.3.6 command : - /metrics-server - --v=2 - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP args : - --cert-dir=/tmp - --secure-port=4443 ports : - name : main-port containerPort : 4443 protocol : TCP securityContext : readOnlyRootFilesystem : true runAsNonRoot : true runAsUser : 1000 imagePullPolicy : Always volumeMounts : - name : tmp-dir mountPath : /tmp nodeSelector : beta.kubernetes.io/os : linux kubernetes.io/arch : "amd64"
Now execute the below command to deploy metric-server on your cluster:-
kubectl create -f .
Now wait for few seconds and execute the below commands to check your pods for metric-server
kubectl get pods -n kube- system
To check logs of metric-server
kubectl -n kube-system logs (mertic-server-pod-name)
It should start fetching metrics from nodes and pods
TESTING HORIZONTAL POD SCALER
For testing HPA we will create a deployment and service and do not forget to add limits and resources in your deployment.yaml, because if you will skip them in your yaml then you won’t be able to apply hpa.
For example create a deployment and service.yaml as mentioned in below example:-
apiVersion: apps/v1 kind: Deployment metadata: name: php-apache spec: selector: matchLabels: run: php-apache replicas: 1 template: metadata: labels: run: php-apache spec: containers: - name: php-apache image: k8s.gcr.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
Save the above yaml file with the name that you want, in my case i have named it as php-deployment.yaml
Now create deployment with command:-
kubectl create -f php-deployment .yaml
CREATE HORIZONTAL POD AUTOSCALER
Now that the server is up and running, we will now create the autoscaler using kubectl autoscale. The below command will create a Horizontal Pod Autoscaler which will maintain between 1 and 10 replicas of the Pods with CPU utilization of 50% controlled by the php-apache deployment we created in the above step of these instructions.
kubectl autoscale deployment php-apache --cpu-percent =50 --min =1 --max =10
We can check the current status of autoscaler by running below command:
kubectl get hpa
Now wait for 1 or 2 minutes as it will start fetching metrics .
INCREASE LOAD
Now, we will see how the autoscaler reacts to our increased load. Kindly run the blow command in different terminal:
kubectl run --generator=run-pod/v1 -it --rm load-generator --image=busybox /bin/sh # Hit enter for command prompt while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
Within a minute or so, we should see the higher CPU load by executing/running below command:
kubectl get hpa NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache/scale 305%/50% 1 10 1 3 m
Here, CPU consumption has increased to 405% of the request. As a result, the deployment was resized to 7 replicas:
kubectl get deployment php-apache