How to Enable KubeAPI server for HPA Autoscaling Metrics How to Enable KubeAPI server for HPA Autoscaling Metrics kubernetes kubernetes

How to Enable KubeAPI server for HPA Autoscaling Metrics


I am able to implement HPA using metrics-server as heapster is depreciated. I have followed the following steps:

  1. Clone the metrics-server github repo: git clone https://github.com/kubernetes-incubator/metrics-server.git

Go into directory cd deploy/1.8+ and run following yaml files:

[root@ip-10-0-1-91 1.8+]# kubectl apply -f aggregated-metrics-reader.yaml clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created[root@ip-10-0-1-91 1.8+]# kubectl apply -f auth-reader.yaml rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created[root@ip-10-0-1-91 1.8+]# kubectl apply -f auth-delegator.yaml clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created[root@ip-10-0-1-91 1.8+]# kubectl apply -f metrics-apiservice.yaml apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created[root@ip-10-0-1-91 1.8+]# kubectl apply -f resource-reader.yaml clusterrole.rbac.authorization.k8s.io/system:metrics-server createdclusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created[root@ip-10-0-1-91 1.8+]# kubectl apply -f metrics-server-deployment.yaml serviceaccount/metrics-server createddeployment.extensions/metrics-server created[root@ip-10-0-1-91 1.8+]# kubectl apply -f metrics-server-service.yaml service/metrics-server created

Now create a pod you want to test for autoscaling (taken from kubernetes official docs):

[root@ip-10-0-1-91 auto]#  kubectl run --generator=run-pod/v1 php-apache -- image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80service/php-apache createddeployment.apps/php-apache created

Now create a autoscale deployment:

[root@ip-10-0-1-91 auto]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10horizontalpodautoscaler.autoscaling/php-apache autoscaled

Now check the HPA, your metrics are coming or not:

[root@ip-10-0-1-91 manifests]# kubectl get hpaNAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGEphp-apache   Deployment/php-apache   0%/50%    1         10        1          2m

Now generate load from another window using:

kubectl run -i --tty load-generator --image=busybox /bin/sh

It will open a sh terminal and you can run a load from that sh terminal using:

while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

It will take a minute or so to take enough load on your pod and you see a boom:

[root@ip-10-0-1-91 manifests]# kubectl get hpaNAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGEphp-apache   Deployment/php-apache   120%/50%   1         10        4          7m

And pods scaling :

enter image description here

Hope this helps to get your HPA working.

EDIT:

Replace the metrics-server-deployment.yaml file in deploy/1.8+ with the following yaml file:

 apiVersion: v1 kind: ServiceAccount metadata:   name: metrics-server   namespace: kube-system --- apiVersion: extensions/v1beta1 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:       - command:         - /metrics-server         - --metric-resolution=30s         - --kubelet-insecure-tls         - --kubelet-preferred-address-types=InternalIP         name: metrics-server         image: k8s.gcr.io/metrics-server-amd64:v0.3.1         imagePullPolicy: Always         volumeMounts:         - name: tmp-dir           mountPath: /tmp

Also, enable the --authentication-token-webhook in kubelet.conf, then you will be able to get the HPA.

EDIT2: You need to set following properties in the deployment file (in your case it is tomcat) for which you are creating HPA, then only your HPA can fetch metrics from your deployment.

resources:  requests:    memory: "64Mi"    cpu: "250m"  limits:    memory: "128Mi"    cpu: "500m"