我有一个应用程序,它将作为pod部署在OpenShift / Kubernetes集群中。我知道这违反了Kubernetes的原则,但是这个pod应该只运行一次(因此不应该是并行处理)。可能有第二个pod正在运行,第一个突然崩溃以立即接管。 我现在的问题是:如何实现“锁定”并确保在容器崩溃时释放此锁定。
我的第一个想法是为使用过的数据库写一个“锁定”属性。只要设置了属性,第二个pod就不会执行任何操作。一旦处理pod崩溃,它就会重新发布这个锁。但是当应用程序崩溃时如何释放它?
提前感谢您的想法!
答案 0 :(得分:1)
这必须由应用程序完成,因为Kubernetes故意不提供开箱即用的这些应用程序层原语。有一些方法可以协调一些事情,这样Kubernetes通常只会运行一个pod,但该编排所提供的保证是有限的。
使用持久数据存储来协调应用程序层的责任所有权是个好主意,使用“锁定”属性或类似属性也没关系。处理确保“活跃”问题的典型方法是让负责的应用程序定期更新该数据存储区中的最后更新时间戳。然后,辅助应用程序可以监视自上次更新以来的间隔。
在这种解决方案中,还必须有一种获得责任所有权的方法,这可以通过将“locked”属性作为应用程序实例ID来完成。
因此,在定期间隔,协调应用程序的负责实例执行SELECT FOR UPDATE以原子方式更新其应用程序实例ID的时间戳。如果应用程序仍然负有责任,则更新仅会成功。
备份实例会定期检查上次更新的时间戳。如果自上次更新以来的时间间隔超过超时,则备份实例会尝试进行原子更新,以便仅在最后更新时间戳太旧时才将锁定属性更改为其应用程序实例ID。
必须对竞争条件稍微小心,并适当地使用事务和数据存储的原子性。此外,当工作失败或被中断时,必须有一种方法来适当地重试或回滚。
但是对于很多情况来说,这种简单的解决方案很好。希望有所帮助。