RabbitMQ Kubernetes Operator 达到 1.0 版本
我们很高兴地宣布,RabbitMQ Kubernetes Operator 已正式上市。RabbitMQ Operator 可以轻松地在任何已认证的 Kubernetes 发行版上一致地配置和管理 RabbitMQ 集群。Operator 向 Kubernetes 容器编排系统提供有关如何配置和控制特定应用程序的信息。Kubernetes (下称 K8s) Operator 模式是一种扩展 K8s API 和状态管理的方法,用于包含自定义资源的配置和管理——这些资源并非在默认 K8s 部署中提供。在本文中,我们将讨论 Operator 如何使 K8s 系统能够控制 RabbitMQ 集群。
我该从哪里开始?
如果您是 Kubernetes (K8s) 的新手,在尝试使用 operator 之前,请先学习 K8s 和 kubectl 的基础知识。您还可以访问 Kube Academy 获取更深入的入门指南。观看这期 TGIR 节目,了解使用该 operator 部署和监控 RabbitMQ 集群是多么简单。接下来,您可以尝试快速入门指南。只需一两分钟,您就可以创建好 operator 以及您的第一个由 operator 管理的 RabbitMQ 集群实例。
想要深入了解?请查看 operator YAML 示例,以快速部署高级集群。有关所有支持功能的完整列表,请查阅文档。
Rabbit K8s Operator
建议您先熟悉 K8s 的基础知识。如果您需要复习,VMware 的 Kube Academy 拥有全面的资源。Rabbit MQ K8s operator 由两个构建模块组成
- 自定义资源 (Custom resources):对原生 K8s 资源的扩展,用于管理特定有状态平台或应用程序的自定义状态。在我们的例子中,自定义资源反映了 RabbitMQ 集群的配置大小和状态。
- 自定义控制器 (Custom controller):K8s 控制器是一个非终止循环,用于调节标准 K8s 资源(如 ReplicaSet、StatefulSet 或 Deployment)的状态。自定义控制器添加了一个带有自定义逻辑的非终止控制循环,以调节自定义资源的状态。对于 RabbitMQ 集群,控制器可以处理集群和节点配置的变更。
RabbitMQ 集群 Operator 的价值是什么?
RabbitMQ 集群 Operator(简称 operator)是 K8s 管理状态与 RabbitMQ 配置及状态之间的桥梁。RabbitMQ 集群 Operator 有助于简化两类任务
- 新集群的供应(Provisioning)
- 由 K8s 管理的安装后任务
新 RabbitMQ 集群的供应
在 K8s 上手动创建新的 RabbitMQ 集群是一个多步骤的过程,而 operator 将其自动化了:
- 将 RabbitMQ 配置文件创建为 ConfigMap,以便 RabbitMQ 容器可以将其作为文件挂载
- 设置 RabbitMQ 所需的 K8s 密钥(TLS 证书、默认用户密码等)
- 创建一个 StatefulSet 来管理集群节点(作为 Pod)
- 创建一个无头服务(headless service,即没有集群 IP 的服务)来管理 RabbitMQ 节点发现
- 为 RabbitMQ 客户端访问集群创建一个服务
Operator 并不是自动化此过程的唯一方法,但它有一个优势:将所有 RabbitMQ 配置映射到 K8s 描述符和自定义资源中。这意味着关于集群状态存在单一的事实来源(Single Source of Truth),用户可以使用 Gitops 来管理其集群配置。
通过使用 operator 供应 RabbitMQ 集群,用户可享受多项优势
- 一个声明式 API,只需一条命令即可创建具有任何设置的 RabbitMQ 集群。Operator 自动化了组成集群的复杂 K8s 资源供应过程:例如服务、Pod、StatefulSet、持久卷等。
- Operator 附带了一套 YAML 示例,因此在大多数情况下,您几乎无需费力即可获得开发级甚至生产级的集群。
- 集群创建后,它具有 K8s 状态和描述,您可以观察它们以了解 RMQ 集群是否就绪。RabbitMQ 内置了对 Prometheus 的支持。节点和集群指标可以使用 Grafana 进行可视化。
- Operator 更进一步,显示了 RabbitMQ 集群的状态条件。可能的状态条件包括
- ClusterAvailable - 客户端应用程序可访问 RabbitMQ
- AllReplicasReady - RabbitMQ 集群完全可用
- ReconcileSuccess - 自定义资源已成功调解。如果为 false,则可能表示用户需要干预(例如启用了 TLS 但密钥不存在)。
- K8s 控制器现在可以调节组成集群的资源集:RabbitMQ 节点、路由服务、节点注册服务和卷。如果根据 K8s 的存活探针(liveness probe)判断这些资源中任何一个不可用,K8s 将自动修复它。
虽然 operator 对“第一天(Day 1)”的任务很有用,但当我们谈论由用户或 K8s 触发的“第二天(Day 2)”操作时,它能带来更大的好处。
安装后任务
正如任何开发人员和运维人员所知,供应好 RabbitMQ 集群仅仅是旅程的开始。还有各种生命周期事件需要处理:
- 当应用程序消息量因额外功能或需求增长而增加时,对集群进行扩缩容
- 当节点崩溃或网络中断时,集群的自我修复
- 轮换证书
- 当安全补丁或新功能需要新版 RabbitMQ 时,以零停机时间升级集群
上述许多过程需要节点的优雅终止、节点启动后的某些 RabbitMQ API 调用,或包含 K8s 生命周期事件和 RabbitMQ 集群事件序列的更复杂流程。这正是 operator 的价值所在。
- 集群 Operator 将允许 RabbitMQ 用户通过简单的 K8s CLI 声明式命令来解决所有这些问题。
- Operator 将利用 K8s 构建模块和负责处理 RabbitMQ 管理任务的自定义控制器逻辑,自动化这些复杂的流程。
该 operator 现在支持核心的 RabbitMQ “第二天”运维操作,例如::
- 重新配置
- 插件的启用/禁用
- 自我修复
- 扩缩容
- 原地升级
- 证书轮换 - 使用滚动更新
未来,可以升级 operator 以提供新的流程。例如,operator 的新版本可能会随 RabbitMQ 的新主版本一起发布。使用 operator 模式意味着我们可以提供特定的逻辑,例如将现有的 RabbitMQ 集群升级到新的主版本,而不会丢失消息且无需停机。新版本 operator 的出现并不会强制用户升级现有集群;K8s 在未来仍将能够管理这些集群。
只有 K8s operator 才能以如此优雅且无风险的方式自动化这些复杂而微妙的过程。这是一个示例,展示了 RabbitMQ 如何通过自动化原地升级过程来避免用户的痛苦和错误。该图表列出了用户在没有 operator 的情况下执行集群滚动升级所需的各种手动步骤。

现在观看 Gerhard 讲解如何在 K8s 上可靠地运行 RabbitMQ 的高级主题。
还没完,还有更多内容
该 operator 附带了一个 kubectl 插件,提供了许多命令来让您的生活更轻松。如此处所述,您可以使用 krew 安装该 kubectl 插件。一些便捷的命令包括安装集群 operator,以及创建、列出和删除 RabbitMQ 集群。其他针对特定 RabbitMQ 集群的命令包括打印默认用户密钥、打开 RabbitMQ 管理界面、在所有 RabbitMQ 节点上启用调试日志记录以及运行 perf-test。
下一步是什么?
集群 Operator 为用户提供了强大的功能来创建和管理集群。根据您的要求和反馈,仍有更广泛的功能范围需要支持。
一些例子包括:
- 使用 Istio 进行节点间流量以及客户端流量加密/解密的拓扑示例
- 优雅地缩容
- 监控 operator - operator 将以 Prometheus 格式报告指标
- 使用 RMQ 和 operator 元数据标记集群资源
- 在其他 K8s 提供商上进行测试(目前正在 Tanzu Kubernetes Grid 和 GKE 上进行测试)
此外,我们计划添加另一个 operator,它将使用 K8s 声明式 API 封装一些 RabbitMQ 的 API,从而允许创建用户、队列和交换机。
我们欢迎有关 RabbitMQ 的反馈、功能请求、错误报告以及任何问题。:
- 如需功能请求和报告错误,请使用 Github Issues
- 如需提问和反馈,请使用 Github 或 rabbitmq-users 小组。您也可以订阅社区邮件列表和 RabbitMQ Slack 频道
- 阅读 RabbitMQ 社区博客
- 我们一直在寻找 RabbitMQ 项目的新贡献者!