2015-12-22 83 views
2

我有一个应用程序在使用复制控制器复制的Kubernetes群中运行。不过,我需要一次完成一个应用程序(一次复制)完成的关键任务。以前我使用zookeeper来获取群集锁来完成这项任务。 Kubernetes有没有办法为特定的复制控制器获取群集锁定?Kubernetes通过复制获取群集锁

回答

2

Kubernetes没有群集锁对象,但可以在复制控制器上使用annotation指定锁持有者和TTL。

例如,每个吊舱都可以读取注释码"lock",如果为空(或者如果TTL已过期),请尝试写入"lock": "pod-xyz: 2015-12-22T18:39:12+00:00"。如果尝试多次写入,kubernetes将接受一个写入,并拒绝其他的写入,因为资源版本不正确。然后锁持有者将继续更新注释以刷新TTL。

如果您有与此复制控制器相对应的服务,则可以将锁注释放在服务而不是RC上。然后,锁定语义将在软件升级(例如,滚动更新)之后存活。注释可以放在任何对象上,因此可以灵活地找出最适合您的对象。

podmaster.go有一个很好的例子可以用来实现这个逻辑。它直接运行在etcd上,如果你不介意引入另一个组件,你也可以这样做。

+0

pod中的应用程序应该如何向服务写入/读取注释?它是否通过REST API? – Dimuthu

+0

是的。客户端库应该有你需要的东西,如果你不想制作原始请求。通过kubectl也是可能的。我不确定。 –

+0

使用etcd本地群集锁支持并通过kubernetes API公开它不是一个好主意吗? https://coreos.com/etcd/docs/0.4.7/etcd-api/#lock – Dimuthu