【问题标题】:Deploy mariadb galera cluster in kubernetes/docker swarm在 kubernetes/docker swarm 中部署 mariadb galera 集群
【发布时间】:2019-09-29 14:13:30
【问题描述】:

我正在尝试在 kubernetes 或 docker swarm 中部署 scalable mariadb galera 集群。由于每个 pod 或容器都需要自己的 galera 配置,我应该如何创建我的部署以便能够在没有任何手动工作的情况下对其进行扩展?我认为我们不能使用 ConfigMap,因为 10 节点集群必须有 10 个 configmap!

节点的mariadb galera配置示例:

wsrep_cluster_address="gcomm://ip_1,ip_2,ip_3"    
wsrep_node_address="ip_1"    
wsrep_node_name="node_1"
wsrep_cluster_name="mariadb-cluster"

对于每个节点都有不同配置的此类应用程序,最好的部署方式是什么?

注意:我可以创建 pod/容器并自己进行配置(将新节点加入集群),但我认为这不是正确的方式,我需要它能够自动扩展。

【问题讨论】:

    标签: kubernetes mariadb galera


    【解决方案1】:

    您几乎肯定想使用StatefulSet 在 Kubernetes 中部署它。除其他外,这具有每个 Pod 将获得自己的 PersistentVolumeClaim 用于存储的属性,并且各个 Pod 的名称是可预测的和连续的。你应该 create a matching headless Service 然后每个 Pod 都会有一个匹配的 DNS 名称。

    这解决了几个部分的谜题:

    # You pick this
    wsrep_cluster_name="mariadb-cluster"
    
    # You know what all of these DNS names will be up front
    wsrep_cluster_address="gcomm://galera-0.galera.default.svc.cluster.local,...,galera-9.galera.default.svc.cluster.local"
    

    对于wsrep_node_nameMariaDB documentation 表示它默认为主机名。在 Kubernetes 中,主机名默认为 Pod 名,Pod 名是 StatefulSet 管理的 Pod 的顺序 galera-n 之一,因此无需手动设置。

    wsrep_node_address 比较棘手。这里the documentation 表示有启发式方法来猜测它(特别注意它可能对容器不可靠)。在创建单个 pod 之前,您无法知道它的 IP 地址。原则上,您可以使用 downward API 将 pod 的 IP 地址注入环境变量。我首先希望启发式算法能够猜出 pod IP 地址,并且它运行良好(这是无头服务最终会解决的问题)。

    剩下的就是 ConfigMap 中的上述块,它在所有副本中都是全局的。其他剩余的每个 Galera 节点的值应该是可以自动猜测的。

    【讨论】:

    • 好的,我认为这会起作用(虽然我有点担心不可靠的自动猜测 wsrep_node_address)所以我要试试这个并告诉你结果。
    • 我还不能部署集群(第二个节点没有加入集群),但我正在尝试,我认为这是唯一的方法。
    • @hamedb71 你有什么消息吗?
    • @ZedTuX 我可以使用 David 方法部署集群,但不能在企业级部署,因为我手动执行某些操作并且我想要自动执行。我不知道,也许我的实现不正确或者还不可能!
    • @hamedb71 您在此期间是否成功设置了集群?我正在尝试使用 bitnami 的掌舵图来做同样的事情,但遇到了一些无法确认生命周期的问题(此处描述的问题:github)。我很想看看您是如何自动化集群设置的,尤其是您使用的是哪个版本。我想要最新的东西,比如 mariadb 10.5.9 或至少 mariadb 10.5.8,因此我认为 bitnami 是一个很好的版本,但我无法让它运行。