RabbitMQ Cluster Kubernetes Operator 快速入门
这是使用 Cluster Operator 部署 RabbitMQ 集群并使其运行起来的最快方法。此快速入门中的步骤也在 KubeCon + CloudNativeCon North America 2021 演讲 RabbitMQ on Kubernetes 深度解析 中进行了演示。更多详细资源请参考 安装、使用 和 API 参考。
先决条件
- 访问 Kubernetes 集群版本 1.19 或更高版本
- 配置
kubectl
以访问集群
快速入门步骤
本指南将介绍以下步骤
- 安装 RabbitMQ Cluster Operator
- 使用 Operator 部署 RabbitMQ 集群
- 查看 RabbitMQ 日志
- 访问 RabbitMQ Management UI
- 将工作负载连接到集群
- 后续步骤
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
)并且您正在部署到资源受限的集群(例如,kind
或 minikube
等本地环境),您可能需要调整集群的 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 可以为您做些什么!
您可以通过以下方式进行探索:
- 查看更多示例,例如 使用 Prometheus 监控已部署的 RabbitMQ 集群、启用 TLS 等。
- 查看 API 参考文档。
- 查看我们的 GitHub 仓库 并为本指南、其他文档和代码库做出贡献!