首页 > 解决方案 > 在 AWS Spot 实例上运行 k8s statefulset

问题描述

过去,我们在 AWS 按需/预留 ec2 实例上运行了一些有状态应用程序(例如数据库),现在我们正在考虑将这些应用程序移动到使用 PVC 的 k8s statefulset。

我的问题是,是否建议在现场实例上运行 k8s statefulset 以降低成本?由于我们可以使用 kube-spot-termination-notice-handler 在 Spot 实例终止之前 taint 节点以将 pod 移动到其他人,所以看起来应该没有问题,只要 statefulset 有多个副本以防止服务中断.

标签: amazon-web-serviceskubernetes

解决方案


这个问题可能没有唯一的答案:它实际上取决于您要运行的工作负载是什么,以及您的应用程序对故障的容忍度。当一个 Spot 实例被中断时(更高的出价者,没有更多可用的......),一个做得好的 StatefulSet 或任何其他合适的控制器确实会按预期完成它的工作,而且通常很快(几秒钟)。

但请注意,断言以下内容是错误的:

  • 您每次都会收到中断通知,
  • 并且通知总是会在 Spot 实例中断前 2 分钟发出

请参阅 AWS 文档本身https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html#using-spot-instances-managing-interruptions这是摘录“[...]您的 Spot 实例在警告可用之前终止”

所以真正的问题是:您的应用程序对未经准备的资源删除的容忍度如何?

如果您只有 2 个 EC2,每个 EC2 运行数百个 Pod,您很可能不想使用 Spot 实例,因为如果 2 个实例之一中断,您的服务将高度降级,直到一个新实例启动或 k8s 重新调度负载(假设另一个实例足够大)。数百个 EC2,每个都只有几个 pod,而且自动扩展规则略微过度配置?您不妨直接使用它并使用节省的现货成本!

您还需要仔细检查您的客户端行为:假设您在 k8s 上运行 API 并且 pod 在响应之前停止,请确保您的客户端处理该场景并触发另一个请求,或者至少优雅地失败。

但是您谈到了数据库:那么复制呢?它是快速和自动化的吗?是否有多个数据复制以允许 1 到 n 个副本丢失?

换句话说:它只需要一些良好的计划和大规模的彻底测试。好消息是它很容易做到:运行负载测试并自愿使实例崩溃,答案将在那里遇到!


推荐阅读