预约咨询 提交工单

掌握云容量自动伸缩:成本高效的Kubernetes运维实践

学习如何使用Kubernetes HPA、VPA和Cluster Autoscaler将云自动伸缩与成本运营对接,包括实用命令、风险控制和回滚策略。

掌握云容量自动伸缩:成本高效的Kubernetes运维实践
Cloud Migration 8min 7 浏览 2026-08-10
KubernetesSRE

掌握云容量自动伸缩:成本高效的Kubernetes运维实践

引言

迁移到云通常意味着弹性的承诺——只为使用的资源付费。然而,许多组织在迁移到Kubernetes后发现云账单飙升。为什么?因为自动伸缩配置不当,或未与成本治理对齐。本文通过一个真实的云容量自动伸缩场景,从症状到解决方案,使用Kubernetes原生工具和云提供商集成进行阐述。

场景

您正在使用AWS运行一个大型电子商务平台,使用Amazon EKS。在从虚拟机迁移的初期,启用了Kubernetes Horizontal Pod Autoscaler(HPA)和Cluster Autoscaler。在闪购期间流量激增,但也有平静期。两个月后,云账单比原来的静态基础设施高出40%,尽管集群平均CPU利用率低于15%。您怀疑过度配置和低效的伸缩决策。

症状

  1. 云支出过高:每月AWS账单显示EC2成本高,尤其是经常空闲的实例。
  2. 资源利用率低kubectl top nodes显示大部分节点在大多数时间CPU和内存利用率低于20%。
  3. 伸缩抖动:Cluster Autoscaler频繁添加和移除节点,导致按小时计费的EC2浪费。
  4. 对负载响应慢:在小型流量突发期间,HPA等待过久才能扩展Pod,导致延迟峰值。
  5. Spot实例中断:如果使用Spot实例,频繁替换会影响批处理作业。

诊断

首先检查当前自动伸缩配置:

# 检查节点资源使用
kubectl top nodes

# 列出所有HPA配置
kubectl get hpa --all-namespaces

# 获取特定HPA的详细信息
kubectl describe hpa -n <namespace> <hpa-name>

# 检查Cluster Autoscaler状态(如果作为Pod部署)
kubectl get pods -n kube-system -l app=cluster-autoscaler
kubectl logs -n kube-system deployment/cluster-autoscaler --tail=50

在我们的场景中,我们发现了以下问题:

  • HPA设置为基于CPU目标70%进行伸缩,但应用程序的CPU使用是突发性的,与实际负载(如批处理)不相关。
  • HPA的minReplicas为10,maxReplicas为50,但即使在最小值,集群总容量也很大,导致平均利用率低。
  • Cluster Autoscaler配置为从3扩展到20个节点,但使用scale-down-utilization-threshold为0.5(50%),意味着节点利用率低于50%且持续一段时间才缩容,导致无法及时缩容。

同时,检查CloudWatch指标,将伸缩事件与成本关联:

# 使用AWS CLI获取EKS集群中的EC2实例列表
aws ec2 describe-instances --filters "Name=tag:eks:cluster-name,Values=<cluster-name>" --query "Reservations[*].Instances[*].{ID:InstanceId,Type:InstanceType,LaunchTime:LaunchTime}" --output table

检查AWS Auto Scaling组中的伸缩历史:

aws autoscaling describe-scaling-activities --auto-scaling-group-name <asg-name> --max-items 10

这将显示节点是否过于频繁地添加和移除。

命令与解决方案

基于诊断,我们实施多层修复。

1. 正确定制HPA

从仅使用CPU指标转向使用与业务负载一致的自定义或外部指标。对于电子商务应用,考虑基于每秒请求数(RPS)或队列长度进行伸缩。使用Kubernetes Metrics Server和Prometheus Adapter。

示例:安装Prometheus Adapter并基于RPS创建HPA:

# 假设您有来自Ingress Controller的RPS外部指标
kubectl create hpa my-app --from=custom-metric:nginx_ingress_controller_requests_per_second --target=1000 --min=5 --max=20

或编辑现有HPA:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app
spec:
  minReplicas: 5
  maxReplicas: 20
  metrics:
  - type: External
    external:
      metric:
        name: nginx_ingress_controller_requests_per_second
      target:
        type: AverageValue
        averageValue: "1000"

2. 调整Cluster Autoscaler

更新Cluster Autoscaler部署,允许更快的缩容并尊重Pod中断预算。

在AWS中,如果您在EKS上使用CA,请编辑部署:

kubectl edit deployment/cluster-autoscaler -n kube-system

关键参数:

  • --scale-down-utilization-threshold=0.35 – 仅当节点利用率低于35%时缩容。
  • --scale-down-delay-after-add=10m – 添加节点后等待10分钟再考虑移除。
  • --max-nodes-total=50 – 防止失控扩展。

3. 实施Vertical Pod Autoscaler(VPA)进行早期调优

在稳定基于负载的自动伸缩之前,使用VPA的推荐模式来正确设置Pod的requests和limits。这能减少浪费并改善装箱。

kubectl apply -f - <<EOF
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Auto"
  recommenders:
  - name: VPAReccomender
EOF

4. 对有状态工作负载使用Spot实例以节省成本

为节省成本,配置单独的节点组使用Spot实例。使用nodeSelectors和taints将有状态工作负载调度到那里。确保您的集群自动伸缩器能够多样化实例类型。

5. 设置预算警报

使用AWS Budgets监控支出。创建预算并设置警报阈值,例如预计金额的80%。

风险控制

  • Pod中断预算(PDB):确保缩容不会中断关键服务。为工作负载定义PDB。
  • 就绪门控:延迟Pod删除直到Pod准备好接收流量。
  • 优雅关闭:实现preStop钩子以处理排空。
  • 渐进式发布:首先在预发环境测试自动伸缩更改。
  • 限制CPU和内存:设置资源限制,防止容器消耗所有节点资源。

回滚

如果新配置引起问题,您可以快速恢复到之前的状态。

  • 对于HPA更改,使用之前的YAML文件kubectl apply -f,或直接编辑回来。
  • 对于Cluster Autoscaler,恢复部署参数。
  • 对于VPA,删除VPA对象并更新部署到之前的requests/limits。

确保将清单备份在Git中。

验证

实施更改后,监控一周:

  • 检查云成本是否下降。使用AWS Cost Explorer比较之前/之后。
  • 验证集群利用率:kubectl top nodes应显示更高的平均利用率(40-60%)。
  • 查看HPA事件和Cluster Autoscaler日志,确保没有抖动。
  • 确认应用延迟和错误率保持稳定。

命令:

kubectl get hpa --all-namespaces
kubectl get vpa --all-namespaces
kubectl logs -n kube-system deployment/cluster-autoscaler --tail=50
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name CPUUtilization --dimensions Name=InstanceId,Value=<instance-id> --start-time <date> --end-time <date> --period 86400 --statistics Average

何时提交OpsGlobal工单

自动伸缩配置错误可能每月造成数千美元的损失。如果您遇到以下情况,是时候让OpsGlobal的SRE专家介入:

  • 复杂、多工作负载的自动伸缩,并存在相互依赖的服务。
  • 自定义指标集成(Prometheus、CloudWatch、Datadog)和自动伸缩策略。
  • 跨多个云账户的成本治理和FinOps对齐。
  • 需要24/7监控和主动事件响应来处理伸缩相关故障。
  • 您需要第二双眼睛审视生产集群。

OpsGlobal可以审计您当前的设置,实施最佳实践,并监控您的基础设施,让您专注于构建产品。

结论

自动伸缩不是“设置后忽略”的操作。它需要持续调整,并与成本运营对齐。通过正确定制HPA、调整集群自动伸缩器、使用VPA和实施预算警报,您可以实现弹性和成本效率。记住始终有回滚计划,并在复杂性超出团队能力时寻求专家帮助。

适用场景

适合正在处理 Cloud Migration、Kubernetes, SRE 相关问题的团队,用于快速建立排查路径和交付标准。

问题背景

学习如何使用Kubernetes HPA、VPA和Cluster Autoscaler将云自动伸缩与成本运营对接,包括实用命令、风险控制和回滚策略。

排查步骤

先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。

命令示例

示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。

风险说明

生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。

回滚方案

保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。

交付清单

问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。

!

遇到类似技术问题?

如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。

工单 WhatsApp 联系 咨询