HorizontalPodAutoscaler使用示例
HorizontalPodAutoscaler(简称 HPA ) 自动更新工作负载资源(例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。
水平扩缩意味着对增加的负载的响应是部署更多的 Pod。 这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。
如果负载减少,并且 Pod 的数量高于配置的最小值, HorizontalPodAutoscaler 会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减。
本文档将引导你完成启用 HorizontalPodAutoscaler 以自动管理示例 Web 应用程序的扩缩的示例。 此示例工作负载是 运行一些 PHP 代码的 Apache httpd。
前提准备
你的 Kubernetes 服务器版本必须不低于版本 1.23. 要获知版本信息,请输入 kubectl version.
按照本演练进行操作,你需要一个部署并配置了 Metrics Server 的集群。 Kubernetes Metrics Server 从集群中的 kubelets 收集资源指标, 并通过 Kubernetes API 公开这些指标, 使用 APIService 添加代表指标读数的新资源。
要了解如何部署 Metrics Server,请参阅 metrics-server 文档。
运行 php-apache 服务器并暴露服务
为了演示 HorizontalPodAutoscaler,你将首先启动一个 Deployment 用 hpa-example 镜像运行一个容器, 然后使用以下清单文件将其暴露为一个 服务(Service):
cat > php-apache.yaml << EOF
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.k8s.io/hpa-example
image: uhub.service.ucloud.cn/996.icu/hpa-example:latest
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
EOF
创建
kubectl apply -f php-apache.yaml
查看,会创建名为 php-apache 的 deployment 和 service
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/php-apache-6d9d9dd4fb-5hmwb 1/1 Running 0 76s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/php-apache ClusterIP 10.96.106.148 <none> 80/TCP 76s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/php-apache 1/1 1 1 76s
NAME DESIRED CURRENT READY AGE
replicaset.apps/php-apache-6d9d9dd4fb 1 1 1 76s
创建 HorizontalPodAutoscaler
现在服务器正在运行,使用 kubectl 创建自动扩缩器。 kubectl autoscale 子命令是 kubectl 的一部分, 可以帮助你执行此操作。
你将很快运行一个创建 HorizontalPodAutoscaler 的命令, 该 HorizontalPodAutoscaler 维护由你在这些说明的第一步中创建的 php-apache Deployment 控制的 Pod 存在 1 到 10 个副本。
粗略地说,HPA 控制器将增加和减少副本的数量 (通过更新 Deployment)以保持所有 Pod 的平均 CPU 利用率为 50%。 Deployment 然后更新 ReplicaSet —— 这是所有 Deployment 在 Kubernetes 中工作方式的一部分 —— 然后 ReplicaSet 根据其 .spec 的更改添加或删除 Pod。
由于每个 Pod 通过 kubectl run 请求 200 milli-cores,这意味着平均 CPU 使用率为 100 milli-cores。 有关算法的更多详细信息, 请参阅算法详细信息。
创建 HorizontalPodAutoscaler:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
查看hpa
# 可以使用 hpa 或 horizontalpodautoscaler 任何一个名字都可以
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 26s
请注意当前的 CPU 利用率是 0%,这是由于我们尚未发送任何请求到服务器 (TARGET 列显示了相应 Deployment 所控制的所有 Pod 的平均 CPU 利用率)。
增加负载
接下来,看看自动扩缩器如何对增加的负载做出反应。 为此,你将启动一个不同的 Pod 作为客户端。 客户端 Pod 中的容器在无限循环中运行,向 php-apache 服务发送查询。
# 在新的终端中运行
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
一分钟时间左右之后,通过以下命令,我们可以看到 CPU 负载升高了;例如:
$ kubectl get hpa php-apache --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 240%/50% 1 10 4 4m2s
此时查看pod,可以看到pod数量已经增多了
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
load-generator 1/1 Running 0 74s
php-apache-6d9d9dd4fb-2ldl9 1/1 Running 0 44s
php-apache-6d9d9dd4fb-5hmwb 1/1 Running 0 13m
php-apache-6d9d9dd4fb-9frdd 1/1 Running 0 44s
php-apache-6d9d9dd4fb-fspqt 1/1 Running 0 29s
php-apache-6d9d9dd4fb-nb8z9 1/1 Running 0 44s
查看deployment
$ kubectl get deployment php-apache
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 7/7 7 7 14m
查看hpa
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 44%/50% 1 10 7 5m34s
可以看到deployment中的副本数量和hpa中的副本数量相同
:::tip说明
有时最终副本的数量可能需要几分钟才能稳定下来。由于环境的差异, 不同环境中最终的副本数量可能与本示例中的数量不同。
:::
停止产生负载
在我们创建 busybox 容器的终端中,输入 <Ctrl> + C 来终止负载的产生。
持续查看hpa,可以看到一段时间后,由于我们手动停止了 busybox 容器,因此负载会降为0
$ kubectl get hpa php-apache --watch
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 240%/50% 1 10 4 4m2s
php-apache Deployment/php-apache 76%/50% 1 10 5 4m15s
php-apache Deployment/php-apache 57%/50% 1 10 5 4m30s
php-apache Deployment/php-apache 64%/50% 1 10 6 4m46s
php-apache Deployment/php-apache 57%/50% 1 10 6 5m1s
php-apache Deployment/php-apache 55%/50% 1 10 7 5m16s
php-apache Deployment/php-apache 44%/50% 1 10 7 5m31s
php-apache Deployment/php-apache 47%/50% 1 10 7 5m46s
php-apache Deployment/php-apache 47%/50% 1 10 7 6m1s
php-apache Deployment/php-apache 46%/50% 1 10 7 6m16s
php-apache Deployment/php-apache 42%/50% 1 10 7 6m31s
php-apache Deployment/php-apache 50%/50% 1 10 7 6m46s
php-apache Deployment/php-apache 10%/50% 1 10 7 7m1s
php-apache Deployment/php-apache 0%/50% 1 10 7 7m16s
查看deployment,一旦 CPU 利用率降至 0,HPA 会自动将副本数缩减为 1。
$ kubectl get deployment php-apache
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 1/1 1 1 24m