1. 构建镜像
本文将要使用一个基于 php-apache 镜像自定义的 docker 镜像来演示 HorizontalPodAutoscaler。Dockerfile 如下所示:
FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php
其中 index.php 文件的内容如下所示,该 php 页面执行了一些大量消耗 CPU 的计算:
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>
2. 使用下面的 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: 上面的镜像
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
3. 创建 Horizontal Pod Autoscaler
php-apache 服务启动以后,现在可以使用 kubectl autoscale (opens new window)指令来创建 Autoscaler。下面的指令创建了一个 HorizontalPodAutoscaler,该 Autoscaler 使得我们在前一个步骤中创建的 php-apache Deployment 在 1 到 10 个副本之间伸缩。大致上,HPA 在通过增加或减少 Deployment 的副本数,以使得所有 Pod 的平均 CPU 利用率维持在 50% 左右(每个 Pod 的 CPU Request 是 200 milli-cores,即平均 CPU 利用率应该是 100 milli-cores)。。
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
执行下面的指令,可以查看当前 HPA 的状态
kubectl get hpa
输出结果如下所示:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
- 请注意,当前 CPU 的消耗是 0%,因为我们尚未向 php-apache 服务发送任何请求;
- TARGET 这一列展示了 Deployment 中所有 Pod 的平均 CPU 利用率。
4. 增加负荷
- 启动了一个容器,并进入该容器的命令行终端:
kubectl run -it --rm load-generator --image=busybox /bin/sh
- 在容器命令行中输入如下脚本,并回车:
- 该脚本向 php-apache 服务无限循环地发送查询请求:
while true; do wget -q -O- http://php-apache; done
- 大约 1 分钟左右,我们可以通过指令观察到较高的 CPU 利用率;
kubectl get hpa
- 输出如下:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
- 此时,CPU 利用率增加到了 CPU 请求的 305%。对应的,HPA 将 Deployment 的副本数调整到 7:
kubectl get deployment php-apache
- 输出如下:
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 7/7 7 7 19m
5. 撤销负荷
在 load-generator 终端界面中输入组合键 + c 可以终止模拟的用户请求。此后,php-apache 服务的 CPU 利用率将持续下降到 0。
执行以下指令可以观察到这个变化的过程:
watch "kubectl get hpa && echo && kubectl get deployment php-apache"
一分钟左右,最终的输出结果如下:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 11m
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 1/1 1 1 27m
此时,CPU 利用率降低到 0,因此 HPA 将副本数自动地将副本数向下伸缩到 1。
注意
自动伸缩的过程可能需要持续几分钟才能完成。