Kubernetes HorizontalPodAutoscaler 实战演练:自动扩缩应用实例
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
前言
在现代云原生应用中,自动扩缩是一个核心功能,它能够根据应用负载动态调整资源分配。Kubernetes 提供了 HorizontalPodAutoscaler(HPA)这一强大工具,可以自动调整工作负载(如 Deployment 或 StatefulSet)的 Pod 数量,以匹配不断变化的负载需求。
本文将带你深入了解 HPA 的工作原理,并通过一个完整的实战演练展示如何为 PHP+Apache 应用配置和使用 HPA。
HPA 基础概念
水平扩缩 vs 垂直扩缩
- 水平扩缩(Horizontal Scaling):通过增加或减少 Pod 数量来应对负载变化
- 垂直扩缩(Vertical Scaling):通过调整单个 Pod 的资源(CPU/内存)分配来应对负载变化
Kubernetes 的 HPA 实现了水平扩缩,这种方式通常比垂直扩缩更灵活可靠。
HPA 工作原理
HPA 控制器定期(默认每15秒)检查目标工作负载的度量指标,并根据预定义的规则计算所需的 Pod 数量。它会:
- 从 Metrics Server 获取当前度量值
- 与用户定义的目标值比较
- 计算需要调整的副本数量
- 更新工作负载的副本数
环境准备
在开始演练前,请确保:
- 运行 Kubernetes 1.23 或更高版本
- 已安装 Metrics Server(用于收集资源指标)
- 如果使用 Minikube,执行
minikube addons enable metrics-server
实战演练
第一步:部署示例应用
我们使用一个运行 PHP 代码的 Apache 服务器作为示例应用:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
应用这个配置:
kubectl apply -f php-apache.yaml
第二步:创建 HPA
现在为这个 Deployment 创建 HPA:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
这个命令创建了一个 HPA,它会:
- 监控 php-apache Deployment
- 保持 CPU 平均利用率在 50% 左右
- Pod 数量在 1 到 10 个之间自动调整
第三步:验证初始状态
检查 HPA 状态:
kubectl get hpa php-apache
初始状态应显示 CPU 利用率为 0%,因为还没有负载。
第四步:生成负载
在另一个终端中运行负载生成器:
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"
第五步:观察扩缩过程
观察 HPA 如何响应增加的负载:
kubectl get hpa php-apache --watch
你会看到 CPU 利用率上升,随后 HPA 开始增加 Pod 数量。
第六步:停止负载并观察缩容
按 Ctrl+C 停止负载生成器,观察 HPA 如何减少 Pod 数量。
高级配置
多指标扩缩
HPA 支持基于多个指标进行扩缩决策。例如,你可以同时基于 CPU 和内存利用率进行扩缩:
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 50
自定义指标
HPA 还支持 Pod 指标和对象指标等自定义指标:
metrics:
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
- type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route
target:
type: Value
value: 10k
最佳实践
- 合理设置资源请求:HPA 基于资源请求计算利用率,确保设置合理的 requests 值
- 选择合适的度量指标:根据应用特点选择 CPU、内存或自定义指标
- 设置合理的边界:避免 minReplicas 过小或 maxReplicas 过大
- 考虑冷却时间:频繁扩缩可能导致系统不稳定
- 监控 HPA 行为:定期检查 HPA 决策是否符合预期
总结
通过本文的实战演练,你应该已经掌握了:
- 如何为 Deployment 创建 HPA
- HPA 如何根据 CPU 利用率自动扩缩
- 如何基于多个指标和自定义指标进行扩缩
- HPA 的最佳实践
HPA 是 Kubernetes 自动化的核心组件之一,合理使用可以显著提高资源利用率和应用可用性。建议在实际生产环境中结合监控告警系统,持续优化 HPA 配置。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考