Kubernetes(k8s)之HPA

Posted Tuki_a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes(k8s)之HPA相关的知识,希望对你有一定的参考价值。

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

以上是关于Kubernetes(k8s)之HPA的主要内容,如果未能解决你的问题,请参考以下文章

K8S集群基于heapster的HPA测试

k8s群集之动态扩缩容——HPA

(2022版)一套教程搞定k8s安装到实战 | HPA

k8s 读书笔记 - kubernetes 基本概念和术语(下)

Kubernetes HPA 与 Prometheus Node-Exporter 的指标

1.4.7 HPA 横向自动扩容 4.8 statefulset