HPA简介

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的Pod 数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本即测试版本)。
官方文档:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

HPA伸缩过程

1、收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization)
2、对比在扩容条件里记录的cpu限额(CPUUtilization)
3、调整实例数(必须要满足不超过最大/最小实例数)
4、每隔30s做一次自动扩容的判断

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

HPA进行伸缩算法

计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
ceil()表示取大于或等于某数的最近一个整数。

每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。
当前Pod Cpu使用率与目标使用率接近时,不会触发扩容或缩容:
触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9

演示环境

server1:172.25.38.1	harbor仓库端
server2:172.25.38.2	k8s master端
server3:172.25.38.3	k8s node端
server4:172.25.38.4	k8s node端

单条资源限制

Hpa会根据Pod的CPU使用率动态调节Pod的数量。
先拉取一个镜像为之后做测试用
在这里插入图片描述
改标签上传到仓库
在这里插入图片描述
创建一个新目录
在这里插入图片描述
编写创建控制器和服务的定义文件,使用Deployment生成php-apache,开放端口80。内容如下:

[root@server2 hpa]# vim deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: library/hpa-example		#刚刚拉取的镜像地址
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

应用文件,控制器和服务创建成功
在这里插入图片描述
访问IP,效果如下,镜像里有一个php文件,内容就是OK!
在这里插入图片描述
现在,php-apache 服务器已经运行,我们将通过 kubectl autoscale 命令创建 Horizontal Pod Autoscaler。 以下命令将创建一个 Horizontal Pod Autoscaler 用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。 大致来说,HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量以保持所有 Pod 的平均 CPU 利用率在 50% 左右(由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核)

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

可以查看hpa,只有一个pod
在这里插入图片描述
现在进行压力测试,不断写入,增大cpu负载
在这里插入图片描述
新开一个shell,实时查看pod状态
在这里插入图片描述
可以看到CPU占用率上升又下降(建立pod的过程)
在这里插入图片描述
超过限定之值,随着负载增大,hpa开始扩容,pod数量增多,用于缓解压力
在这里插入图片描述
在这里插入图片描述
会慢慢变化,最终趋于50%这个值左右
在这里插入图片描述
在这里插入图片描述
关闭测试pod,开始冷却,负载下降,单个pod cpu占用降低,但pod数量没有下降,负载最终降至零,pod数量减少。

多条资源限制

文件内容如下:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 60	#cpu占用率cpu:60
        type: Utilization
  - type: Resource
    resource:
      name: memory
      target:
        averageValue: 50Mi		#内存占用 mem:50
        type: AverageValue

应用文件创建hpa,监控内容为内存和cpu
在这里插入图片描述

Logo

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

更多推荐