>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Go

如何停止为云服务多付钱,开始使用 Kubernetes Autoscaler

想象一下:你发起了一场广告活动,流量激增,Kubernetes 中的 Pod 开始在负载下"窒息"。或者反过来:夜幕降临,用户们都在睡觉,但云中仍有数十个昂贵的实例在运转,消耗着公司的预算。听起来很熟悉?

通常在这样的时刻,人们会想起自动扩缩容。在 Kubernetes 生态系统中,这由 kubernetes/autoscaler 仓库处理。它不仅仅是一个单一的实用工具,而是一整套工具,帮助集群随着负载"呼吸"。我决定弄清楚里面有什么,以及为什么它是任何生产环境的必备工具。

里面有什么

该仓库包含三个主要组件。每个组件解决各自特定的任务,但人们经常将它们混淆。

Cluster Autoscaler:当"硬件"不足时

这可能是该套件中最受欢迎的工具。它的任务很简单:如果集群中出现因资源不足而无法启动的 Pod(Pending 状态),Cluster Autoscaler 会联系云服务商,请求添加新节点。

它也可以反向工作。如果某个节点长时间处于半空状态,且其 Pod 可以安全地迁移到其他节点,自动扩缩容器将移除多余的硬件。这是直接的成本节省,尤其是在 AWS、GCP 或 Azure 上。

Vertical Pod Autoscaler (VPA):资源调优的魔法

如果说 Cluster Autoscaler 改变节点数量,那么 VPA 改变的是 Pod 本身的"大小"。通常开发者是凭感觉设置 requestslimits。结果要么是应用程序因 OutOfMemory 崩溃,要么我们预留了 2 GB 内存而实际只需要 200 MB。

VPA 监控实际资源消耗并自动调整限制。该项目目前处于 beta 状态,但它已经做了一件非常酷的事情——推荐模式。你只需观察它建议设置什么资源,而不必信任它自动重启 Pod。

Addon Resizer:系统服务的微观管理

这是垂直自动扩缩容的简化版本。它用于资源消耗随集群规模线性增长的服务。例如,如果你有 100 个节点而不是 10 个,metrics server 需要更多内存。Addon Resizer 监控节点数量并相应地扩缩这类辅助组件。

实际工作原理

假设你正在使用 Go。要在本地开始使用项目代码,你需要遵循 Kubernetes 惯用的路径结构。代码应该放在 k8s.io 中,而不是 github.com 中。

有趣的是:Cluster Autoscaler 支持数十种提供商。不仅有 AWS 这样的巨头,还有针对裸机或本地集群的特定解决方案。如果你正在构建自己的云服务,你需要实现 CloudProvider 接口,你的集群也将学会自动扩缩容。

为什么这对开发者很重要

许多人认为自动扩缩容是 DevOps 工程师的工作。实际上,了解 vertical-pod-autoscaler 的工作原理会让后端开发者的生活轻松很多。

  1. 你可以告别配置资源时的猜测。
  2. 应用程序对突发流量高峰的抵抗力变得更强。
  3. 你可以看到代码的真实内存和 CPU 消耗情况。

顺便说一句,该仓库包含用于快速安装的官方 Helm charts。这比手动部署 manifest 方便得多。

现在应该采用吗?

如果你在云环境中工作,而且基础设施账单在不断增长,那么 Cluster Autoscaler 是基础。它在运行后的第一个月内就能收回设置时间成本。

Vertical Pod Autoscaler 的情况更复杂。由于它会重启 Pod 来更改资源(直到 K8s 获得适当的原地资源更新),需要谨慎使用。我建议从 Recommender 模式开始。你会得到一份资源优化建议列表,但 VPA 不会触碰任何东西。

这个项目充满活力,得到了庞大社区的支持(近 9,000 颗星和数千个分支)。如果你有问题,Kubernetes Slack 频道 #sig-autoscaling 的人们很活跃。

所以如果你的集群仍然是静态的——看看这个仓库。是时候让云为你服务,而不是与你为敌了。

相关项目