amazon-web-services - 在 AWS Spot 实例上运行 k8s statefulset
问题描述
过去,我们在 AWS 按需/预留 ec2 实例上运行了一些有状态应用程序(例如数据库),现在我们正在考虑将这些应用程序移动到使用 PVC 的 k8s statefulset。
我的问题是,是否建议在现场实例上运行 k8s statefulset 以降低成本?由于我们可以使用 kube-spot-termination-notice-handler 在 Spot 实例终止之前 taint 节点以将 pod 移动到其他人,所以看起来应该没有问题,只要 statefulset 有多个副本以防止服务中断.
解决方案
这个问题可能没有唯一的答案:它实际上取决于您要运行的工作负载是什么,以及您的应用程序对故障的容忍度。当一个 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 个副本丢失?
换句话说:它只需要一些良好的计划和大规模的彻底测试。好消息是它很容易做到:运行负载测试并自愿使实例崩溃,答案将在那里遇到!
推荐阅读
- java - 物体移动问题
- c++ - recv() 在非阻塞 tcp ip 套接字的对等断开时返回 -1
- python - Python:将嵌套列表旋转-90°
- html - 使用 flexbox 的联系表格 7 输入字段换行
- retrofit2 - 如何从 Okhttp 中的标头中删除异常
- javascript - 目标来源与收件人窗口的来源不匹配
- mysql - LB4 - 两列 concat 等于字符串的过滤器
- reactjs - 本土化。使用 React 还是 Spring Boot?
- php - Laravel 护照 7.5.1 - 复制声明
- excel - 这可以从excel工作表中操作oracle数据库吗