目录
Kubernetes的Horizontal Pod Autoscaler(HPA)是一种自动化的机制,用于根据CPU使用率或其他自定义指标自动调整Pod的数量。HPA旨在优化应用的资源使用,提高可用性和性能,尤其在负载波动时。但HPA不适用于无法缩放的对象,如DaemonSet
HPA工作原理
在Kubernetes环境中,Metrics Server负责持续地收集各个Pod副本的性能指标。利用这些指标数据,HPA(Horizontal Pod Autoscaler)控制器通过聚合API接口访问Metrics Server,按照预设的扩缩容规则进行分析计算,以确定目标的Pod副本数。若计算得出的目标副本数与当前运行的副本数存在差异,HPA控制器便会向对应的Deployment控制器发送scale请求,动态调整Pod副本的数量,以此实现应用的自动扩缩容。
使用HPA前提条件
- 启用Kubernetes API聚合层:自Kubernetes 1.7版本起,引入了API聚合层(API Aggregation Layer),这一新特性使得第三方应用能够通过注册到kube-apiserver,便捷地利用API Server的HTTP URL访问和操作其新增的API。这一机制的实现,得益于在kube-apiserver服务中集成的API聚合层,它负责将针对扩展API的访问请求高效转发至相应的用户定义服务。
- 相应的API已注册:
- 资源指标(CPU使用率、内存使用率):使用metrics.k8s.io API,一般由metrics-server提供,因此需要提前部署好metrics-server服务
- 自定义指标(QPS等):使用custom.metrics.k8s.io API,由相关适配器(Adapter)服务提供。
启用Kubernetes API聚合层
- kubeadm部署默认启动API聚合层
- 二进制部署启动API聚合层
二进制部署需要在kubeAPIServer中添加启动参数,增加以下配置
# vi /opt/kubernetes/cfg/kube-apiserver.conf ...
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \ #根证书
--proxy-client-cert-file=/opt/kubernetes/ssl/server.pem \ #实际就是kubeadm部署front-proxy证书
--proxy-client-key-file=/opt/kubernetes/ssl/server-key.pem \ #实际就是kubeadm部署的front-proxy证书
--requestheader-allowed-names=kubernetes \
--requestheader-extra-headers-prefix=X-Remote-Extra- \
--requestheader-group-headers=X-Remote-Group \
--requestheader-username-headers=X-Remote-User \
--enable-aggregator-routing=true \
安装metrics-server
Metrics Server是一个数据聚合器,从kubelet收集资源指标,并通 过Metrics API在Kubernetes apiserver暴露,以供HPA使用。
项目地址
https://github.com/kubernetes-sigs/metrics-server/releases/download/<version>/components.yaml
1、编辑修改components.yaml中 metrics-server 的启动参数并部署yaml文件
#修改 metric server的args参数
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls #跳过 TLS 认证,否则会出现 x509 的认证问题,用于测试环境。
2、验证Metrics Server是否成功部署
kubectl get pods -n kube-system | grep metrics-server
3、测试Metrics Server是否工作正常
kubectl top nodes
HPA使用方法
1、创建HPA
定义HPA资源对象,并指定监控的Deployment或ReplicaSet,以及期望的目标指标(如CPU使用率)
HPA示例Yaml
minReplicas
和maxReplicas
分别定义了Pod的最小和最大副本数。metrics
字段指定了HPA监控的指标,这里是CPU使用率,目标设置为50%,这里50%的分母是Pod requests的值
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: example-app-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: example-app-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
2、查看hpa
kubectl get hpa
HPA冷却周期
在弹性伸缩策略中,考虑到评估指标的动态变化可能导致Pod副本数频繁波动,从而可能影响服务的稳定性,引入了冷却周期(Cooldown Period)的概念。这是为了防止在短时间内频繁扩缩容,进而避免潜在的流量损失。为此,在HPA(Horizontal Pod Autoscaler)的实现中,采取了以下默认控制措施:
-
--horizontal-pod-autoscaler-downscale-delay
:在执行缩容操作之前,系统将在完成上一次操作后等待一段预设时间,默认为5分钟。这样做是为了确保系统稳定,避免因短时间内的指标波动而触发不必要的缩容。 -
--horizontal-pod-autoscaler-upscale-delay
:与缩容相似,扩容操作也会在上一次操作完成后等待一段时间,默认为3分钟。这个冷却时间可以减少因指标短暂波动而导致的频繁扩容,从而保持资源利用的高效性和系统的平稳运行。
上述参数通过调节kube-controller-manager
组件的启动参数来进行调整