插件支持

插件机制

RabbitMQ 支持插件,通过多种方式扩展功能:支持更多协议、系统状态监控、额外的 AMQP 0-9-1 交换类型、节点联邦等。许多功能以插件形式实现,并随核心版本提供。

更多信息,请参考:如何使用 RabbitMQ 插件

操作说明

查看实例中支持的插件

选择 RabbitMQ 实例的任意节点,进入 Pods,执行以下命令以查看插件的支持和启用状态:

rabbitmq-plugins list

默认情况下,在实例创建时,插件 rabbitmq_peer_discovery_k8srabbitmq_prometheusrabbitmq_management 及其相关插件是启用的。

以下是镜像中包含的插件列表及其描述:

插件名称描述
rabbitmq_amqp1_0支持 AMQP 1.0 协议的插件,允许 AMQP 1.0 客户端连接到 RabbitMQ
rabbitmq_auth_backend_cache用于缓存身份验证结果的插件,提高 RabbitMQ 的身份验证性能,并减少对后端身份验证服务的请求
rabbitmq_auth_backend_http支持 HTTP 身份验证的插件,允许通过 HTTP 服务验证 RabbitMQ 用户
rabbitmq_auth_backend_ldap支持 LDAP 身份验证的插件,允许通过 LDAP 服务验证 RabbitMQ 用户
rabbitmq_auth_backend_oauth2支持 OAuth 2.0 身份验证的插件,允许通过 OAuth 2.0 服务验证 RabbitMQ 用户
rabbitmq_auth_mechanism_ssl支持 SSL 身份验证的插件,允许使用 SSL 证书验证 RabbitMQ 用户
rabbitmq_consistent_hash_exchange实现一致性哈希的插件,允许创建特殊的交换,基于消息路由键或头部计算哈希值,然后将消息发送到相应的队列
rabbitmq_delayed_message_exchange支持延迟消息的插件,允许创建特殊的交换,根据消息头设置延迟,临时将消息存储在内存或磁盘中,直到延迟过期,然后将消息发送到相应的队列
rabbitmq_event_exchange发布 RabbitMQ 事件的插件,允许创建特殊的交换,将各类 RabbitMQ 事件(如连接、通道、队列、用户、权限的创建、删除和修改等)发送到对应队列,支持多种事件类型和过滤选项
rabbitmq_federation连接多个 RabbitMQ 实例的插件,允许创建联邦,将消息从一个 RabbitMQ 实例转发到另一个
rabbitmq_federation_management管理 RabbitMQ 联邦的插件,允许通过 Web 界面查看和配置 RabbitMQ 联邦
rabbitmq_jms_topic_exchange支持 JMS 主题的插件,允许创建特殊的交换,根据消息的 JMSDestination 头部路由消息
rabbitmq_management管理和监控 RabbitMQ 的插件,提供 Web 界面,允许查看 RabbitMQ 的状态、配置、统计信息和日志,以及执行一些操作
rabbitmq_management_agent支持 RabbitMQ 管理的插件,提供代理,报告各种信息,如内存、磁盘、连接、通道、队列等的使用情况,并允许管理插件向 RabbitMQ 节点发送各种命令
rabbitmq_mqtt支持 MQTT 协议的插件,允许 MQTT 客户端连接到 RabbitMQ,支持多种特性,如 QoS、保留消息、遗嘱消息、主题过滤等
rabbitmq_peer_discovery_aws支持 AWS 节点发现的插件,可以自动发现并加入 AWS 环境中的 RabbitMQ 集群,支持各种 AWS 服务
rabbitmq_peer_discovery_common支持通用节点发现的插件,提供一些基本功能,如节点注册、注销、查询等,可供其他节点发现插件使用
rabbitmq_peer_discovery_consul支持 Consul 节点发现的插件,可以自动发现并加入 Consul 环境中的 RabbitMQ 集群
rabbitmq_peer_discovery_etcd支持 etcd 节点发现的插件,可以自动发现并加入 etcd 环境中的 RabbitMQ 集群
rabbitmq_peer_discovery_k8s支持 Kubernetes 节点发现的插件;允许自动发现并加入 Kubernetes 环境中的 RabbitMQ 集群
rabbitmq_prometheus支持 Prometheus 监控的插件;允许使用 Prometheus 收集和显示各种 RabbitMQ 指标
rabbitmq_random_exchange实现随机路由的插件,允许创建特殊的交换,随机将消息发送到一个或多个队列
rabbitmq_recent_history_exchange实现最近历史路由的插件,允许创建特殊的交换,将消息发送到最近接收消息的一个或多个队列
rabbitmq_sharding实现分片的插件,允许创建特殊的队列,在多个子队列之间分发消息
rabbitmq_shovel转发消息的插件,允许定义规则,将消息从一个队列或交换转发到另一个
rabbitmq_shovel_management管理 RabbitMQ 铲子的插件,允许通过 Web 界面查看和配置 RabbitMQ 铲子
rabbitmq_stomp支持 STOMP 协议的插件,允许使用 STOMP 客户端连接到 RabbitMQ,支持各种特性
rabbitmq_stream支持流协议的插件,允许创建特殊的队列,用于存储和传输大量有序消息
rabbitmq_stream_management管理 RabbitMQ 流的插件,允许通过 Web 界面查看和配置 RabbitMQ 流
rabbitmq_top查看 RabbitMQ 性能的插件,提供命令行界面,使您能够查看各种 RabbitMQ 资源的使用情况
rabbitmq_tracing跟踪 RabbitMQ 消息的插件,可以创建跟踪,记录 RabbitMQ 消息的内容和属性到文件或日志中
rabbitmq_trust_store管理 RabbitMQ 信任存储的插件,允许在 RabbitMQ 中存储和更新 SSL 证书
rabbitmq_web_dispatch支持 RabbitMQ Web 服务的插件,提供框架,用于定义和处理 RabbitMQ 内的 HTTP 请求
rabbitmq_web_mqtt支持通过 WebSockets 的 MQTT 的插件,允许使用 WebSocket 客户端连接到 RabbitMQ
rabbitmq_web_mqtt_examples演示通过 WebSockets 的 MQTT 的插件,提供多个示例
rabbitmq_web_stomp支持通过 WebSockets 的 STOMP 的插件,允许使用 WebSocket 客户端连接到 RabbitMQ
rabbitmq_web_stomp_examples演示通过 WebSockets 的 STOMP 的插件,提供多个示例

启用/禁用已包含在镜像中的插件

当需要启用或禁用已包含在镜像中的插件时,可以更新实例 YAML 文件中的相关字段。以 rabbitmq_shovel 为例:

additionalPlugins:
- rabbitmq_top
- rabbitmq_shovel

启用第三方或自定义插件

当需要启用未包含在镜像中的自定义插件或社区插件时,无法通过直接编辑 YAML 中的 additionalPlugins 来启用它们。相反,必须在启动 Pods 之前下载它们到容器中。

方法 1:环境能够访问互联网

  1. 更新 spec.override 字段以添加 sts 配置,在 initContainer 中下载插件。
  2. 更新 spec.rabbitmq.envConfig 字段以添加环境变量,配置插件路径。
  3. 更新 spec.rabbitmq.additionalPlugins 字段以启用插件。
  4. 实例准备就绪后,使用命令 rabbitmq-plugins list 检查插件是否启用。

下面示例 YAML 如下:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  name: test
  labels:
    prometheus.io/port: "15692"
    prometheus.io/scrape: "true"
spec:
  version: 3.12.4
  replicas: 3
  resources:
    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "1"
      memory: 2Gi
  service:
    type: NodePort
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app.kubernetes.io/name: test
          topologyKey: kubernetes.io/hostname
  rabbitmq:
    additionalPlugins:
      - rabbitmq_management_exchange
    envConfig: |
      RABBITMQ_PLUGINS_DIR=/opt/rabbitmq/plugins:/opt/rabbitmq/community-plugins
  override:
    statefulSet:
      spec:
        template:
          spec:
            containers:
              - name: rabbitmq
                volumeMounts:
                  - mountPath: /opt/rabbitmq/community-plugins
                    name: community-plugins
            volumes:
              - name: community-plugins
                emptyDir: {}
            initContainers:
              - command:
                  - sh
                  - -c
                  - curl -L -v https://github.com/rabbitmq/rabbitmq-management-exchange/releases/download/v3.12.0/rabbitmq_management_exchange-3.12.0.ez --output /community-plugins/rabbitmq_management_exchange-3.12.0.ez
                image: curlimages/curl  # 或其他含 curl 命令的镜像
                imagePullPolicy: IfNotPresent
                name: copy-community-plugins
                resources:
                  limits:
                    cpu: 100m
                    memory: 500Mi
                  requests:
                    cpu: 100m
                    memory: 500Mi
                terminationMessagePolicy: FallbackToLogsOnError
                volumeMounts:
                  - mountPath: /community-plugins/
                    name: community-plugins
  persistence:
    storageClassName: aaaaaa
    storage: 1Gi

方法 2:环境无法访问互联网

  1. 更新 spec.override 字段以添加 sts 配置,通过 hostPath 将插件挂载到容器中。确保调度实例的节点上的目录存在(在本例中为 /root/yh/community-plugins),并确保将插件放置在该目录中。
  2. 更新 spec.rabbitmq.envConfig 字段以添加环境变量,配置插件路径。
  3. 更新 spec.rabbitmq.additionalPlugins 字段以启用插件。
  4. 实例准备就绪后,使用命令 rabbitmq-plugins list 检查插件是否启用。

下面示例 YAML 如下:

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  name: test
  labels:
    prometheus.io/port: "15692"
    prometheus.io/scrape: "true"
spec:
  version: 3.12.4
  replicas: 3
  resources:
    requests:
      cpu: "1"
      memory: 2Gi
    limits:
      cpu: "1"
      memory: 2Gi
  service:
    type: NodePort
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchLabels:
              app.kubernetes.io/name: test
          topologyKey: kubernetes.io/hostname
  rabbitmq:
    additionalPlugins:
      - rabbitmq_management_exchange
    envConfig: |
      RABBITMQ_PLUGINS_DIR=/opt/rabbitmq/plugins:/opt/rabbitmq/community-plugins
  override:
    statefulSet:
      spec:
        template:
          spec:
            containers:
              - name: rabbitmq
                resources: {}
                volumeMounts:
                  - mountPath: /opt/rabbitmq/community-plugins
                    name: community-plugins
            initContainers:
              - command:
                  - sh
                  - -c
                  - cp -r /temp-plugins/* /community-plugins/ && chown 999:999
                    /community-plugins/* && chmod 755 /community-plugins/*
                image: registry.alauda.cn:60080/middleware/rabbitmq/rabbitmq3124-management:v3.15.0 # 也可以使用其他镜像
                name: copy-community-plugins
                resources: {}
                securityContext:
                  privileged: true
                  runAsGroup: 0
                  runAsUser: 0
                volumeMounts:
                  - mountPath: /community-plugins/
                    name: community-plugins
                  - mountPath: /temp-plugins/
                    mountPropagation: Bidirectional
                    name: temp-plugins
            volumes:
              - emptyDir: {}
                name: community-plugins
              - hostPath:
                  path: /root/yh/community-plugins # 主机上插件的目录
                  type: Directory
                name: temp-plugins
  persistence:
    storageClassName: aaaaaa
    storage: 1Gi

升级影响说明

  • 当实例需要升级时,请确保在升级前后实例配置中启用了相关插件,以确保功能正常。
  • 若社区存在已弃用的插件,应及时将其下线。
  • 启用自定义或第三方插件时,请确保版本之间的兼容性。