总结:
HPA作用于工作负载上, 可以实现Pod副本的动态缩扩容
HPA的缩扩容阈值最初只有CPU和内存的使用率, 现在多出了CPU和内存使用量, 以及入带宽和出带宽。可结合业务场景定制阈值
容器启动时可能会使用过量资源, 因此HPA具有一定的冷却时间, 以等待容器启动完毕, 该时间可在kubelet启动参数中更改
一、介绍:
HPA(Horizontal Pod Autoscaler, 水平扩展)是Kubernetes的一种机制, 它可以根据Pod的CPU或内存负载自动的扩容以及缩容, 从而解决Pod负载过高时需要手动扩容的情况。HPA是k8s的一种资源, 它周期性采集指定Pod的CPU和内存使用数据, 会根据之前设定的机制计算决定是否扩容或缩容
HPA支持多副本控制的工作负载, 例如Deployment, Replication Controller, ReplicaSet, StatefulSet
不适用于不可以扩缩的对象(如Damonset)
指标:
1.最大扩容数量
2.最小缩容数量
3.扩缩容阈值
4.工作负载率
二、计算机制:
期望副本数量·= [当前副本数 * (当前指标 / 期望指标)]
三、实现原理:
该机制主要是基于kubernetes api 资源与controller 实现。api决定controller行为,controller周期性调整副本数量。
四、创建HPA
两种方式:命令行与yaml文件
命令行:
kubectl 以标准方式支持 HPA。 我们可以通过 kubectl create 命令创建一个 HPA 对象, 通过 kubectl get hpa 命令来获取所有 HPA 对象, 通过 kubectl describe hpa 命令来查看 HPA 对象的详细信息。 最后,可以使用 kubectl delete hpa 命令删除对象。
也可使用 autoscaler 自动设置在kubernetes集群中运行的pod数量
kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [–min=MINPODS] –max=MAXPODS [–cpu-percent=CPU]
参数解释:
-f, TYPE NAME, TYPE/NAME: 所需绑定的工作负载
–min: 最小缩容数
–min: 最大扩容数
–cpu-percent: cpu缩扩容阈值, 单位为百分比
[root@dce-172-30-40-237 tmp]# kubectl autoscale deployment my-nginx --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/my-nginx autoscaled
一个绑定my-nginx的HPA, 缩扩容数量范围为1至10, cpu阈值为50%
Yaml配置文件:
hpa.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: hpa-test
namespace: default
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: deployment-nginx
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 60
spec.scaleTargetRef指定需绑定的工作负载
spec.metrics[0].resource.name指定资源名, 可以为cpu或memory
targetAverageUtilization指定目标阈值
maxReplicas指定最大副本扩容数
minReplicas指定最小副本扩容数
创建HPA
[root@dce-172-30-40-237 tmp]# kubectl apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/hpa-test created
不断请求该service,一段时间后,发现副本数量变化
[root@dce-172-30-40-237 tmp]# kubectl get hpa -o wide
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-test Deployment/deployment-nginx <unknown>/60% 1 10 4 20m
my-nginx Deployment/my-nginx <unknown>/50% 1 10 3 33m