跳至主内容

RabbitMQ Cluster Kubernetes Operator 快速入门

这是部署由 Cluster Operator 部署的 RabbitMQ 集群最快的方式。本快速入门中的步骤也在 KubeCon + CloudNativeCon North America 2021 的演讲 RabbitMQ on Kubernetes Deep Dive 中有所演示。更详细的资源可在 安装使用API 参考 中找到。

先决条件

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

快速入门步骤

本指南将介绍以下步骤

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

kubectl rabbitmq 插件

快速入门中的许多步骤——安装 operator、访问 Management UI、获取 RabbitMQ Cluster 的凭证——都可以通过 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

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

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 的默认值进行配置。

示例文件夹 包含许多其他参考,例如使用 TLS、mTLS 创建 RabbitMQ 集群、使用生产默认值设置集群、添加社区插件等。

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

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 内存。请查看 资源限制示例 以了解如何调整这些值。

您还将能够看到创建的 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 状态,很可能是因为您的集群没有物理卷提供程序。这可以按以下方式验证

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.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.cn/documentation.html
Support: https://rabbitmq.cn/contact.html
Tutorials: https://rabbitmq.cn/tutorials.html
Monitoring: https://rabbitmq.cn/monitoring.html

...

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

kubectl rabbitmq tail hello-world

访问管理 UI

接下来,让我们访问管理 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 并看到管理 UI。凭证如上面命令所示。或者,您可以运行一个 curl 命令来验证访问

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

使用 kubectl rabbitmq 插件,可以通过以下方式访问管理 UI

kubectl rabbitmq manage hello-world

将应用程序连接到集群

下一步是连接一个应用程序到 RabbitMQ 集群,以便使用其消息传递功能。rabbitmq 社区经常使用 perf-test 应用程序来对 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 仓库 并为本指南、其他文档和代码库做出贡献!
© . This site is unofficial and not affiliated with VMware.