暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何在Kubernetes部署RabbitMQ

原创 佩奇 2022-09-18
1506

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端口打开仪表盘。仪表板如下:

image.png

获取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集群。为了设置镜像,需要使用插件,这会在另一篇博客中介绍,因为这是一个独立的主题。

参考

原文标题:How to deploy Rabbit MQ on Kubernetes
原文作者:Dipayan Pramanik
原文地址:https://blog.knoldus.com/how-to-deploy-rabbit-mq-on-kubernetes/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论