什么是HPA
Pod 水平自动伸缩(Horizontal Pod Autoscaler)特性,可以基于CPU利用率自动伸缩 replication controller、deployment和 replica set 中的 pod 数量。(除了 CPU 利用率)也可以基于其他应程序提供的度量指标custom metrics。 pod 自动缩放不适用于无法缩放的对象,比如 DaemonSets。
原理
Pod 水平自动伸缩的实现是一个控制循环,由 controller manager 的 --horizontal-pod-autoscaler-sync-period 参数 指定周期(默认值为15秒)。
每个周期内,controller manager 根据每个 HorizontalPodAutoscaler 定义中指定的指标查询资源利用率。 controller manager 可以从 resource metrics API(每个pod 资源指标)和 custom metrics API(其他指标)获取指标。
HorizontalPodAutoscaler 是 Kubernetes autoscaling API 组的资源。 在当前稳定版本(autoscaling/v1)中只支持基于CPU指标的缩放。
在 beta 版本(autoscaling/v2beta2),引入了基于内存和自定义指标的缩放。 在autoscaling/v2beta2版本中新引入的字段在autoscaling/v1版本中基于 annotation 实现。
更多介绍及算法细节请参见官方文档。
使用
部署metrics-server
将metrics-server部署到集群中,用来监控集群资源的使用情况。
编写一个CPU密集型计算方法
public String compute() {
double d = 0.0001;
for (int i = 0; i < 100000000; i++) {
d += Math.sqrt(d);
}
return "OK:" + d;
}
创建Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-demo
labels:
app: jenkins-demo
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-demo
template:
metadata:
labels:
app: jenkins-demo
spec:
containers:
- name: jenkins-demo
image: {imagePath}
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
cpu: "200m"
一定要指定
resources.requests,否则HPA不会生效。
创建HPA
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-jenkinsdemo
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: jenkins-demo
minReplicas: 1
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
scaleTargetRef指定需要自动伸缩的对象,minReplicas和maxReplicas分别指定伸缩的最大最小值,metrics指定伸缩参考值,这里定义的是CPU使用率超过设定值(Deployment中的设定值)的50%即进行伸缩。

注意,如果显示为<unknowm>,首先检查是否成功安装了metrics-server,如果已安装成功,尝试在metrics-server启动参数中增加以下参数:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
增加负载
while true; do wget -q -O- http://{HOST}/hpa/compute; done
一段时间后可以看到负载增加:


停止请求,负载降低,一段时间(默认五分钟)后pod逐渐被回收。