Kubernetes Pod水平自动伸缩(HPA)

时间:2023-12-29 23:44:32

HPA简介

HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。

Pod 水平自动扩缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的调整副本控制器或 Deployment 中的副本数量,以使得 Pod 的平均 CPU 利用率与用户所设定的目标值匹配。

Pod HAP工作机制示意图

Kubernetes Pod水平自动伸缩(HPA)

实际生产中,广泛使用这四类指标:

1、Resource metrics - CPU核内存利用率指标

2、Pod metrics - 例如网络利用率和流量

3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器

4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容

好了,概念就说这些,想了解更多,请参看官网,现在开始实战。

示例

1、首先我们部署一个nginx,副本数为2,请求cpu资源为200m。同时为了便宜测试,使用NodePort暴露服务。命名空间:hpa

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: hpa
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
requests:
cpu: 200m
memory: 100Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: hpa
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx

2、查看部署结果

[root@k8s-node001 HPA]# kubectl  get po -n hpa
NAME READY STATUS RESTARTS AGE
nginx-5c87768685-48b4v 1/1 Running 0 8m38s
nginx-5c87768685-kfpkq 1/1 Running 0 8m38s

3、创建HPA

简单说下:这里创建一个HPA,用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。

HPA 将通过增加或者减少 Pod 副本的数量(通过 Deployment)以保持所有 Pod 的平均 CPU 利用率在 50% 以内。

算法参见

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
namespace: hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50

4、查看部署结果

[root@k8s-node001 HPA]# kubectl  get hpa -n hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 2 50s

5、压测,观察Pod数和HPA变化

执行压测命令

[root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.100.185 (be patient)

观察变化

[root@k8s-node001 HPA]#  kubectl  get hpa -n hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 303%/50% 1 10 7 12m [root@k8s-node001 HPA]# kubectl get po -n hpa
NAME READY STATUS RESTARTS AGE
pod/nginx-5c87768685-6b4sl 1/1 Running 0 85s
pod/nginx-5c87768685-99mjb 1/1 Running 0 69s
pod/nginx-5c87768685-cls7r 1/1 Running 0 85s
pod/nginx-5c87768685-hhdr7 1/1 Running 0 69s
pod/nginx-5c87768685-jj744 1/1 Running 0 85s
pod/nginx-5c87768685-kfpkq 1/1 Running 0 27m
pod/nginx-5c87768685-xb94x 1/1 Running 0 69s

从以上输出可以看出,hpa TARGETS达到了303%,需要扩容。pod数自动扩展到了7个。

继续等待压测结束或者直接打断压测

[root@k8s-node001 ~]# kubectl get hpa -n hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 20%/50% 1 10 7 16m 。。。N分钟后。。。 [root@k8s-node001 ~]# kubectl get hpa -n hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 0%/50% 1 10 7 18m 。。。再过N分钟后。。。 [root@k8s-node001 ~]# kubectl get po -n hpa
NAME READY STATUS RESTARTS AGE
nginx-5c87768685-jj744 1/1 Running 0 11m

这时,CPU 利用率已经降到 0,所以 HPA 将自动缩减副本数量至 1。

这里需要注意下:为什么会将副本数降为1,而不是我们部署时指定的replicas: 2呢?

因为在创建HPA时,指定了副本数范围,这里是minReplicas: 1,maxReplicas: 10。所以HPA在缩减副本数时减到了1。

Tips: 自动扩缩完成副本数量的改变可能需要几分钟的时间。

总结

Kubernetes Pod水平自动伸缩(HPA)