# 在Kubernetes中使用RabbitMQ 经验分享

> 作者/来源: UCloud 运营管理员
> 发布时间: 2023-01-11T05:20:00.000Z
> 分类: 解决方案
> 标签: AI, 安全, Kubernetes
> 原文链接: http://117.50.162.249:3000/yun/articles/1347

---

# 在Kubernetes中使用RabbitMQ 经验分享

> 来源: https://www.ucloud.cn/yun/129560.html
> 作者: IT那活儿
> 发布日期: 发布于2023-01-11 13:20

在Kubernetes中使用RabbitMQ 经验分享

## **点击上方“IT那活儿”，关注后了解更多内容，不管IT什么活儿，干就完了！！！**

在实际工作中我们常常遇见部署各类中间件服务，例如Redis、etcd、memcache、RabbitMQ等，通过Kubernetes部署这些中间件，极大的提高了运维效率，本文是针对RabbitMQ在工作中的小结。

前提条件

要完成本文后续的操作还需要以下条件：

- Kubernetes 1.19+
- Helm 3.2.0+
- PV provisioner support in the underlying infrastructure

安装Chart

```
helm install ops-test   --set auth.username=celery,auth.password=celery,auth.erlangCookie=secretcookie,persistence.storageClass=rook-cephfs-sc,replicaCount=3,persistence.size=1Gi bitnami/rabbitmq
```

**1. 参数说明**

- *auth.username  设置用户名*
- *auth.password  设置密码*
- *auth.erlangCookie 设置erlang cookie*
- *persistence.storageClass 设置数据存储*
- *replicaCount 设置副本数*

详细参数请访问：

*rabbitmq 8.29.0 · bitnami/bitnami (artifacthub.io)*

**2. 扩容**

副本数增加到10个。

```
helm upgrade ops-test --set auth.username=celery,auth.password=celery,auth.erlangCookie=secretcookie,persistence.storageClass=alicloud-nas-sp,replicaCount=10 bitnami/rabbitmq
```

**3. 缩容**

副本数缩减到5个。

```
helm upgrade ops-test --set auth.username=celery,auth.password=celery,auth.erlangCookie=secretcookie,persistence.storageClass=alicloud-nas-sp,replicaCount=5 bitnami/rabbitmq
```

注意：当队列（Queues）类型是仲裁队列（Quorum Queues）时，要先删除member。

使用命令：

```
rabbitmq-queues delete_member [-p ]  
```

注意不要使Member太低，太低可能会导致仲裁队列故障。

**4. 检查状态**

安装成功后等待集群创建成功，可通过以下两种方式检查运行状态：

**方式一：web方式**

```
kubectl port-forward --address 0.0.0.0 --namespace default svc/ops-test-rabbitmq 15672:15672
```

访问 15672，通过webui访问管理页面。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_000.png)

**方式二：命令行方式**

```
kubectl exec -it ops-test-rabbitmq-2 /bin/bashrabbitmqctl cluster_status
```

配置镜像队列

默认集群中的Queue只存在于它所创建的那个节点上，如果该节点挂了将会造成数据的丢失；使用镜像队列将会在所有其他节点上创建同样的队列，发送数据时所有的队列都会有消息。可以通过设置策略来设置镜像队列。

**设置策略时有两个关键参数**：ha-mode和ha-params。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_001.png)

**1. 设置策略**

登录集群中的任意节点，执行以下命令：

```
rabbitmqctl set_policy ha-all "^" {"ha-mode":"exactly","ha-params":4,"ha-sync-mode":"automatic"}
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_002.png)

**2. Queues详情**

点进一个ops13, 在Detail标签中，Node是当前提供服务的主节点，Mirrors是副本节点，因为"ha-params"参数值为4，所以会有1个主节点，3副本节点。当Node节点出现问题时会从Mirrors中选举一个mirror成为新的Node，提供服务。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_003.png)

**3. 故障切换**

当Node失效后会从Mirrors中选择一个节点充当Node节点。

配置仲裁队列

仲裁队列(Quorum Queues)是RabbitMQ3.8.0版本的新的队列类型，它基于Raft共识算法实现的持久的FIFO队列。

仲裁队列类型是持久的镜像队列的一种替代方法，主要目标是解决集群中的数据安全。

**1. 创建仲裁队列**

在3.8.0版本可以使用。声明仲裁队列和声明普通队列方法一样，只需要把x-queue-type设置为quorum即可。

仲裁队列适用数据安全性很高的场景（例如订单系统、选举系统等）。

在创建队列的时候添加以下参数：

```
"x-queue-type": "quorum", # 声明队列类型为仲裁队列"x-quorum-initial-group-size": 5 # 声明仲裁队列组成员数量，（默认为3，也是最小值），建议成员数量为奇数
```

添加成员：

```
rabbitmq-queues add_member [-p ]  
```

删除成员：

```
rabbitmq-queues delete_member [-p ]  
```

**2. Queues详情**

登陆管理页面，找到队列类型是quorum的队列，在Detail标签中可以看到当前队列的member成员、Online成员和Leader节点。

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_004.png)

**3. 故障切换**

当Leader 节点出现故障不能提供服务时会从所有Online节点中选择一个成为新的Leader节点。

如果Online节点不多时，可以添加member成员：

```
rabbitmq-queues add_member [-p ]  
```

当member成员不可用时，可以删除成员：

```
rabbitmq-queues delete_member [-p ]  
```

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_005.png)

## 本文作者：王玉坤

## 本文来源：IT那活儿（上海新炬王翦团队）

![](https://ucloud-blog.cn-bj.ufileos.com/articles/129560/images/129560_006.png)