跳到主要内容

RabbitMQ 4.1:新的 Kubernetes 对等发现机制

·5 分钟阅读

RabbitMQ 4.1 包含一个为 Kubernetes 全新设计的对等发现插件。升级到 4.1 时,应该不需要任何配置更改,因此如果您愿意,可以就此停止阅读。如果您对细节感兴趣,请继续阅读。这篇博文将总体上解释对等发现子系统,并特别说明 rabbitmq_peer_discovery_k8s 的更改。

什么是对等发现?

假设您想要一个 3 节点的 RabbitMQ 集群 - 您启动了 3 个 RabbitMQ 实例,然后呢?您可以手动告诉其中两个使用 rabbitmqctl join_cluster 命令加入第三个,瞧,您就拥有了一个 3 节点集群。

然而,大多数用户希望这个过程是自动化的。这就是对等发现的用武之地。RabbitMQ 中有许多对等发现插件可用于不同的情况。最简单的一个称为 经典对等发现,它允许您只需将节点的主机名放在配置文件中,以便 RabbitMQ 在启动时自动使用它们启动集群形成。

注意

一个常见的误解是,每次节点启动时都会执行对等发现。事实并非如此,它仅在节点首次启动时(当它有一个空数据文件夹时)执行。

但是,根据您部署 RabbitMQ 的方式,主机名可能不是预先知道的。即使是这样,您也需要为每个集群使用不同的配置文件,如果您想要一种快速启动新集群用于测试环境的方法,这可能会很不方便。

在这种情况下,您可以使用其他对等发现插件,这些插件允许节点注册到一些外部系统(如 Consul 或 etcd),并查询这些系统以获取注册节点列表。这样您就不需要预先知道主机名 - 节点会自动相互发现。

RabbitMQ 4.1 之前的 Kubernetes 对等发现

在 RabbitMQ 4.1 之前,rabbitmq_peer_discovery_k8s 通过查询 Kubernetes API 服务器来执行对等发现,以获取服务后端的端点列表(Kubernetes 会自动将给定 StatefulSet 的 Pod 注册为端点)。但是,这种方法存在一些问题

  1. 一些用户报告说,偶尔集群形成会失败,Pod 会形成多个独立的集群;我们从未收到足够的数据来诊断这个问题,而且它从未在我们的测试中发生过(我们尝试了数千次...)
  2. 它需要查询 Kubernetes API 的权限;这不是什么大问题,但这是不必要的,一些注重安全的用户会问我们为什么需要这个
  3. 这是一种迂回的提问方式,我们已经知道答案了...

RabbitMQ 4.1 中的 Kubernetes 对等发现

当将 RabbitMQ 部署到 Kubernetes 时,您应该始终使用 StatefulSet。所有属于 StatefulSet 的 Pod 都以 StatefulSet 的名称命名,后跟一个连字符和一个 序号索引。序号索引的起始值是可配置的,但几乎总是 0,所以我们假设它是 0。鉴于此,部署到 Kubernetes 的 3 节点集群将始终具有后缀为 `-0`、`-1` 和 `-2` 的节点。没有必要查询 Kubernetes API 来知道这一点!

新的插件不执行任何 Kubernetes API 查询。它只是假设一个带有 `-0` 后缀的 Pod 将存在,并将其视为“种子”节点。所有其他节点将通过加入 `-0` 节点来加入集群。如果 `-0` 节点没有启动,其他节点将永远等待它启动(如果没有 `-0` 节点,它们将永远不会形成集群)。请记住,对等发现仅在节点首次启动时发生,因此“永远等待节点 `-0`”仅适用于您首次部署给定集群。

高级配置

对于绝大多数用户来说,这次升级应该是完全透明的。首先,由于对等发现仅在节点首次启动时执行,如果您升级现有集群,对等发现更改不会影响您。

其次,新的插件接受但忽略旧插件的所有配置选项。您将在日志中看到一些关于已弃用选项正在使用的警告,但您可以安全地忽略它们。

如果默认配置对您不起作用,您可以使用两个设置

  1. 如果您使用的序号起始值不是 0(并且说真的,您为什么要这样做?!),您应该通过设置 `cluster_formation.k8s.ordinal_start = N` 来配置插件,其中 `N` 是序号起始值。设置后,所有节点将尝试加入 `-N` 节点,而不是 `-0` 节点。

  2. 此外,您可以设置 `cluster_formation.k8s.seed_node = rabbit@seed-node-hostname` 以指定种子节点是什么。我们不希望永远需要此设置,但如果您真的需要它,它就在那里。

如果我正在使用集群操作符怎么办?

集群操作符 是将 RabbitMQ 部署到 Kubernetes 的推荐方式,因此如果您正在使用它 - 太好了。您应该能够继续使用它,无需任何更改。您将在日志中看到上述警告,因为集群操作符允许部署不同的 RabbitMQ 版本,而不仅仅是 4.1。因此,目前,它将继续在配置文件中设置旧版本 rabbitmq_peer_discovery_k8s 所需的值。这样的配置适用于 4.1 和更旧的版本。在未来的某个时候,集群操作符将放弃对旧于 4.1 的 RabbitMQ 版本的支持,我们将从集群操作符声明的 ConfigMap 中删除这些设置。

© . All rights reserved.