跳到主要内容

RabbitMQ Cluster Kubernetes Operator 快速入门

这是使用 Cluster Operator 部署 RabbitMQ 集群并使其运行起来的最快方法。此快速入门中的步骤也在 KubeCon + CloudNativeCon North America 2021 演讲 RabbitMQ on Kubernetes 深度解析 中进行了演示。更多详细资源请参考 安装使用API 参考

先决条件

  • 访问 Kubernetes 集群版本 1.19 或更高版本
  • 配置 kubectl 以访问集群

快速入门步骤

本指南将介绍以下步骤

  1. 安装 RabbitMQ Cluster Operator
  2. 使用 Operator 部署 RabbitMQ 集群
  3. 查看 RabbitMQ 日志
  4. 访问 RabbitMQ Management UI
  5. 将工作负载连接到集群
  6. 后续步骤

kubectl rabbitmq 插件

快速入门中的许多步骤(安装 operator、访问 Management UI、获取 RabbitMQ 集群的凭据)都可以通过 kubectl rabbitmq 插件简化。虽然有不使用插件也能完成操作的说明,但获取插件将使这些命令更简单。要安装插件,请查看其安装说明

有关插件的详细文档,请参阅 kubectl 插件指南

安装 RabbitMQ Cluster Operator

让我们首先安装最新版本的 Cluster Operator。这可以直接使用 kubectl apply 完成

kubectl apply -f "https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"
# namespace/rabbitmq-system created
# customresourcedefinition.apiextensions.k8s.io/rabbitmqclusters.rabbitmq.com created
# serviceaccount/rabbitmq-cluster-operator created
# role.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-role created
# clusterrole.rbac.authorization.k8s.io/rabbitmq-cluster-operator-role created
# rolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-leader-election-rolebinding created
# clusterrolebinding.rbac.authorization.k8s.io/rabbitmq-cluster-operator-rolebinding created
# deployment.apps/rabbitmq-cluster-operator created

也可以使用 kubectl rabbitmq 插件安装 Cluster Operator

kubectl rabbitmq install-cluster-operator

安装 Cluster Operator 会创建大量 Kubernetes 资源。分解来看,我们有:

  • 一个新的命名空间 rabbitmq-system。Cluster Operator 部署在此命名空间中创建。
kubectl get all -n rabbitmq-system

NAME READY STATUS RESTARTS AGE
pod/rabbitmq-cluster-operator-54f948d8b6-k79kd 1/1 Running 0 2m10s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/rabbitmq-cluster-operator 1/1 1 1 2m10s

NAME DESIRED CURRENT READY AGE
replicaset.apps/rabbitmq-cluster-operator-54f948d8b6 1 1 1 2m10s
  • 一个新的自定义资源 rabbitmqclusters.rabbitmq.com。自定义资源允许我们为 RabbitMQ 集群的创建定义 API。
kubectl get customresourcedefinitions.apiextensions.k8s.io

NAME CREATED AT
...
rabbitmqclusters.rabbitmq.com 2021-01-14T11:12:26Z
...
  • 以及一些 rbac 角色。Operator 需要这些角色来创建、更新和删除 RabbitMQ 集群。

你好,RabbitMQ!

现在我们已经部署了 Operator,让我们创建一个最简单的 RabbitMQ 集群。

此示例可以在 Cluster Operator GitHub 仓库 中找到。正如页面上提到的

这是最简单的 RabbitmqCluster 定义。唯一显式指定的属性是集群的名称。其他所有内容都将根据 Cluster Operator 的默认值进行配置。

examples 文件夹 中还有许多其他参考示例,例如创建具有 TLS、mTLS 的 RabbitMQ 集群、设置具有生产默认值的集群、添加社区插件等。

继续我们的示例,我们将向 Kubernetes 提交以下 yaml

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: hello-world

使用以下命令提交

kubectl apply -f https://raw.githubusercontent.com/rabbitmq/cluster-operator/main/docs/examples/hello-world/rabbitmq.yaml

这将在当前命名空间中创建一个名为 hello-world 的 RabbitMQ 集群。您可以查看 RabbitMQ 集群的创建过程

watch kubectl get all

NAME READY STATUS RESTARTS AGE
pod/hello-world-server-0 1/1 Running 0 2m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hello-world ClusterIP 10.75.242.149 <none> 5672/TCP,15672/TCP 2m
service/hello-world-nodes ClusterIP None <none> 4369/TCP,25672/TCP 2m
service/kubernetes ClusterIP 10.75.240.1 <none> 443/TCP 4h1m

NAME READY AGE
statefulset.apps/hello-world-server 1/1 2m

如果 pod 没有运行(其状态为 Pending)并且您正在部署到资源受限的集群(例如,kindminikube 等本地环境),您可能需要调整集群的 CPU 和/或内存限制。默认情况下,Operator 将 RabbitmqCluster pod 配置为请求 1CPU 和 2GB 内存。查看 resource-limits 示例 以了解如何调整这些值。

您还将能够看到创建的 rabbitmqclusters.rabbitmq.com 自定义资源实例。

kubectl get rabbitmqclusters.rabbitmq.com

NAME AGE STATUS
hello-world 4m1s

您也可以使用 kubectl rabbitmq 插件列出已部署的 RabbitMQ 集群

kubectl rabbitmq list
NAME AGE STATUS
hello-world 4m10s

如果您的 Pod 卡在 Pending 状态,则很可能您的集群没有 Physical Volume Provisioner。可以通过以下方式验证

kubectl get pvc,pod
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistence-hello-world-server-0 Pending 30s

在这种情况下,如果这不是生产环境,您可能需要安装 Local Path Provisioner

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
kubectl annotate storageclass local-path storageclass.kubernetes.io/is-default-class=true

之后,您需要删除并重新创建之前创建的 RabbitMQ 集群对象

kubectl delete rabbitmqclusters.rabbitmq.com hello-world

查看 RabbitMQ 日志

为了确保 RabbitMQ 已正确启动,让我们查看 RabbitMQ 日志文件。这可以通过查看 RabbitMQ pod 日志来完成。在本例中,它将是

kubectl logs hello-world-server-0
...

## ## RabbitMQ 3.12.1
## ##
########## Copyright (c) 2005-2025 Broadcom. All Rights Reserved. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
###### ##
########## Licensed under the MPL 2.0. Website: https://rabbitmq.org.cn

Erlang: 26.0.1 [jit]
TLS Library: OpenSSL - OpenSSL 1.1.1u 30 May 2023
Release series support status: supported

Doc guides: https://rabbitmq.org.cn/documentation.html
Support: https://rabbitmq.org.cn/contact.html
Tutorials: https://rabbitmq.org.cn/tutorials.html
Monitoring: https://rabbitmq.org.cn/monitoring.html

...

如果您只关心查看日志,组件的详细信息会隐藏在 kubectl rabbitmq 插件中。在这里,您只需运行

kubectl rabbitmq tail hello-world

访问 Management UI

接下来,让我们访问 Management UI。

username="$(kubectl get secret hello-world-default-user -o jsonpath='{.data.username}' | base64 --decode)"
echo "username: $username"
password="$(kubectl get secret hello-world-default-user -o jsonpath='{.data.password}' | base64 --decode)"
echo "password: $password"

kubectl port-forward "service/hello-world" 15672

现在我们可以在浏览器中打开 localhost:15672 并查看 Management UI。凭据如上面的命令中打印的那样。或者,您可以运行 curl 命令来验证访问

curl -u$username:$password localhost:15672/api/overview
{"management_version":"3.8.9","rates_mode":"basic", ...}

使用 kubectl rabbitmq 插件,可以使用以下命令访问 Management UI

kubectl rabbitmq manage hello-world

将应用程序连接到集群

下一步是将应用程序连接到 RabbitMQ 集群,以便使用其消息传递功能。perf-test 应用程序在 RabbitMQ 社区中经常用于负载测试 RabbitMQ 集群。

在这里,我们将使用 hello-world 服务来查找连接地址,并使用 hello-world-default-user 来查找连接凭据。

username="$(kubectl get secret hello-world-default-user -o jsonpath='{.data.username}' | base64 --decode)"
password="$(kubectl get secret hello-world-default-user -o jsonpath='{.data.password}' | base64 --decode)"
service="$(kubectl get service hello-world -o jsonpath='{.spec.clusterIP}')"
kubectl run perf-test --image=pivotalrabbitmq/perf-test -- --uri amqp://$username:$password@$service

# pod/perf-test created

这些步骤在 kubectl rabbitmq 插件中是自动化的,只需运行

kubectl rabbitmq perf-test hello-world

我们现在可以通过运行以下命令查看 perf-test 日志

kubectl logs --follow perf-test
...
id: test-141948-895, time: 16.001s, sent: 25651 msg/s, received: 25733 msg/s, min/median/75th/95th/99th consumer latency: 1346110/1457130/1495463/1529703/1542172 µs
id: test-141948-895, time: 17.001s, sent: 26933 msg/s, received: 26310 msg/s, min/median/75th/95th/99th consumer latency: 1333807/1411182/1442417/1467869/1483273 µs
id: test-141948-895, time: 18.001s, sent: 26292 msg/s, received: 25505 msg/s, min/median/75th/95th/99th consumer latency: 1329488/1428657/1455482/1502191/1518218 µs
id: test-141948-895, time: 19.001s, sent: 23727 msg/s, received: 26055 msg/s, min/median/75th/95th/99th consumer latency: 1355788/1450757/1480030/1514469/1531624 µs
id: test-141948-895, time: 20.001s, sent: 25009 msg/s, received: 25202 msg/s, min/median/75th/95th/99th consumer latency: 1327462/1447157/1474394/1509857/1521303 µs
id: test-141948-895, time: 21.001s, sent: 28487 msg/s, received: 25942 msg/s, min/median/75th/95th/99th consumer latency: 1350527/1454599/1490094/1519461/1531042 µs
...

可以看出,perf-test 能够每秒生成和消费大约 25,000 条消息。

后续步骤

现在您已经掌握了基础知识并开始运行,您可以探索 Cluster Operator 可以为您做些什么!

您可以通过以下方式进行探索:

  1. 查看更多示例,例如 使用 Prometheus 监控已部署的 RabbitMQ 集群启用 TLS 等。
  2. 查看 API 参考文档
  3. 查看我们的 GitHub 仓库 并为本指南、其他文档和代码库做出贡献!
© . All rights reserved.