amazon-web-services - 在 AWS 现货实例上运行 k8s statefulset

标签 amazon-web-services kubernetes

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

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

最佳答案

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

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

  • 您每次都会收到中断通知,
  • 并且通知始终会在 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重新分派(dispatch)负载(假设另一个实例足够大)。数百个 EC2,每个 pod 很少,并且自动缩放规则稍微过度配置?您不妨直接使用并节省现货成本!

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

但是您谈到了数据库:那么复制怎么样?它快速且自动化吗?是否存在数据的多个副本以允许 1 到 n 副本丢失?..

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

关于amazon-web-services - 在 AWS 现货实例上运行 k8s statefulset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53551226/

相关文章:

python - 使用 amazon api 和 python

java - 无法在 AWS Ubuntu 实例上运行 Cassandra

docker - 如何正确启动OpenShift v3应用

azure - azure kubernetes 集群的垂直扩展

amazon-web-services - 转到AWS Lambda:事件在哪里?

amazon-web-services - 如何在 AWS Lambda 函数中获取经过 Cognito 身份验证的用户信息?

amazon-web-services - aws s3 put 方法参数由 goamz

kubernetes - Kubernetes不断杀死并重建最后一个Pod

elasticsearch - Fluentd似乎正在工作,但是在Kibana中没有日志

kubernetes - 服务之间的间歇性 "connection refused"