Kubernetes 中 rethinkdb 集群的高可用性问题

Posted

技术标签:

【中文标题】Kubernetes 中 rethinkdb 集群的高可用性问题【英文标题】:High availability issue with rethinkdb cluster in kubernetes 【发布时间】:2015-10-21 11:25:17 【问题描述】:

我正在 kubernetes 中设置 rethinkdb 集群,但它不能按预期工作以满足高可用性要求。因为当一个 pod 宕机时,kubernetes 会创建另一个 pod,它运行同一个镜像的另一个容器,旧的挂载数据(已经持久化在主机磁盘上)将被擦除,新的 pod 将作为一个全新的实例加入集群.我在 CoreOS v773.1.0 stable 中运行 k8s。

如果我错了,请纠正我,但是这样在 k8s 中设置数据库集群似乎是不可能的。

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

【问题讨论】:

【参考方案1】:

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

要持久化数据,您需要某种外部存储(NFS、EBS、EFS,...)。如果是k8s,你可能想看看这个https://github.com/kubernetes/kubernetes/blob/master/docs/design/persistent-storage.md这个Github issue也有很多信息https://github.com/kubernetes/kubernetes/issues/6893

事实上,在我看来,这就是实现 HA 的方法。容器都是无状态的,它们里面没有任何东西。他们的任何配置需求都应该存储在外部,例如使用 Consul 或 Etcd 之类的东西。通过这样分离,重启容器更容易

【讨论】:

我使用 persistentVolume HostPath 来持久化数据。我意识到我对集群中的每个节点都使用了相同的 persistentVolume,即使它们被安排在不同的节点上也是错误的。这是 k8s 持久卷的行为,特别是 HostPath?但是,我认为不应该是这样。谢谢@kureikain,你的回答帮助了我!【参考方案2】:

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

petset功能总结如下。

稳定的主机名 稳定的域名 多个相似类型的宠物将使用“-n”命名(rethink-0, rethink-1, ... rethink-n 例如) 持久卷 现在应用可以集群/对等

当宠物吊舱死亡时,将启动一个新的吊舱,并采用与前一个吊舱相同的“状态”(包括磁盘)。

【讨论】:

以上是关于Kubernetes 中 rethinkdb 集群的高可用性问题的主要内容,如果未能解决你的问题,请参考以下文章

Rethinkdb复制和数据一致性

不向 rethinkdb 插入数据

RethinkDB:​​更新文档

Kubernetes 集群中的 Kafka - 如何从 Kubernetes 集群外部发布/使用消息

如何在 Ubuntu 上卸载 RethinkDB?

提高 rethinkdb 中大量记录的查询性能