部署在 Kubernetes 上的单体应用程序必须始终只有一个实例在运行,因为它是以不可扩展的方式构建的,并且拥有多个实例,即使是短暂的一秒钟,也可能会损坏数据库或磁盘数据。
申请必须:
我们都知道,在 K8S 中加载单体应用程序通常是一种不好的做法,因为构建单体、不可扩展的应用程序本身就是对未来开发的限制。也就是说,除了修复代码库之外,满足上述要求的最佳方法是什么?
我可以找到一些类似的线程,但它们并没有真正回答问题:
我能想到的一些解决方案(我尚未实施):
申请必须:
- 整个集群始终只有 1 个 Pod/进程(即使节点出现故障)
- 如果节点排水,它必须仅在旧 Pod 完全停止后才启动新 Pod
- 发生故障/健康检查失败时必须自动重启
这就是 Kubernetes StatefulSet 提供的确切语义。
StatefulSet 提供至多一个 Pod 语义。
但是,请注意,正如您所说,不建议这样做,并且在应用程序和节点升级期间您将遇到停机时间。