RabbitMQ是遵循AMQP协议的消息Broker。Rabbit MQ最重要的组件是Broker。Broker负责存储生产者发送到消息队列中的消息。消费者从Broker消费消息并确认。一旦Broker收到确认后,消息就会被删除。因此重点是部署一个高可用的rabbitmq集群。这个集群应该至少一个节点。消息应该是同步的。这增加了在 Kubernetes 上部署和管理 rabbitmq 的复杂性。为了简化 kubernetes 上的rabbitmq,rabbitmq operator出现了。该operator会包括RabbitmqCluster 类型的 CRDs 。然后我们可以使用该资源来定义一个集群,而不必担心复制和其他问题。
前置条件
- Helm 3
- kubectl客户端
- Kubernetes集群
部署RabbitMQ集群
首先部署RabbitMQ operator,用来创建rabbitmq的CRDs,执行下面命令:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install rabbit-operator bitnami/rabbitmq-cluster-operator --namespace rabbitmq --create-namespace --atomic
验证执行命令效果:
kubectl get crds
我们将看到一个CRD RabbitmqCluster存在。我们使用这个 CRD 来创建一个 rabbitmq 集群。创建一个 cluster.yaml 内容文件如下:
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
name: rabbitmq-cluster
spec:
replicas: 3
override:
statefulSet:
spec:
podManagementPolicy: OrderedReady
service:
type: ClusterIP
persistence:
storageClassName: standard
storage: 20Gi
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- rabbitmq-cluster
topologyKey: kubernetes.io/hostname
rabbitmq:
additionalPlugins:
- rabbitmq_federation
additionalConfig: |
disk_free_limit.absolute = 500MB
vm_memory_high_watermark.relative = 0.6
使用下面命令apply yaml文件:
kubectl apply -f cluster.yaml -n rabbitmq
# To verify the pods are created
kubectl get po -n rabbitmq
暴露RabbitMQ 仪表盘
我们将创建一个ingress 来暴露仪表板。执行以下命令:
kubectl create ing rabbit-ing-1 --class <ingress-class> --rule="<hostname>/*=rabbitmq-cluster:15672" -n rabbitmq
替换上述命令中的占位符 < ingress-class > 和 < hostname > ,并执行它。将主机名的具体条目添加到 DNS 中的 IP。打开该链接时,就可以看到 RabbitMQ 仪表板。
我们还可以使用port-forward来公开仪表板。port-forward如下:
kubectl port-forward svc/rabbitmq-cluster -n rabbitmq 8091:15672
然后,我们可以在localhost:8091端口打开仪表盘。仪表板如下:

获取RabbitMQ用户名和密码
执行下面命令获取rabbitmq的用户名和密码:
# Username
kubectl get secret rabbitmq-cluster-default-user -o jsonpath="{.data.username}" -n rabbitmq | base64 -d
# Password
kubectl get secret rabbitmq-cluster-default-user -n rabbitmq -o jsonpath="{.data.password}" | base64 -d
使用上述凭证登录到rabbitmq。在主页上可以看到节点的状态,内存使用情况和可用空间。
测试部署情况
为了测试rabbitmq是否工作,创建一个具有以下内容的 publisher.yaml:
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-publisher
type: Opaque
stringData:
RABBIT_USERNAME: <username>
RABBIT_PASSWORD: <password>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq-publisher
labels:
app: rabbitmq-publisher
spec:
selector:
matchLabels:
app: rabbitmq-publisher
replicas: 1
template:
metadata:
labels:
app: rabbitmq-publisher
spec:
containers:
- name: rabbitmq-publisher
image: aimvector/rabbitmq-publisher:v1.0.0
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: RABBIT_HOST
value: "rabbitmq-cluster.rabbitmq.svc.cluster.local"
- name: RABBIT_PORT
value: "5672"
- name: RABBIT_USERNAME
valueFrom:
secretKeyRef:
name: rabbitmq-publisher
key: RABBIT_USERNAME
- name: RABBIT_PASSWORD
valueFrom:
secretKeyRef:
name: rabbitmq-publisher
key: RABBIT_PASSWORD
---
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-publisher
labels:
app: rabbitmq-publisher
spec:
type: LoadBalancer
selector:
app: rabbitmq-publisher
ports:
- protocol: TCP
name: http
port: 80
targetPort: 80
将占位符< username >和< password >替换为数值,并apply yaml文件。现在执行以下命令并替换占位符< load-balancer-ip >。
curl -X POST http://<load-balancer-ip>/publish/hello
如果我们检查publisher pod的日志,会在日志中看到这条消息。如果我们进入rabbitmq仪表盘,在队列中我们会发现发送的消息。
总结
在这篇博客中,我们看到如何在kubernetes上部署一个高可用的RabbitMQ集群。为了设置镜像,需要使用插件,这会在另一篇博客中介绍,因为这是一个独立的主题。
参考
- Operator:https://bitnami.com/stack/rabbitmq-cluster-operator/helm
- RabbitMQ介绍: https://blog.knoldus.com/introduction-to-rabbitmq/
原文标题:How to deploy Rabbit MQ on Kubernetes
原文作者:Dipayan Pramanik
原文地址:https://blog.knoldus.com/how-to-deploy-rabbit-mq-on-kubernetes/




