RabbitMQ Kubernetes Operator 1.0 版本发布
我们很高兴地宣布,RabbitMQ Kubernetes Operator 现已正式发布。RabbitMQ Operator 可以轻松地在任何经过认证的 Kubernetes 发行版上一致地配置和管理 RabbitMQ 集群。Operator 会告知 Kubernetes 容器编排系统如何配置和控制特定的应用程序。Kubernetes(以下简称 K8s)Operator 模式是一种将 K8s API 和状态管理扩展到包括自定义资源配置和管理的方法——这些资源并非在默认的 K8s 部署中提供。在这篇文章中,我们将讨论 Operator 如何使 K8s 系统能够控制 RabbitMQ 集群。
从哪里开始?
如果您是 K8s 新手,请先学习 K8s 和 kubectl 的基础知识,然后再尝试使用 Operator。您还可以访问Kube Academy获取更深入的入门信息。观看TGIR 的这一期节目,了解使用 Operator 部署和监控 RabbitMQ 集群是多么容易。接下来,您可以尝试快速入门指南。在一两分钟内,您将拥有 Operator 以及您第一个由 Operator 创建的 RabbitMQ 集群实例。
想要更进一步?查看Operator YAML 示例,快速部署高级集群。有关所有支持的功能,请查阅文档。
Rabbit K8s Operator
建议您首先熟悉 K8s 的基础知识。如果您需要复习,VMware 的 Kube Academy 提供了一套全面的资源。**Rabbit MQ K8s Operator 由两个构建块组成**
- 自定义资源:对原生 K8s 资源的扩展,用于管理特定有状态平台或应用程序的自定义状态。在我们的案例中,自定义资源反映了 RabbitMQ 集群的配置大小和状态。
- 自定义控制器:K8s 控制器是一个非终止循环,用于调节标准 K8s 资源(如 ReplicaSet、StatefulSet 或 Deployment)的状态。自定义控制器添加了一个具有自定义逻辑的非终止控制循环,以调节自定义资源的状态。在 RabbitMQ 集群的情况下,控制器可以解决集群和节点配置的更改。
RabbitMQ 集群 Operator 的价值在哪里?
RabbitMQ 集群 Operator(又名 Operator)是 K8s 管理的状态与 RabbitMQ 配置和状态之间的桥梁。**RabbitMQ 集群 Operator 有助于简化两种类型的任务**
- 新集群的配置
- 由 K8s 管理的安装后任务
新 RabbitMQ 集群的配置
在 K8s 上手动创建新的 RabbitMQ 集群是一个多步骤的过程,Operator 会自动执行此过程。
- 将 RabbitMQ 配置文件创建为 ConfigMap,以便 RabbitMQ 容器可以将其作为文件挂载。
- 设置 RabbitMQ 所需的 K8s 密钥(TLS 证书、默认用户密码等)。
- 创建一个 StatefulSet 来管理集群节点(作为 Pod)。
- 创建一个无头服务(一个没有集群 IP 的服务)来管理 RabbitMQ 节点的发现。
- 为 RabbitMQ 客户端创建服务以访问集群。
Operator 并不是自动执行此过程的唯一方法,但它具有将所有 RabbitMQ 配置映射到 k8s 描述符和自定义资源的优点。这意味着关于集群状态存在一个单一的事实来源,用户可以使用GitOps来管理其集群配置。
通过使用 Operator 配置 RabbitMQ 集群,用户可以获得一些好处。
- 使用单个命令创建具有任何设置的 RabbitMQ 集群的声明式 API。Operator 会自动执行构成集群的复杂 K8s 资源集的配置,例如服务、Pod、StatefulSet、持久卷等。
- Operator 附带一组 YAML 示例,因此在大多数情况下,您几乎无需任何努力即可拥有开发级甚至生产级集群。
- 集群创建后,它会拥有一个 K8s 状态和描述,您可以观察这些状态和描述以了解您的 RMQ 集群是否已准备就绪。RabbitMQ 内置支持 Prometheus。节点和集群指标可以使用 Grafana 进行可视化。
- Operator 进一步显示了 RabbitMQ 集群的状态条件。可能的状态条件包括:
- ClusterAvailable - RabbitMQ 可供客户端应用程序访问。
- AllReplicasReady - RabbitMQ 集群完全可用。
- ReconcileSuccess - 自定义资源已成功协调。如果此值为 false,可能表示用户需要干预(例如,如果启用了 TLS 但密钥不存在)。
- K8s 控制器现在可以调节构成集群的资源集:RabbitMQ 节点、路由服务、节点注册服务和卷。如果任何这些资源根据 K8s 存活性探测不可用,K8s 将自动修复它。
虽然 Operator 对第 1 天的任务很有用,但在我们谈论由用户或 k8s 触发的第 2 天操作时,它会带来更大的好处。
安装后任务
配置 RabbitMQ 集群仅仅是旅程的开始,正如任何开发人员和运维人员都知道的那样。需要处理各种生命周期事件。
- 当应用程序消息量由于新增功能或需求增长而增加时,扩展集群。
- 当节点崩溃或网络中断时,自我修复集群。
- 轮换证书。
- 当需要新版本的 RabbitMQ 进行安全修补或新增功能时,零停机升级集群。
许多上述过程需要优雅地终止节点,在节点启动后进行一些 RabbitMQ API 调用,或者更复杂的工作流,这些工作流包含一系列 K8s 生命周期事件和 RabbitMQ 集群事件。这正是 Operator 的价值所在。
- 集群 Operator 将允许 RabbitMQ 用户使用简单的 K8s CLI 声明式命令来解决所有这些问题。
- Operator 将使用 K8s 构建块和自定义控制器逻辑自动执行这些复杂的工作流,这些逻辑负责 RabbitMQ 管理任务。
Operator 现在支持第 2 天 RabbitMQ 操作的核心内容,例如::
- 重新配置。
- 启用/禁用插件。
- 自我修复。
- 扩展。
- 就地升级。
- 证书轮换 - 使用滚动更新。
将来,可以升级 Operator 以提供新的工作流。例如,可能会发布一个新版本的 Operator,其中包含一个新主版本的 RabbitMQ。使用 Operator 模式意味着我们可以提供特定的逻辑来,例如,将现有的 RabbitMQ 集群升级到新的主版本,而不会丢失消息并且不会停机。新 Operator 版本的存在不会强制用户升级现有集群;K8s 仍然能够管理这些集群。
只有 K8s Operator 才能以如此优雅的方式并且没有风险地自动执行如此复杂和精细的过程。以下是如何通过自动执行就地升级过程来帮助用户避免痛苦和错误的示例。该图列出了用户为了滚动升级集群(没有 Operator)而需要执行的手动步骤。
现在观看 Gerhard 讲解在 K8s 上可靠运行RabbitMQ的更多高级主题。
但是,还有更多内容
Operator 附带一个 kubectl 插件,该插件提供了许多命令来简化您的工作。如此处所述,您可以使用krew安装 kubectl 插件。一些方便的命令包括安装集群 Operator 以及创建、列出和删除 RabbitMQ 集群。其他针对特定 RabbitMQ 集群的命令包括打印默认用户密钥、打开 RabbitMQ 管理 UI、在所有 RabbitMQ 节点上启用调试日志以及运行perf-test。
接下来是什么?
集群 Operator 为用户提供了强大的功能来创建和管理集群。根据您的请求和反馈,仍有更广泛的功能范围需要支持。
一些示例包括:
- 使用 Istio 的拓扑示例,用于节点之间以及客户端与流量之间的加密/解密。
- 优雅地缩减规模。
- 监控 Operator - Operator 将以 Prometheus 格式报告指标。
- 使用 RMQ 和 Operator 元数据标记集群资源。
- 在其他 K8s 提供商上进行测试(目前正在 Tanzu Kubernetes Grid 和 GKE 上进行测试)。
此外,我们计划添加另一个 Operator,它将使用 K8s 声明式 API 包装一些 RabbitMQ 的 API,允许创建用户、队列和交换机。
我们欢迎您提供反馈、功能请求、错误报告以及您关于 RabbitMQ 的任何疑问。:
- 对于功能请求和错误,请使用Github 问题
- 对于问题和反馈,请使用 Github 或rabbitmq-users 组。您还可以订阅社区邮件列表和 RabbitMQSlack 频道
- 阅读 RabbitMQ社区博客
- 我们一直在寻找RabbitMQ 项目的新贡献者!