K8s搭建-kubernetes搭建RabbitMQ

lishijian 2020-04-08

感谢分享原文-http://bjbsair.com/2020-04-03/tech-info/29908.html

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中获取消息并消费。

K8s搭建-kubernetes搭建RabbitMQ

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的主页。

K8s搭建-kubernetes搭建RabbitMQ

4、运行环境配置

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

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

相关推荐