计算机系统应用教程网站

网站首页 > 技术文章 正文

了解K8S POD弹性伸缩机制,看这一篇就够了

btikc 2024-10-10 04:49:58 技术文章 5 ℃ 0 评论


弹性伸缩式K8S中的一大亮点功能,当负载大的时候,可以对应用进行扩容,提升pod的副本数来应对大量的流量,当负载小的时候可以对应用进行缩容,以避免资源浪费。功能是通过Kubernetes HPA(Horizontal Pod Autoscaling)Pod水平自动伸缩来实现,只需简单的配置,集群便可以利用监控指标(cpu使用率等)自动的扩容或者缩容服务中Pod数量,当业务需求增加时,系统将会无缝地自动增加适量容器 ,提高系统稳定性。

弹性伸缩分类

K8S弹性伸缩分为两类:

  • 资源维度:保障集群资源池大小满足整体规划,当集群内的资源不足以支撑产出新的pod时,就会触发边界进行扩容
  • 应用维度:保障应用的负载处在预期的容量规划内

伸缩策略:

水平伸缩:

  1. 集群维度:自动调整资源池规模(新增/删除Worker节点)
  2. Pod维度:自动调整Pod的副本集数量

垂直伸缩:

  1. 集群维度:不支持
  2. Pod维度:自动调整应用的资源分配(增大/减少pod的cpu、内存占用)

其中最为成熟也是最为常用的伸缩策略就是HPA(水平Pod伸缩)。

HPA概述


HPA在kubernetes中被设计为一个controller,可以简单的使用kubectl autoscale命令来创建。HPA Controller默认15秒轮询一次,查询指定的resource中(Deployment,RC)的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能。

Pod只有设置request后,HPA才会工作。

目前HPA默认采集指标的实现是Heapster,它主要采集CPU的使用率,因此可以简单认为,HPA就是通过CPU的使用率作为监控指标的。

HPA自动伸缩算法

具体的每次扩容或者缩容的多少Pod的算法为:

Ceil(前采集到的使用率 / 用户自定义的使用率) * Pod数量)
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

ceil表示向上取整,举个实际例子,假设某个服务运行了6个Pod,当前的CPU使用率为50%,预期的CPU使用率为25%,那么满足预期的实际Pod数量就是6 * (50% / 25%) = 12个,即需要将Pod容量扩大一倍,增加6个Pod来满足需求。

K8S会尽可能的让指标往期望值靠近,而不是完全相等,HPA Controller中有一个tolerance(容忍力)的概念,它允许一定范围内的使用量的不稳定,现在默认为0.1,这也是出于维护系统稳定性的考虑。例如,设定HPA调度策略为cpu使用率高于50%触发扩容,那么只有当使用率大于55%或者小于45%才会触发伸缩活动,HPA会尽力把Pod的使用率控制在这个范围之间(容忍度可以通过--horizontal-pod-autoscaler-tolerance来调整)。

当pod所需要的CPU负荷过大,从而在创建一个新pod的过程中,系统的CPU使用量可能会同样在有一个攀升的过程。所以,在每一次作出决策后的一段时间内,将不再进行扩展决策。对于扩容而言,这个时间段为3分钟,缩容为5分钟。

每次最大扩容pod数量不会超过当前副本数量的2倍。

HPA YAML文件概述

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
 creationTimestamp: 2019-12-11T11:04:08Z
 name: nginxtest
 namespace: default
 resourceVersion: "1234567"
 selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginxtest
 uid: 86febb63-5ca1-11e7-abef-5254gyui79a3
spec:
 maxReplicas: 5 //资源最大副本数
 minReplicas: 1 //资源最小副本数
 scaleTargetRef:
 apiVersion: extensions/v1beta1
 kind: Deployment //需要伸缩的资源类型
 name: test //需要伸缩的资源名称
 targetCPUUtilizationPercentage: 50 //触发伸缩的cpu使用率
status:
 currentCPUUtilizationPercentage: 48 //当前资源下pod的cpu使用率
 currentReplicas: 1 //当前的副本数
 desiredReplicas: 2 //期望的副本数

题外话

HPA虽好,但是也有弊端,它可以对服务的容器数量做自动伸缩,这对于服务稳定性是一个很好提升,但是也有弊端,目前稳定版只有CPU这一个指标,所以可能会发生判断不准确而导致不必要的自动伸缩。如何使用,还是在我们自己。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表