跳至主要内容

RabbitMQ 集群 Kubernetes 运算符快速入门

这是使用集群运算符部署的 RabbitMQ 集群快速入门的最快速方法。此快速入门中的步骤也在 KubeCon + CloudNativeCon 北美 2021 演讲RabbitMQ on Kubernetes 深入探讨中进行了演示。有关安装使用API 参考的更详细资源可用。

先决条件

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

快速入门步骤

本指南将介绍以下步骤

  1. 安装 RabbitMQ 集群运算符
  2. 使用运算符部署 RabbitMQ 集群
  3. 查看 RabbitMQ 日志
  4. 访问 RabbitMQ 管理 UI
  5. 将工作负载附加到集群
  6. 后续步骤

kubectl rabbitmq 插件

快速入门中的许多步骤(安装运算符、访问管理 UI、获取 RabbitMQ 集群的凭据)都通过kubectl rabbitmq插件变得更容易。虽然有无需使用插件即可遵循的说明,但获取插件将使这些命令更简单。要安装插件,请查看其安装说明

有关插件的扩展文档,请参阅kubectl插件指南

安装 RabbitMQ 集群运算符

让我们首先安装最新版本的集群运算符。这可以通过直接使用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插件进行安装

kubectl rabbitmq install-cluster-operator

安装集群运算符会创建大量 Kubernetes 资源。细分这些资源,我们有

  • 一个新的命名空间rabbitmq-system。集群运算符部署在此命名空间中创建。
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 角色。运算符需要这些角色才能创建、更新和删除 RabbitMQ 集群。

Hello RabbitMQ!

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

此示例可以在集群运算符 GitHub 存储库中找到。如页面上所述

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

示例文件夹有许多其他参考,例如创建具有 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 和/或内存限制。默认情况下,运算符将RabbitmqClusterPod 配置为请求 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状态,则很可能是您的集群没有物理卷提供程序。这可以通过以下方式验证

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

在这种情况下,如果这不是生产环境,您可能需要安装本地路径提供程序

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-2024 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 集群以使用其消息传递功能。该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 条消息。

后续步骤

现在您已经掌握了基础知识,您可以探索集群运算符可以为您做什么!

您可以通过以下方式做到这一点

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