kubernetes-部署RabbitMQ

1、RabbitMQ简介

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言灯条件的限制。AMQP具有如下的特性:

  • 可靠性(Reliablity):使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
  • 灵活的路由(Flexible Routing):在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
  • 消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • 多种协议(Multi-protocol):支持多种消息队列协议,如STOMP、MQTT等。
  • 多种语言客户端(Many Clients):几乎支持所有常用语言,比如Java、.NET、Ruby等。
  • 管理界面(Management UI):提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
  • 跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
  • 插件机制(Plugin System):提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。

RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费。

2、RabbitMQ部署

下面是RabbitMQ部署的定义代码,此代码由两部分组成,即RabbitMQ部署的部署以及其代理服务。镜像使用的是bitnami/rabbitmq:latest。通过NodePort模式对外暴露了15672和5672端口,并通过nfs文件系统对RabbitMQ的数据进行持久化。

#-------------定义RabbitMQ部署-----------------
apiVersion: apps/v1beta2
kind: Deployment
metadata:
 name: rabbit
spec:
 replicas: 1
 selector:
   matchLabels:
     app: rabbit
 strategy:
   rollingUpdate:
     maxSurge: 25%
     maxUnavailable: 25%
   type: RollingUpdate
 template:
   metadata:
     labels:
       app: rabbit
   spec:
     containers:
     - image: bitnami/rabbitmq:latest
       imagePullPolicy: IfNotPresent
       name: rabbit
       ports:
       - containerPort: 15672
         name: rabbit15672
         protocol: TCP
       - containerPort: 5672 
         name: rabbit5672 
         protocol: TCP
       resources: {}
       volumeMounts:
       - mountPath: /bitnami
         name: rabbit-persistent-storage
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: rabbit-persistent-storage
        nfs:
         path: /home/nfs-share/rabbit
         server: 10.0.33.201

#-----------------定义rabbit的代理服务--------------
apiVersion: v1
kind: Service
metadata:
 name: rabbit-service
spec:
 ports:
 - name: rabbit15672
   nodePort: 31199
   port: 15672
   protocol: TCP
   targetPort: 15672
 - name: rabbit15672 
   nodePort: 305672 
   port: 5672 
   protocol: TCP 
   targetPort: 5672
 selector:
   app: rabbit
 type: NodePort

通过kubectl,执行下面的命令在Kubernetes集群中部署Oracle数据库。

$ kubectl create -f rabbitmq.yaml --namespace=kube-public

在部署完成后,通过下面的命令可以查看RabbitMQ暴露的端口:

$ kubectl get svc --namespace=kube-public

3、部署验证

在浏览器中输入:http://10.0.33.203:31199/,访问部署好的RabbitMQ。在登录页面输入用户名和密码(此处初始user/bitnami),系统将会进入RabbitMQ的主页。

4、运行环境配置

在部署时,可以通过设置下面的环境变量来改变容器的运行时:

  • RABBITMQ_USERNAME: 用户名,默认值为user
  • RABBITMQ_PASSWORD: 密码,默认值为bitnami
  • RABBITMQ_HASHED_PASSWORD: 哈希密码
  • RABBITMQ_VHOST: 安装后启动创建的虚拟主机,默认值为 /
  • RABBITMQ_ERL_COOKIE: Erlang cookie用于确定不同的节点之间是否允许行互相通信。
  • RABBITMQ_NODE_TYPE: 节点类型,有限制: statsqueue-ram or queue-disc。 默认值为stats
  • RABBITMQ_NODE_NAME: 节点名称和主机,例如: node@hostnamenode 。默认值为rabbit@localhost。
  • RABBITMQ_NODE_PORT_NUMBER: 节点端口,默认值为5672
  • RABBITMQ_CLUSTER_NODE_NAME: 集群名称,例如:clusternode@hostname
  • RABBITMQ_CLUSTER_PARTITION_HANDLING: 集群分区恢复机制,默认值为: ignore
  • RABBITMQ_MANAGER_PORT_NUMBER: 管理端口,默认值为15672
  • RABBITMQ_DISK_FREE_LIMIT: Rabbitmq存储数据的可用空间限制,当低于该值的时候,将触发流量限制。默认值为 {mem_relative, 1.0}
  • RABBITMQ_ULIMIT_NOFILES: 资源限制, 打开文件描述符的最大数目,默认值为65536

作者简介:

季向远,北京神舟航天软件技术有限公司。本文版权归原作者所有。

K8S中文社区微信公众号

评论 1

登录后评论

立即登录  

  1. #1

    问题太多了

    lalala3年前 (2021-01-22)