k8s-HPA自动伸缩pod数量

修改控制器的pod副本数

1、yml文件中修改replicas数量
2、在dashboard修改deployment的pod值;此修改只是临时生效,重建yml文件后,pod数量会恢复,以yml文件为准
3、通过kubectl scale命令;此修改只是临时生效,重建yml文件后,pod数量会恢复
4、通过kubectl edit编辑deployment
5、通过HPA控制器

手动调整pod数量:

kubectl scale 参数对运行在k8s 环境中的pod 数量进行扩容(增加)或缩容(减小)。

1、kubectl scale deployment/nginx-deployment --replicas=2 -n default   #指定deployment的名称
 
2、root@master1:~# kubectl get deployment -n default                   #查看扩容后控制器的pod数量
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
net-test1          3/3     3            3           4d12h
nginx-deployment   2/2     2            2           5m42s

kubectl autoscale deployment/nginx-deploymen --min=2 --max=5 --cpu-percent=50 -n default
#自动扩容指定deployment的pod数量,当pod的cpu资源利用率达到50%,最大pod数量扩容到5个,最小2个pod数量

HPA自动伸缩pod数量

kubectl autoscale 参数自动控制在k8s集群中运行的pod数量(水平自动伸缩),需要提前设置pod范围及触发条件。

k8s从1.1版本开始增加了名称为HPA(Horizontal Pod Autoscaler)的控制器,用于实现基于pod中资源
(CPU/Memory)利用率进行对pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率
做为触发条件,但是在k8s 1.11版本开始使用Metrices Server完成数据采集(采集pod的CPU/内存),然后将采集到的数据通过
API(Aggregated API,汇总API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,然后
再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对pod进行扩缩容的目的。

控制管理器(kube-controller-manager)默认每隔15s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况

kube-controller-manager支持以下三种metrics指标类型:
  ->预定义metrics(比如Pod的CPU)以利用率的方式计算
  ->自定义的Pod metrics,以原始值(raw value)的方式计算
  ->自定义的object metrics
  
支持两种metrics查询方式:
  ->Heapster
  ->自定义的REST API
  
支持多metrics,即支持多种数据采集方式,采集pod指标数据
运维通过master的API创建一个HPA控制器,由HPA控制器对deployment进行自动伸缩,通过调用kube-controller-manager对pod数量进行管理;
配置了HPA的deployment发现pod的资源利用率超过了之前所设定的值,通过调用kube-controller-manager服务创建pod,直到pod的资源利用率低于所设定的值;HPA会通过metrics API获取当前HPA所管理的deployment内部的POD的资源利用率

工作过程:
HPA通过master api(Metrices Server通过api server把采集到的数据记录到etcd中,HPA会通过master api获取到etcd中pod的数据)获取到deployment中pod的指标数据,再与HPA提前定义好的值做对比,如果资源利用率超出定义的值,则会通过kube-controller-manager新建pod,直到资源利用率低于hpa所定义的值;
kube-controller-manager默认每隔15s会查询metrics的资源使用情况

准备metrics-server

https://github.com/kubernetes-incubator/metrics-server #使用metrics-server作为HPA数据源。

1、cd /usr/local/src

2、git clone https://github.com/kubernetes-sigs/metrics-server.git     #将项目克隆下来

3、git clone https://github.com/kubernetes-sigs/metrics-server.git

4、cd metrics-server/deploy/kubernetes/

5、grep image ./*       #部署容器时,有的镜像国外网站下载不下来,需要更换成国内地址

6、vim metrics-server-deployment.yaml
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6      #将镜像地址更换成国内阿里云地址

7、kubectl apply -f .   #将当前目录下所有yml文件全部创建

8、cd /opt/k8s-data/yaml/magedu/tomcat-app1/

9、vim hpa.yaml

#apiVersion: autoscaling/v2beta1   
apiVersion: autoscaling/v1                #定义API版本
kind: HorizontalPodAutoscaler             #对象类型
metadata:                                 #定义对象元数据
  namespace: linux                        #hpa创建后隶属的namespace
  name: linux-tomcat-app1-podautoscaler   #hpa对象名称
  labels:                    
    app: linux-tomcat-app1   #自定义的label名称
    version: v2beta1         #自定义的api版本
spec:                        #定义对象具体信息
  scaleTargetRef:            #定义水平伸缩的目标对象,Deployment、ReplicationController/ReplicaSet     
    apiVersion: apps/v1      #目标对象的API版本
    #apiVersion: extensions/v1beta1 
    kind: Deployment         #目标对象类型为deployment
    name: linux-tomcat-app1-deployment   #目标deployment的具体名称
  minReplicas: 2                         #最小pod数
  maxReplicas: 4                         #最大pod数
  targetCPUUtilizationPercentage: 60     #CPU资源利用率 
  
  #metrics:           #k8s-1.9之前使用此方法指定水平伸缩,现版本已经淘汰
  #- type: Resource
  #  resource:
  #    name: cpu
  #    targetAverageUtilization: 60
  #- type: Resource
  #  resource:
  #    name: memory
  
10、kubectl apply -f hpa.yaml

11、hpa的yml文件一般与服务的yml文件分开

12、kubectl describe deployment/linux-tomcat-app1-deployment -n linux
#desired 最终期望处于READY状态的副本数
 updated 当前完成更新的副本数(已经成为READY状态的副本数)
 total 总计副本数
 available 当前可用的副本数
 unavailable 不可用副本数
 
13、kubectl get hpa -n linux   #查看指定namespace下的hpa控制器 

注意

如果hpa的最小值高于业务yml文件replicas的值,以hpa值为准;
如果yml文件中的replicas值高于hpa的最小值,以hpa的最小值为准;

如果hpa控制器发现所监控的deployment下有pod的CPU资源利用率超过所指定的数值,会进行扩展pod,直到该deployment内各个pod的cpu利用率低于所指定的值为止;
posted on 2020-07-17 15:45  An.amazing.rookie  阅读(1515)  评论(0编辑  收藏  举报