跳转至

为 RabbitMQ 添加自定义插件

问题描述

RabbitMQ 有很多插件,但是在安装 RabbitMQ 时,只能安装默认的插件,如果需要安装其他插件,需要在安装完成后,手动安装。

解决方案

在创建的 RabbitMQ 的 yaml 中,增加 initContainer,用于下载插件,然后将插件挂在到 RabbitMQ 的插件目录中,最后在 rabbitmq 的 config 中,增加了插件的配置,并在启用的插件模块中启用插件。

示例

这里以 rabbitmq_message_timestamp-3.8.0.ez 为例,主要做的内容如下:

  • 增加了 initContainer,用于下载插件
  • 然后将插件挂在到 RabbitMQ 的插件目录中
  • 在 rabbitmq 的 config 中,增加了插件的配置
  • 并在启用的插件模块中启用插件

修改示例实例代码

- 

```yaml
apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  ...
status:
  ...
spec:
  image: docker.m.daocloud.io/library/rabbitmq:3.9.25-management-alpine
  override:
    service:
      spec:
        ports:
          - name: amqp
            port: 5672
            protocol: TCP
            targetPort: 5672
          - name: management
            port: 15672
            protocol: TCP
            targetPort: 15672
          - name: prometheus
            port: 15692
            protocol: TCP
            targetPort: 15692
    statefulSet:
      spec:
        template:
          spec:
          # 以下为增加部分
+           volumes:
+             - name: community-plugins
+               emptyDir: { }
+           initContainers:
+             - command:
+                 - sh
+                 - -c
+                 - curl -L -v https://github.com/rabbitmq/rabbitmq-message-timestamp/releases/download/v3.8.0/rabbitmq_message_timestamp-3.8.0.ez --output rabbitmq_message_timestamp-3.8.0.ez
+               image: docker.m.daocloud.io/curlimages/curl:7.70.0
+               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
        # 以上为增加部分
            containers:
              - name: rabbitmq
                ports:
                  - containerPort: 5672
                    name: amqp
                    protocol: TCP
                  - containerPort: 15672
                    name: management
                    protocol: TCP
                  - containerPort: 15692
                    name: prometheus
                    protocol: TCP
                resources: {}
                # 以下为增加部分
+               volumeMounts:
+                 - mountPath: /opt/rabbitmq/community-plugins
+                   name: community-plugins
                # 以上为增加部分
  persistence:
    storage: 1Gi
    storageClassName: hwameistor-storage-lvm-hdd
  rabbitmq:
+   envConfig: |
+     PLUGINS_DIR=/opt/rabbitmq/plugins:/opt/rabbitmq/community-plugins
      # 以上一行为增加部分
    additionalConfig: |

      log.console.level = info
      default_user=rabbitmq
      default_pass=UE81O6Y4^w$iWP86g
      cluster_partition_handling = pause_minority
      vm_memory_high_watermark_paging_ratio = 0.99
      disk_free_limit.relative = 1.0
      collect_statistics_interval = 10000
    additionalPlugins:
+     - rabbitmq_message_timestamp  # 增加次插件启用
      - rabbitmq_peer_discovery_k8s
      - rabbitmq_prometheus
      - rabbitmq_management
  replicas: 1
  resources:
    limits:
      cpu: 200m
      memory: 512Mi
    requests:
      cpu: 200m
      memory: 512Mi
  secretBackend: {}
  service:
    type: ClusterIP
  terminationGracePeriodSeconds: 604800
  tls: {}

这里的插件采用 github 官方作为下载地址,生成使用,建议自行维护插件位置,以免下载失败。

注意事项

目前支持手工在 YAML 编辑自定义资源的方式增加对应的插件,存在一定的操作风险性,建议谨慎操作。

评论