案例设计:使用stress工具模拟压力的自动伸缩
这个案例的思路非常简单:
- 部署一个应用:这个应用有一个特点,就是可以人为地控制它消耗多少 CPU。
- 配置自动伸缩策略:告诉 Kubernetes,当这个应用的 CPU 使用率超过 50% 时,就增加副本数量;当使用率降下来时,就减少副本数量。
- 制造压力:我们手动给这个应用制造 CPU 压力,模拟线上流量暴增的场景。
- 观察效果:实时观察 Pod 数量的变化,直观地看到自动伸缩在起作用。
案例设计:使用 stress 工具模拟压力的自动伸缩
我们将部署一个包含 stress 命令行工具的容器,然后通过 Horizontal Pod Autoscaler 来管理它的副本数。
第一步:部署测试应用
创建一个名为 hpa-demo.yaml 的部署文件。
apiVersion: apps/v1
kind: Deployment
metadata:name: hpa-stress-demo
spec:selector:matchLabels:app: hpa-stress-demotemplate:metadata:labels:app: hpa-stress-demospec:containers:- name: stress-containerimage: polinux/stress # 一个包含 stress 工具的小型镜像resources:requests:cpu: 100m # 重要!每个 Pod 请求 0.1 核 CPUmemory: 64Milimits:cpu: 200m # 限制最大使用 0.2 核 CPUmemory: 128Micommand: ["stress"] # 启动时不带参数,默认不产生压力args: ["--vm", "1", "--vm-bytes", "64M", "--vm-hang", "0"]# 上面的参数是占位符,我们稍后会通过 exec 进入容器手动执行 stress 命令
应用这个部署:
kubectl apply -f hpa-demo.yaml
第二步:创建 Horizontal Pod Autoscaler
现在,我们为这个部署创建 HPA 策略。目标 CPU 利用率设置为 50%,最小副本数为 1,最大副本数为 5。
kubectl autoscale deployment hpa-stress-demo --cpu-percent=50 --min=1 --max=5
验证 HPA 创建成功:
kubectl get hpa
你应该能看到类似下面的输出,初始的 CPU 使用率通常是 <unknown> 或很低。
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-stress-demo Deployment/hpa-stress-demo 0%/50% 1 5 1 30s
第三步:开启终端观察(非常重要!)
为了直观地看到 Pod 数量的变化,我们需要在一个单独的终端窗口实时观察。
打开一个新的终端,执行以下命令:
# 观察 HPA 状态的变化
watch kubectl get hpa# 或者,直接观察 Pod 数量的变化,这个更直观
watch kubectl get pods -l app=hpa-stress-demo
现在,这个窗口会每两秒刷新一次,让你能实时看到变化。
第四步:制造 CPU 压力(核心步骤)
现在回到原来的终端,我们开始给应用制造压力。
-
首先,获取正在运行的 Pod 名称:
kubectl get pods -l app=hpa-stress-demo输出类似:
hpa-stress-demo-7cbbd6f6d8-abcde -
进入这个 Pod 的容器内部:
kubectl exec -it <你的-pod-名称> -- /bin/sh例如:
kubectl exec -it hpa-stress-demo-7cbbd6f6d8-abcde -- /bin/sh -
在容器内部,使用
stress工具制造 CPU 压力:
我们启动两个 worker (--cpu 2) 来全力占用 CPU。stress --cpu 2 --timeout 600s这个命令会启动 2 个进程,持续计算 600 秒(10分钟),足够我们观察效果。
第五步:观察自动伸缩的奇迹
现在,请立刻将注意力转移到你刚才打开的 观察终端。
你将看到如下过程:
-
几十秒后:HPA 收集到最新的 CPU 指标。你会发现
TARGETS从0%猛增到200%以上(因为我们用 2 个进程去压一个只请求了 0.1 核的 Pod,使用率很容易超过 100%)。NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-stress-demo Deployment/hpa-stress-demo 225%/50% 1 5 1 2m -
再过一分钟左右:Kubernetes 开始行动了!你会发现
REPLICAS数量开始增加,从 1 变成 2,然后变成 3,最终可能会达到最大值 5。NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-stress-demo Deployment/hpa-stress-demo 115%/50% 1 5 4 4m同时,在观察 Pod 的窗口,你会看到新的 Pod 被不断地创建出来,状态从
Pending变为ContainerCreating,最后变为Running。
第六步:停止压力,观察收缩
为了看到完整的伸缩循环,我们现在停止制造压力。
- 在
stress命令运行的终端,按Ctrl + C停止压力进程。或者直接退出容器(输入exit)。 - 再次回到 观察终端。
你将看到:
- CPU 使用率
TARGETS会迅速下降到0%左右。 - 等待大约 5分钟(默认的缩容冷却时间),Kubernetes 会开始逐步减少副本数量,从 5 -> 4 -> 3 … 最终回到最小值 1。
清理资源
实验结束后,记得清理创建的资源:
kubectl delete deployment hpa-stress-demo
kubectl delete hpa hpa-stress-demo
# 或者直接删除文件
kubectl delete -f hpa-demo.yaml
总结
通过这个案例,你直观地体验了 Kubernetes HPA 的完整工作流程:
- 监控:HPA 通过 Metrics Server 持续监控 Pod 的 CPU 使用率。
- 判断:将实时使用率与你设定的目标值(50%)进行比较。
- 执行:通过调整 Deployment 的
replicas字段,实现 Pod 的自动扩缩。 - 冷却机制:扩容是立即的,但缩容会有延迟,以防止副本数量抖动。
这个案例是理解自动伸缩原理的最佳入门方式。在实际生产环境中,你可以将其替换为任何真正的业务应用,并根据内存、自定义指标甚至外部指标(如 QPS)来进行自动伸缩。
