RabbitMQ 集群 Kubernetes 运算符快速入门
这是使用集群运算符部署的 RabbitMQ 集群快速入门的最快速方法。此快速入门中的步骤也在 KubeCon + CloudNativeCon 北美 2021 演讲RabbitMQ on Kubernetes 深入探讨中进行了演示。有关安装、使用和API 参考的更详细资源可用。
先决条件
- 访问 Kubernetes 集群版本 1.19 或更高版本
- 已配置为访问集群的
kubectl
快速入门步骤
本指南将介绍以下步骤
- 安装 RabbitMQ 集群运算符
- 使用运算符部署 RabbitMQ 集群
- 查看 RabbitMQ 日志
- 访问 RabbitMQ 管理 UI
- 将工作负载附加到集群
- 后续步骤
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
)并且您正在部署到资源受限的集群(例如kind
或minikube
之类的本地环境),则可能需要调整集群的 CPU 和/或内存限制。默认情况下,运算符将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
状态,则很可能是您的集群没有物理卷提供程序。这可以通过以下方式验证
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 条消息。
后续步骤
现在您已经掌握了基础知识,您可以探索集群运算符可以为您做什么!
您可以通过以下方式做到这一点
- 查看更多示例,例如使用 Prometheus 监控已部署的 RabbitMQ 集群、启用 TLS等。
- 查看API 参考文档。
- 查看我们的GitHub 存储库并为本指南、其他文档和代码库做出贡献!