Horizontal Pod Autoscaling(Pod水平自动伸缩),简称HPA。HAP通过监控分析RC或者Deployment控制的所有Pod的负载变化情况来确定是否需要调整Pod的副本数量,这是HPA最基本的原理。

在kubernetes集群中被设计成一个controller,我们可以简单的通过kubectl autoscale命令来创建一个HPA资源对象,HPA Controller默认30s轮询一次(可通过kube-controller-manager的标志--horizontal-pod-autoscaler-sync-period进行设置),查询指定的资源(RC或者Deployment)中Pod的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能。

创建了HPA后,HPA会获取每个Pod利用率或原始值的平均值,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值并进行相应的操作。

实例

安装metrics-server

kubectl apply -f https://addons.kuboard.cn/metrics-server/0.3.7/metrics-server.yaml

制作镜像

vim Dockerfile

FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php

vim index.php

<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>

docker build -t eipsample/hpa-example .

编写YAML文件

vim test.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: eipsample/hpa-example
imagePullPolicy: Never
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache

kubectl apply -f test.yaml

创建Horizontal Pod Autoscaler

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 #php-apache Deployment 在 1 到 10 个副本之间伸缩,使得所有 Pod 的平均 CPU 利用率维持在 50% 左右

kubectl get hpa

增加负荷

kubectl run -it --rm load-generator --image=busybox /bin/sh

while true; do wget -q -O- http://php-apache; done

观察CPU利用率

kubectl get hpa

查看副本数

kubectl get deployment php-apache