为什么需要自动伸缩?

在云计算环境中,业务负载往往波动频繁。手动调整资源不仅效率低,还容易造成资源浪费或性能瓶颈。Kubernetes提供了强大的自动伸缩能力,包括Pod级别的HPA(Horizontal Pod Autoscaler)和节点级别的Cluster Autoscaler,让集群根据实际负载自动调整资源,实现成本与性能的最佳平衡。

准备工作

开始之前,请确保你已具备以下条件:

  • 一个运行中的Kubernetes集群(版本≥1.18)
  • kubectl命令行工具已配置
  • 集群已安装Metrics Server(用于获取资源指标)

安装Metrics Server的命令:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

步骤1:启用HPA(Pod水平自动伸缩)

HPA根据CPU、内存等指标自动调整Deployment的副本数。首先,创建一个测试Deployment:

cat <

步骤2:创建HPA策略

执行以下命令创建HPA,目标CPU使用率为50%,副本数范围2-10:

kubectl autoscale deployment nginx-demo --cpu-percent=50 --min=2 --max=10

或者使用YAML文件更精细地配置:

cat <

步骤3:验证HPA工作

查看HPA状态:

kubectl get hpa

输出示例:

NAME             REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-demo-hpa   Deployment/nginx-demo   0%/50%    2         10        2          1m

模拟负载测试(需先安装压测工具):

kubectl run -i --tty load-generator --rm --image=busybox /bin/sh -c 'while true; do wget -q -O- http://nginx-demo-service; done'

等待几分钟后再次查看,副本数会自动增加。

步骤4:配置Cluster Autoscaler(节点自动伸缩)

HPA只能调整Pod数量,当集群资源不足时,需要Cluster Autoscaler自动增加节点。以AWS为例(其他云平台类似):

# 使用eksctl启用集群自动伸缩
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml

# 修改集群名称和region(替换为你的集群信息)
kubectl -n kube-system edit deployment cluster-autoscaler
# 在command中添加:
# - --nodes=1:5:your-asg-name

对于自建集群,可以使用以下YAML部署:

cat <

步骤5:组合使用与优化建议

生产环境建议同时启用HPA和Cluster Autoscaler:

  1. HPA负责Pod数量的增减,响应快(分钟级)
  2. Cluster Autoscaler负责节点数量的调整,响应较慢(5-10分钟)

优化建议:

  • 为每个工作负载设置合理的requests和limits,避免资源浪费
  • 使用自定义指标(如QPS、延迟)扩展HPA,更贴合业务
  • 为Cluster Autoscaler设置缩容保护,避免频繁启停节点
  • 监控伸缩事件,使用kubectl describe hpa查看历史记录

总结

通过以上步骤,你的Kubernetes集群已经具备自动伸缩能力。合理配置HPA和Cluster Autoscaler,可以显著提升资源利用率,节省云成本。建议先在测试环境验证,再逐步应用到生产。天亿互联技术团队持续分享云计算实战经验,助你高效运维。