1 HPA伸缩过程

收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization),对比在扩容条件里记录的cpu限额(CPUUtilization)调整实例数(必须要满足不超过最大/最小实例数)

每隔30s做一次自动扩容的判断CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。

2 HPA进行伸缩算法

计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)

  • ceil()表示取大于或等于某数的最近一个整数

每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。

当前Pod Cpu使用率与目标使用率接近时,不会触发扩容或缩容:

触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9

2.1 cpu限制

(1)应用文件:kubectl apply -f hpa.yml

在这里插入图片描述

  • 查看服务的信息:kubectl describe svc php-apache
  • 测试:curl 10.244.141.197

在这里插入图片描述(2)弹性收缩

  • 启动一个容器,并通过一个循环向 php-apache 服务器发送无限的查询请求
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
  • 查看pod的信息:kubectl get pod

在这里插入图片描述(3)增加负载

kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
  • 查看pod的资源使用情况:kubectl top pod
    一分钟时间左右之后,在另个终端可以看到 CPU 负载升高了,由于请求增多,CPU 使用499远超200。 可以看到,Deployment 的副本数量已经增长到了 4

在这里插入图片描述
最终副本的数量可能需要几分钟才能稳定下来。最终的副本数量为6,每个副本的cup使用在100m左右

  • 查看服务的信息:kubectl describe svc php-apache

在这里插入图片描述

在这里插入图片描述

(4) 停止负载

  1. 在我们创建容器的终端中,输入 + C 来终止负载的产生

在这里插入图片描述

  1. 再次检查负载状态(等待几分钟时间):
  • 查看hpa:kubectl get hpa

在这里插入图片描述

kubectl get  pod
kubectl  top pod

在这里插入图片描述

  • 几分钟后CPU 利用率已经降到 0,HPA 将自动缩减副本数量至 1

在这里插入图片描述

在这里插入图片描述

2.2 cpu和内存限制

(1)应用文件:kubectl apply -f hpa-v2.yml

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  maxReplicas: 10  ## 副本数量在1~10之间
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 60   ## cpu的限制在60%
        type: Utilization
  - type: Resource
    resource:
      name: memory
      target:
        averageValue: 50Mi  ## 内存的限制50Mi
        type: AverageValue

(2)增加负载

  • 查看pod内存和cpu资源的使用情况
kubectl  get pod
kubectl  top pod

在这里插入图片描述
(3)增加负载

kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
  • 一分钟时间左右之后,在另个终端可以看到 CPU 负载升高了,CPU 使用501,Deployment
    的副本数量增加到了5,并且每个pod的cpu在100左右

在这里插入图片描述

  • 查看pod的资源使用情况
kubectl  get pod
kubectl  top pod

在这里插入图片描述
(4)停止负载

  • 在我们创建容器的终端中,输入 + C 来终止负载的产生

  • 再次检查负载状态,CPU 利用率慢慢降低,最后 HPA 将自动缩减副本数量至 1

kubectl get  pod
kubectl top pod

在这里插入图片描述

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐