Google 容器引擎集群中的 CockroachDB 集群,Statefulset

CockroachDB Clustered Across Google Container Engine Clusters, Stateful Sets

CockroachDB 有一个相对简单的集群机制,您使用指向其他 cockroach 机器主机名的命令行选项初始化数据库(但是,这个问题对于任何对等集群数据库都非常相关)。

Cockroach 的好处之一是您可以在大陆内跨区域集群。 Cockroach 自己发布了一个很好的 k8s 配置来在有状态集上建立一个 cockroach 集群。请参阅 this 配置。

我正在尝试找到一种方法将 cockroach 集群跨越不同区域的两个 GKE 集群。区域之间的 DNS 和连接性并不是真正的问题,但我无法弄清楚如何解决有状态集实例。在集群内部,它们是 cockroachdb-1.cockroach。有什么方法可以让它们跨集群寻址吗?一个选择是将第二个集群中的节点端口和点实例公开到第一个集群中具有端口的机器。这看起来很老套,如果机器宕机就代表单点故障。关于如何做到这一点的任何其他想法?我还探索了 k8s 联邦,但我认为它也没有真正解决这个问题(尽管我可能是错的)。

最后一个选择是通过负载均衡器公开每个实例...我不太喜欢那样,但也许这是唯一的方法?

这是一个很好的问题,我一直想尝试一下。你一直在检查一组合理的想法。正如您提到的,核心问题是每个蟑螂进程都需要能够单独解决每个其他蟑螂进程。

我不知道集群联邦在过去 12-18 个月里发展得如何,但看起来这才是真正应该解决的地方。

除非集群联邦取得重大进展,否则我想到的 "easiest" 方式是对所有 cockroachdb pods 使用主机网络。您可以指定一些已知的机器 IP 作为新 pods 连接的加入地址,然后它们就可以互相交谈了。我之前已经使用 StatefulSets 完成了这项工作(通过设置 dnsPolicy: ClusterFirstWithHostNethostNetwork: true),但我不确定它是否是一个得到很好支持的用例。您可能最好使用 DaemonSet(如果您不想在所有节点上使用标签选择器,则仅在某些节点上使用 运行)。像这样:https://gist.github.com/a-robinson/ec2b86783ccbf053c83ba83170673d63

如果这不能满足您的喜好,那么不幸的是,为每个 StatefulSet 实例创建一个服务可能是下一个最佳选择。由于 Kubernetes 最近发生了变化,将为每个 pod 创建一个单独的标签,这应该比以前更容易:https://github.com/kubernetes/kubernetes/pull/55329

不过,我很乐意看到其他建议,因为它都是手动的或特定于基础架构的。