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

High availability issue with rethinkdb cluster in kubernetes

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

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

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

这就是 Kubernetes 的工作原理,其他解决方案的工作原理可能相同。当一台机器挂了,它上面的容器会被重新调度到另一台机器上的运行。另一台机器没有容器状态。当它是同一台机器时的事件,它上面的容器被创建为一个新容器,而不是重新启动退出的容器(里面有数据)。

要持久化数据,您需要某种外部存储(NFS、EBS、EFS 等)。对于 k8s,您可能需要查看此 https://github.com/kubernetes/kubernetes/blob/master/docs/design/persistent-storage.md This Github issue also has many information https://github.com/kubernetes/kubernetes/issues/6893

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

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

宠物集功能总结如下。

  • 稳定主机名
  • 稳定域名
  • 多个相似类型的宠物将被命名为“-n”(rethink-0, rethink-1, ... 例如 rethink-n)
  • 持久卷
  • 现在应用程序可以cluster/peer在一起

当一个 pet pod 死亡时,一个新的 pod 将被启动,并且将采用与前一个相同的 "state"(包括磁盘)。