我有一个在Kubernetes pod中运行的应用程序,它使用复制控制器进行复制。但是,我需要一些应由一个应用程序(一个复制)一次完成的关键任务。以前我使用zookeeper来获取群集锁来完成该任务。 Kubernetes是否有办法为特定的复制控制器获取集群锁?
答案 0 :(得分:4)
Kubernetes没有集群锁对象,但您可以在复制控制器上使用annotation来指定锁定持有者和TTL。
例如,每个pod都可以读取注释键"lock"
,如果为空(或者如果TTL已过期),请尝试编写"lock": "pod-xyz: 2015-12-22T18:39:12+00:00"
。如果尝试多次写入,kubernetes将接受一次写入,并拒绝其他写入,因为资源版本将不正确。然后锁定持有者将继续更新注释以刷新TTL。
如果您拥有与此复制控制器对应的服务,则可以将锁注释放在服务而不是RC上。然后锁定语义将在软件升级(例如滚动更新)后继续存在。注释可以用于任何对象,因此可以灵活地找出最适合您的对象。
podmaster.go有一个很好的逻辑示例,可用于实现此目的。它直接针对etcd运行,如果你不介意引入另一个组件,你也可以这样做。