k8s之Horizontal Pod Autoscaler

  • A+
所属分类:linux技术
摘要

在前面的学习中,我们可以通过手工执行kubectl scale命令实现pod扩容,但是这显然不符合k8s的定位目标:自动化、智能化。


HPA(pod水平自动伸缩)介绍

在前面的学习中,我们可以通过手工执行kubectl scale命令实现pod扩容,但是这显然不符合k8s的定位目标:自动化、智能化。

k8s期望可以通过监测pod的使用情况,实现pod数量的自动调整,于是就产生了HPA这种控制器

HPA可以获取每个pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现pod数量的调整。

其实HPA与之前的Deployment一样,也属于一种k8s资源对象,它通过追踪分析目标pod的负载变化情况,来确定是否需要针对性地调整目标pod的副本数。

说白了,就相当于你有10个pod在运行,但是pod利用率只有10%,那么HPA会根据指标自动给你删除其他不需要的pod。

k8s之Horizontal Pod Autoscaler

 

安装metrics-server

metrics-server可以用来收集集群中的资源使用情况#安装git[root@master ~]# yum install git -y


#获取metrics
-server,注意使用的版本 #注意,由于国内访问github较慢的原因,从github上下载文件可能会失败,建议多试几次或者使用代理 [root@master ~]# git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server

#修改deployment,注意修改的是镜像和初始化参数 [root@master ~]# cd metrics-server/deploy/1.8+/ [root@master 1.8+]# vim metrics-server-deployment.yaml
#添加如下选项 hostNetwork:
true registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
args:
- --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

效果如下:

 k8s之Horizontal Pod Autoscaler

查看安装情况

#安装metrics-server [root@master 1.8+]# kubectl apply -f ./ clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created serviceaccount/metrics-server created deployment.apps/metrics-server created service/metrics-server created clusterrole.rbac.authorization.k8s.io/system:metrics-server created clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created  #查看pod [root@master 1.8+]# kubectl get pods -n kube-system metrics-server-6b976979db-mrng6   1/1     Running   0          39s  #使用kubectl top node查看资源使用情况 [root@master 1.8+]# kubectl top node NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%      master   83m          4%     803Mi           46%          node1    37m          1%     330Mi           19%          node2    <unknown>                           <unknown>               <unknown>               <unknown>    [root@master 1.8+]# kubectl top pod -n kube-system NAME                              CPU(cores)   MEMORY(bytes)    coredns-6955765f44-pxnqm          2m           11Mi             coredns-6955765f44-stjjf          2m           12Mi             etcd-master                       12m          44Mi             kube-apiserver-master             28m          356Mi            kube-controller-manager-master    13m          39Mi             kube-flannel-ds-m8pv6             3m           32Mi             kube-flannel-ds-rszpm             2m           31Mi             kube-proxy-dz88s                  1m           14Mi             kube-proxy-smj5t                  1m           14Mi             kube-scheduler-master             3m           16Mi             metrics-server-6b976979db-mrng6   2m           11Mi   

至此,metrics-server安装完成

 准备deployment和service

使用命令行工具

#创建deployment [root@master 1.8+]# kubectl run nginx --image=nginx:1.17.1 --requests=cpu=100m -n dev #创建service [root@master ~]# kubectl expose deploy nginx --type=NodePort --port=80 -n dev service/nginx exposed #查看 [root@master ~]# kubectl get deploy,pod,svc -n dev NAME                    READY   UP-TO-DATE   AVAILABLE   AGE deployment.apps/nginx   1/1     1            1           5m4s  NAME                         READY   STATUS    RESTARTS   AGE pod/nginx-778cb5fb7b-58jrz   1/1     Running   0          5m4s  NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE service/nginx   NodePort   10.101.205.0   <none>        80:31313/TCP   28s

部署HPA

创建pc-hpa.yaml

apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata:   name: pc-hpa   namespace: dev spec:   minReplicas: 1 #最小pod数量   maxReplicas: 10  #最大pod数量   targetCPUUtilizationPercentage: 3 #cpu使用率指标,意思是当pod使用率达到3%之后就增加新的pod   scaleTargetRef:  #指定要控制的nginx信息     apiVersion: apps/v1     kind: Deployment     name: nginx

使用yaml文件

[root@master ~]# vim pc-hpa.yaml [root@master ~]# kubectl create -f pc-hpa.yaml  horizontalpodautoscaler.autoscaling/pc-hpa created [root@master ~]# kubectl get hpa -n dev NAME     REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE pc-hpa   Deployment/nginx   0%/3%     1         10        1          61s

进行hpa压力测试

新建窗口

新建三个xshell窗口,第一个检测deploy,第二个检测pod,第三个检测hpa

k8s之Horizontal Pod Autoscaler

 

 

 在第二个窗口中输入

[root@master ~]# kubectl get deploy -n dev -w NAME    READY   UP-TO-DATE   AVAILABLE   AGE nginx   1/1     1            1           22m

在第三个窗口中输入

[root@master ~]# kubectl get pod -n dev -w NAME                     READY   STATUS    RESTARTS   AGE nginx-778cb5fb7b-58jrz   1/1     Running   0          23m

在第四个窗口中输入

[root@master ~]# kubectl get hpa -n dev -w NAME     REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE pc-hpa   Deployment/nginx   0%/3%     1         10        1          6m56s

使用postman进行压力测试

k8s之Horizontal Pod Autoscaler

测试访问,使用postman进行访问,发现能够访问通

k8s之Horizontal Pod Autoscaler

 

 使用postman新建一个runner tab,将要测试的地址拖进去,设置压测的数量为10000,点击运行

k8s之Horizontal Pod Autoscaler

 

 查看三个监控窗口

deploy监控窗口

k8s之Horizontal Pod Autoscaler

pod监控窗口

k8s之Horizontal Pod Autoscaler

hpa监控窗口

k8s之Horizontal Pod Autoscaler

 

 

可以发现由于pod使用率的增加,pod在不断地被创建,最后总共创建了10个pod,即我们设置的最大阈值

k8s之Horizontal Pod Autoscaler

 

 

压力测试结束之后,在等几分钟,再次查看pod的情况,可以发现,大约10分钟之后,由于pod使用率降低,pod在不断地被删除,最后只剩一个pod

k8s之Horizontal Pod Autoscaler

 

 k8s之Horizontal Pod Autoscaler

k8s之Horizontal Pod Autoscaler