kubernetes中基于CPU和内存的指标实现HPA弹性伸缩

avatar 2022年5月31日18:19:42 评论 455 次浏览

在kubernetes中,针对弹性伸缩主要从两个方面,一种应用pod的伸缩,另一种就是资源节点的伸缩。这里主要说一下基于pod应用的伸缩。在kubernetes中pod的伸缩也是k8s的一个亮点。pod的伸缩能够保证在高峰期或者低峰期时所占用的资源的百分比进行自动扩展资源或者缩资源。举个例子:一个小说网站,如果已经对外推广,那么早上上班时间,中午吃饭时间,晚上下班至十一点半应该都属于高峰期,低峰期时可能用户是高峰期的十分之一,这样来回添加服务比较麻烦,如果加完又有点资源浪费,这种环境下,如果使用伸缩就会自动实现。

首先,kubernetes中的HPA的伸缩指标只有CPU和内存,我们可以根据CPU或者内存的使用率,也可以根据监控的指标,不过cpu和内存是比较常用的伸缩指标方式,下面看一下根据cpu的使用率进行伸缩:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: demo-nginx-hpa  # hpa名称
  namespace: ops-team #k8s命名空间
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-test   #伸缩服务名
  maxReplicas: 10  # 最大副本数
  minReplicas: 2   # 最小副本数
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 65 #内存的使用率

在使用的服务nginx-test的内存的使用率大于等于65时,副本数开始增加,最多增加到10个,等使用率的值小于65时,就会进行缩,最少保留2个副本。下面是通过CPU的使用率,进行伸缩。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: demo-nginx-hpa  # 名称
  namespace: ops-team #k8s命名空间
spec:
  maxReplicas: 10  # 最大副本数
  minReplicas: 2   # 最小副本数
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: nginx-test    
  targetCPUUtilizationPercentage: 60  # cpu 阀值

使用cpu或者内存进行伸缩主要根据自己的服务环境,比如你的服务比较吃内存,可以根据内存进行伸缩,如果服务比较吃cpu,那就根据cpu进行伸缩。也可以CPU和内存一起使用,有一个达到伸缩的阀值就会自动伸缩。看下面通过CPU和内存的使用率进行伸缩:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-nginx-hps
  namespace: ops-team
spec:
  scaleTargetRef:
    kind: Deployment
    name: nginx-hps
    apiVersion: apps/v1
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50
    - type: Resource
      resource:
        name: memory
        targetAverageUtilization: 50

cpu和内存的使用率达到百分之50就扩容,低于就缩。这里有一个需要注意的问题,这里的使用率是pod针对设置的requests和limits的值的百分比,有的人建议两个值设置不一样,有的人建议设置一样。个人建议设置一样,不过针对requests和limits的值设置越小越好,伸缩的阀值也建议不要超过百分之65,如果有瞬间高并发的环境,就需要提前做伸缩,在提前做伸缩的时候,就需依据hpa的基础上定时伸缩。

扩展部分:

看下面的例子:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-nginx-hps
  annotations:
    extendedhpa.metrics: '[{"type":"Resource","name":"cpu","targetType":"Utilization","targetRange":{"low":"40","high":"55"}},{"type":"Resource","name":"memory","targetType":"Utilization","targetRange":{"low":"40","high":"55"}}]'
    extendedhpa.option: '{"downscaleWindow":"1m","upscaleWindow":"1m"}'

1)只有当CPU利用率超过55%的时候,会扩容;只有当CPU利用率低于40%的时候会缩容;

2)如果POD当前CPU利用率为70%时,根据下面的公式计算期望的POD数 =ceil[ 1 x(70/50) ] = ceil[1.4],向下取整为1,不扩容,当CPU超过75%时,期望的POD数 = ceil [1 x (75/50)] = 1.5,向上取整为2,扩容一个POD。当POD的CPU利用率低于40%会考虑缩容,如CPU利用率为20%,根据上面的公式计算期望的POD数 = ceil[ 1 x (20/50) ] = ceil[0.4] < 1,会缩容一个POD。

3)扩容缩容后的1分钟内不会再次扩容缩容,防止POD数频繁变化,引起震荡。

根据HPA工作原理公式:desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

参数1:currentMetricValue 表示当前的值
参数2:desiredMetricValue 表示期望的值
参数3:currentReplicas 表示当前的POD副本数
参数4:desiredReplicas 表示希望扩容后的POD副本数
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: