HPA全称是Horizontal Pod Autoscaler,翻译成中文是POD水平自动伸缩,HPA可以基于CPU利用率对replication controller、deployment和replicaset中的pod数量进行自动扩缩容(除了CPU利用率也可以基于其他应程序提供的度量指标custom metrics进行自动扩缩容)。pod自动缩放不适用于无法缩放的对象,比如DaemonSets。
HPA由Kubernetes API资源和控制器实现。资源决定了控制器的行为。控制器会周期性的获取目标资源指标(如,平均CPU利用率),并与目标值相比较后来调整Pod副本数量。
下面进行示例说明:
1、创建测试Deployment
$ vi php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.cn-hangzhou.aliyuncs.com/abroad_images/hpa-example:latest
ports:
- containerPort: 80
resources:
limits:
cpu: 500m ##限制Pod CPU资源最多使用500m
requests:
cpu: 200m ##K8s要保证Pod使用的最小cpu资源为200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
应用YAML
$ k apply -f php-apache.yaml
2、安装merics-server,参考二进制方式安装k8s集群和kubeadm方式安装k8s集群
3、创建HPA
$ vi hpa-php-apache.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1 ##最小Pod数为1
maxReplicas: 10 ##最大Pod数为10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 ##当Pod的CPU使用率超过50%时,需要自动扩容
4、应用YAML
$ k apply -f hpa-php-apache.yaml
5、再开一个终端,模拟php-apache Pod CPU使用率增加
$ k run -i --tty load-generator --rm --image=registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox:latest --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
6、回到原来终端查看po,观察到随着CPU使用率增加,Pod的副本数随之也增加
$ while : ; do k get po | grep php-apache | wc -l; sleep 3; done
5
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 242%/50% 1 10 5 81m
7、停止模拟php-apache Pod CPU使用率增加后,继续回到原来终端查看po,观察到随着CPU使用率减少,Pod的副本数随之也减少
$ k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 6h41m
8、恢复
$ k delete -f hpa-php-apache.yaml
$ k delete -f php-apache.yaml