K8S HPA自动扩容和伸缩Pod

Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过执行kubectl scale命令或通过RESTful API对一个Deployment/RC进行Pod副本数量的设置。自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。

创建一个Deployment pod和Service

K8S HPA自动扩容和伸缩Pod

 

 查看pod 和svc

K8S HPA自动扩容和伸缩Pod

 

 1.手动库容pod 至5ge

K8S HPA自动扩容和伸缩Pod

 

 2.自动扩容

Kubernetes使用Horizontal Pod Autoscaler(HPA)的控制器实现基于CPU使用率进行自动Pod扩缩容的功能。HPA控制器基于Master的kube-controller-manager服务启动参数--horizontal-pod-autoscaler-sync-period定义的探测周期(默认值为15s),周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整。

  • HPA原理
Kubernetes中的某个Metrics Server(Heapster或自定义MetricsServer)持续采集所有Pod副本的指标数据。HPA控制器通过Metrics Server的API(Heapster的API或聚合API)获取这些数据,基于用户定义的扩缩容规则进行计算,得到目标Pod副本数量。 当目标Pod副本数量与当前副本数量不同时,HPA控制器就向Pod的副本控制器(Deployment、RC或ReplicaSet)发起scale操作,调整Pod的副本数量,完成扩缩容操作。
  • HPA指标类型
Master的kube-controller-manager服务持续监测目标Pod的某种性能指标,以计算是否需要调整副本数量。目前Kubernetes支持的指标类型如下: Pod资源使用率:Pod级别的性能指标,通常是一个比率值,例如CPU使用率。 Pod自定义指标:Pod级别的性能指标,通常是一个数值,例如接收的请求数量。 Object自定义指标或外部自定义指标:通常是一个数值,需要容器应用以某种方式提供,例如通过HTTP URL“/metrics”提供,或者使用外部服务提供的指标采集URL。 Metrics Server将采集到的Pod性能指标数据通过聚合API(Aggregated API) 如metrics.k8s.io、 custom.metrics.k8s.io和external.metrics.k8s.io提供给HPA控制器进行查询。
  • 扩缩容算法
Autoscaler控制器从聚合API获取到Pod性能指标数据之后,基于下面的算法计算出目标Pod副本数量,与当前运行的Pod副本数量进行对比,决定是否需要进行扩缩容操作: desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )] 即当前副本数 x(当前指标值/期望的指标值),将结果向上取整。 释义:以CPU请求数量为例,如果用户设置的期望指标值为100m,当前实际使用的指标值为200m,则计算得到期望的Pod副本数量应为两个(200/100=2)。如果设置的期望指标值为50m,计算结果为0.5,则向上取整值为1, 得到目标Pod副本数量应为1个。 注意:当计算结果与1非常接近时,可以设置一个容忍度让系统不做扩缩容操作。容忍度通过kube-controller-manager服务的启动参数--horizontalpod-autoscaler-tolerance进行设置,默认值为0.1(即10%),表示基于上述算法得到的结果在[-10%-+10%]区间内,即[0.9-1.1],控制器都不会进行扩缩容操作。 也可以将期望指标值(desiredMetricValue)设置为指标的平均值类型,例如targetAverageValue或targetAverageUtilization,此时当前指标值(currentMetricValue) 的算法为所有Pod副本当前指标值的总和除以Pod副本数量得到的平均值。 此外,存在几种Pod异常的如下情况:
  • Pod正在被删除(设置了删除时间戳):将不会计入目标Pod副本数量。
  • Pod的当前指标值无法获得:本次探测不会将这个Pod纳入目标Pod副本数量,后续的探测会被重新纳入计算范围。
  • 如果指标类型是CPU使用率,则对于正在启动但是还未达到Ready状态的Pod,也暂时不会纳入目标副本数量范围。
提示:可以通过kubecontroller-manager服务的启动参数--horizontal-pod-autoscaler-initialreadiness-delay设置首次探测Pod是否Ready的延时时间,默认值为30s。 另一个启动参数--horizontal-pod-autoscaler-cpuinitialization-period设置首次采集Pod的CPU使用率的延时时间。   Kubernetes将HorizontalPodAutoscaler资源对象提供给用户来定义扩缩容的规则。 HorizontalPodAutoscaler资源对象处于Kubernetes的API组“autoscaling”中, 目前包括v1和v2两个版本。 其中autoscaling/v1仅支持基于CPU使用率的自动扩缩容, autoscaling/v2则用于支持基于任意指标的自动扩缩容配置, 包括基于资源使用率、 Pod指标、 其他指标等类型的指标数据。 创建一个hpa.yaml K8S HPA自动扩容和伸缩Pod

 K8S HPA自动扩容和伸缩Pod

释义:

scaleTargetRef:目标作用对象,可以是Deployment、ReplicationController或ReplicaSet。 targetCPUUtilizationPercentage:期望每个Pod的CPU使用率都为50%,该使用率基于Pod设置的CPU Request值进行计算,例如该值为200m,那么系统将维持Pod的实际CPU使用值为100m。 minReplicas和maxReplicas:Pod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作, 并维持每个Pod的CPU使用率为50%。 为了使用autoscaling/v1版本的HorizontalPodAutoscaler,需要预先安装Heapster组件或Metrics Server,用于采集Pod的CPU使用率。   测试自动扩容:使用ab 测试工具 yum install httpd-tools -y K8S HPA自动扩容和伸缩Pod

 

 查看hpa 和pod 的CPU使用情况

K8S HPA自动扩容和伸缩Pod

 以上自动库容完成,待cup使用率低于50%时,pod的数量会自动缩容到2个

K8S HPA自动扩容和伸缩Pod

https://blog.csdn.net/weixin_45714179/article/details/103224479

上一篇:ASP.net 简单注册界面


下一篇:KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力