2015-10-21 34 views
1

我在kubernetes内部设置了rethinkdb群集,但它无法按预期工作以满足高可用性要求。因为当一个吊舱停机时,kubernetes将创建另一个吊舱,该吊舱运行同一图像的另一个容器,旧的装载数据(已保存在主机磁盘上)将被删除,新的吊舱将作为全新的实例加入群集。我在CoreOS v773.1.0 stable中运行k8s。kubernetes中的rethinkdb群集的高可用性问题

请纠正我,如果我错了,但这种方式似乎不可能在k8s内设置数据库集群。

更新:如文档http://kubernetes.io/v1.0/docs/user-guide/pod-states.html#restartpolicy所述,如果RestartPolicy: Always它将在退出失败时重新启动容器。这意味着通过“重新启动”它可以启动相同的容器,或创建另一个容器?或者,也许是因为我通过命令kubectl stop po停止了吊舱,因此它不会重新启动同一个容器?

回答

2

这就是Kubernetes的工作方式,其他解决方案的工作方式可能相同。当一台机器死了,它上面的容器将被重新安排在另一台机器上运行。那台机器没有容器状态。当它是同一台机器时,其上的容器被创建为新的容器,而不是重新启动退出的容器(其中的数据)。

对于持久数据,您需要某种外部存储(NFS,EBS,EFS等)。在K8S的情况下,你可能想看看这个https://github.com/kubernetes/kubernetes/blob/master/docs/design/persistent-storage.md这Github的问题也有很多信息https://github.com/kubernetes/kubernetes/issues/6893

而且在行动上,这是在我看来,实现HA的方式。集装箱都是无国籍的,它们没有任何东西在里面。任何配置需要他们应该存储在外面,如使用诸如Consul或Etcd之类的东西。通过这样分开,容易重新启动容器

+0

我使用persistentVolume HostPath来保存数据。我意识到我为群集中的每个节点使用了相同的persistentVolume,即使它们被安排在不同的节点上也是错误的。这是k8s持久卷的行为,特别是HostPath?不过,我认为这不应该是这样。 谢谢@kureikain,你的回答帮助了我! –

0

尝试使用PetSets http://kubernetes.io/docs/user-guide/petset/ 允许您为您的(宠物)豆荚命名。如果一个吊舱被杀死,那么它将以相同的名字回来。

petset功能摘要如下。

  • 稳定主机名
  • 稳定域名
  • 相似类型的多个宠物会具有 “-n”(重新考虑-0,被命名为 反思-1,...重新考虑-n,用于例如)
  • 持久卷
  • 现在的应用程序可以群集/同伴一起

当宠物荚死了,一个新的将被启动,并承担所有的SAM上一个的“状态”(包括磁盘)。