K8S 基础知识:基于 HPA Pods 级别的 AutoScaling

Published: 2023-08-01

Tags: k8s

本文总阅读量

K8S 使用的 Kubeasz 发行版,Allinone + 添加 Node 部署方式。

确认集群安装了 metrics-server

$ kubectl get pods -n kube-system

输出中可见 metrics-server

NAME                                         READY   STATUS    RESTARTS   AGE
metrics-server-57fbbb5957-7hf25       1/1      Running         0          23h

另外,通过 kubectl get apiservice 查看服务状态

$ kubectl get apiservice | grep metrics

输出

v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        23h

最后运行 kubectl top nodes 查看节点状态,如果可以成功获取指标,则证明 metrics-server 已正常集成

NAME             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
172.17.157.115   96m          4%     2509Mi          76%
worker-01            70m          3%     2398Mi          72%

配置 Horizontal Pod Autoscaler (HPA)

hpa.yaml

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hello-world-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment  
    name: hello-world  
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

AI 给了我一份儿 v1 的配置,v1 版本只支持基于 CPU 的扩缩容,不支持内存,后来无意间发现有 v2 版的配置,如下

hpa-v2.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hello-world-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hello-world
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

启用控制器

$ kubectl apply -f hpa-v2.yaml

当 Pod 的 CPU 使用率持续超过 80%,HPA 控制器会自动扩容 Deployment 的 Pod 数量,当 CPU 使用率降低时,HPA 会自动缩减 Pod 数量以优化资源,以上配置在 1 到 10 个 Pod 之间调节。

查看创建的 HPA

$ kubectl get hpa

# 详细信息
$ kubectl describe hpa hello-world-hpa

输出

NAME              REFERENCE                TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hello-world-hpa   Deployment/hello-world   0%/80%    1         10        5          10m

默认五分钟的观察期,如果 CPU 使用率小于 80%,那么会自动驱逐 Pods 副本,Terminating 即 Pod 正在退出的状态

NAME                          READY   STATUS        RESTARTS   AGE
hello-world-7f66b5bf9-88pdv   0/1     Terminating   0          5m9s
hello-world-7f66b5bf9-dtgnz   1/1     Running       0          3h
hello-world-7f66b5bf9-f65rp   0/1     Terminating   0          5m9s
hello-world-7f66b5bf9-rr28x   0/1     Terminating   0          5m9s

而后达到一个 Pod 的稳定状态。

压力测试

安装 HTTP 压测工具 wrk

# Ubuntu 系统
$ apt show wrk

使用 6 个线程模拟 200 个请求,持续 300s

$ wrk -t6 -c200 -d300s http://172.17.157.115:31539

结果

NAME                          CPU(cores)   MEMORY(bytes)
hello-world-7f66b5bf9-5c4pt   256m         9Mi
hello-world-7f66b5bf9-jjcf6   1m           1Mi
hello-world-7f66b5bf9-mmvgq   256m         9Mi

自动扩容成功。