我正在通过 kubernetes 设置电子邮件服务器。我设法启动并运行了 postfix,现在正在尝试设置 dovecot。由于我预计 dovecot 会有一点流量,所以我想运行几个实例,这些实例都必须同步。我想到了两个选项:
选项1: 将 dovecot 作为有状态集运行。这很有意义,但我找不到允许我在不同的实例之间运行完全同步的解决方案。我正在寻找备份和加莱拉但两者都是用于数据库而不是我正在寻找的应用程序。
选项 2: 将 dovecot 作为部署运行,并使用相同的存储共享以确保所有 pod 共享相同的数据(电子邮件存储)。这样我就可以为 dovecot 使用负载平衡。
问题:
- 我应该使用哪种解决方案?
如果选择选项 1:
- 您能指出在哪里可以找到有关保持不同实例同步的示例或文档吗?
如果选择选项 2:
- 您能否指出示例配置或文档,说明如何对多个实例使用相同的存储?
谢谢
答案1
我花了很长时间才找到解决方案。Dovecot 有一个内置同步工具。不幸的是,这会将您的“主”节点限制为 2 个。无法运行更多同步。这就是我不使用它的原因。
我的实现分为两个步骤:
1. 同步
我正在有状态的集合中运行 Pod。这样,Pod 的名称就更可预测了。我创建了一个运行 lsyncd 的侧容器(请查看我的仓库有关如何构建容器的更多详细信息)。无论谁编写了该工具,您都是天才,谢谢。在启动 pod 期间,我会向 init 容器提供一些详细信息,例如我打算运行多少个实例、命名空间和服务,以及 ssh 同步 LUA 文件的结构。这些信息是 lsyncd 知道要同步什么所必需的。我将 LUA 配置传递到容器中,并将可用于同步的 pod 的名称添加到 LUA 脚本中。正如我所说,我需要名称可预测性。一旦该 init 容器完成,LUA 脚本就会构建并准备在 lsyncd 容器中使用。
2. 容器的启动
一旦完成这项“准备”工作,容器就会启动。lsyncd 容器会获得一个单独的 100MB 共享 pvc(邮件存储之外),以便在容器之间交换 SSH 密钥。假设您正在运行 3 个 dovecot 实例,lsyncd 容器内的一个进程会创建一个密钥,将其存储在这个 pvc 上,并将其保存在适当的文件夹中以允许同步。该过程与使用密钥而不是密码登录 ssh 非常相似。启动脚本会检查密钥的可用性,直到找到所有密钥并将它们存储在需要的地方。完成后,每个 lsyncd 容器都会创建一个带有其编号的文件,以表示密钥集成已完成,一旦这些文件与实例数匹配,密钥就会被删除。此时 lsyncd 同步已准备就绪并设置完毕。最后,dovecot 容器启动并完成启动过程。
如果您有任何疑问,请随时在此处发表,我会尽快回复。