跳至主内容

RabbitMQ 集群 Kubernetes Operator 快速入门

这是通过集群 Operator 部署 RabbitMQ 集群最快捷的方法。本快速入门中的步骤也在 KubeCon + CloudNativeCon North America 2021 的演讲《RabbitMQ on Kubernetes 深入探讨》中进行了演示。更多详细资源请查看安装使用API 参考

先决条件

  • 拥有 Kubernetes 集群 1.19 或更高版本的访问权限
  • 已配置用于访问该集群的 kubectl

快速入门步骤

本指南将引导您完成以下步骤

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

kubectl rabbitmq 插件

快速入门中的许多步骤——如安装 operator、访问管理界面、获取 RabbitMQ 集群凭据等——通过 kubectl rabbitmq 插件可以更轻松地完成。虽然也有不使用该插件的说明,但安装插件会使这些命令更简单。要安装插件,请参阅其安装说明

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

安装 RabbitMQ 集群 Operator

让我们从安装最新版本的集群 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

集群 Operator 也可以使用 kubectl rabbitmq 插件进行安装

kubectl rabbitmq install-cluster-operator

安装集群 Operator 会创建一系列 Kubernetes 资源。分解来看,包括:

  • 一个新的命名空间 rabbitmq-system。集群 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 集群。

此示例可在 集群 Operator GitHub 仓库中找到。正如页面所述

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

示例文件夹中还有许多其他参考资料,例如创建带有 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 请求 1 个 CPU 和 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 状态,很可能是因为您的集群没有物理卷配置器(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-2026 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

访问管理界面

接下来,让我们访问管理界面。

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 并查看管理界面。凭据如上述命令中打印的那样。或者,您可以运行 curl 命令来验证访问权限

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

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

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 条消息的速度生产和消费。

后续步骤

既然您已经掌握了基本操作,就可以探索集群 Operator 还能为您做些什么了!

您可以:

  1. 查看更多示例,例如使用 Prometheus 监控已部署的 RabbitMQ 集群启用 TLS 等。
  2. 查看 API 参考文档
  3. 访问我们的 GitHub 仓库,并为本指南、其他文档和代码库做出贡献!
© . This site is unofficial and not affiliated with VMware.