本文将要使用一个基于 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!";
?>
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
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
kubectl run -it --rm load-generator --image=busybox /bin/sh
while true; do wget -q -O- http://php-apache; done
kubectl get hpa
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
kubectl get deployment php-apache
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 7/7 7 7 19m
在 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。
注意
自动伸缩的过程可能需要持续几分钟才能完成。