K8S - 如何避免 Kubernetes 上同时出现单体副本/确保单体应用程序的部署中始终只有一个 pod 运行

问题描述 投票:0回答:1

部署在 Kubernetes 上的单体应用程序必须始终只有一个实例在运行,因为它是以不可扩展的方式构建的,并且拥有多个实例,即使是短暂的一秒钟,也可能会损坏数据库或磁盘数据。

申请必须:

  • 整个集群始终只有 1 个 Pod/进程(即使节点出现故障)
  • 如果节点排水,它必须仅在旧 Pod 完全停止后才启动新 Pod
  • 出现故障/健康检查失败时必须自动重启

我们都知道,在 K8S 中加载单体应用程序通常是一种不好的做法,因为构建单体、不可扩展的应用程序本身就是对未来开发的限制。也就是说,除了修复代码库之外,满足上述要求的最佳方法是什么?

我可以找到一些类似的线程,但它们并没有真正回答问题:

我能想到的一些解决方案(我尚未实施):

  • 在 ConfigMap 上有某种“互斥”机制,通过 sidecar pod 检查该 pod 的其他实例(缺点是在节点发生故障时它不会检测到它们,但应用程序可能仍然在失败的节点)
  • 在应用程序的主PVC(或数据库)上有一个互斥锁,以确保如果其他应用程序仍在运行,主程序将不会启动。 (缺点是应用程序可能会暂时被阻止,例如由于临时网络问题,并且可能稍后再次启动,从而造成不一致)
kubernetes
1个回答
0
投票

申请必须:

  • 整个集群始终只有 1 个 Pod/进程(即使节点出现故障)
  • 如果节点排水,它必须仅在旧 Pod 完全停止后才启动新 Pod
  • 发生故障/健康检查失败时必须自动重启

这就是 Kubernetes StatefulSet 提供的确切语义。

StatefulSet 提供至多一个 Pod 语义。

但是,请注意,正如您所说,不建议这样做,并且在应用程序和节点升级期间您将遇到停机时间。

© www.soinside.com 2019 - 2024. All rights reserved.