如何在 kubernetes 上安装 rabbitmq 插件?

How to install rabbitmq plugin on kubernetes?

我有一个带有 rabbitmq servirve 的 Kubernetes 环境,它部署了 2 pods 个 rabbitmq。

我需要在rabbitmq上安装一个插件,(Delayed Message Plugin)但是我不喜欢"manual"这种方式,所以如果pod被删除,我必须重新安装插件。

我想知道实现此目标的推荐方法是什么。

仅供参考:手动方式是将文件复制到插件文件夹中,然后启动以下命令:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

您应该从配置映射装载 RabbitMQ 的配置。

例如:

ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq-config
  namespace: rabbitmq
data:
  enabled_plugins: |
      [rabbitmq_management,rabbitmq_peer_discovery_k8s].
  rabbitmq.conf: |
      ...
  definitions.json: |
      ...

然后在您的 Deployment 或 StatefulSet 中:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: rabbitmq
  namespace: rabbitmq
spec:
  replicas: 3
  ...
  template:
    ...
    spec:
      containers:
      - image: rabbitmq:3.7.4-management-alpine
        imagePullPolicy: IfNotPresent
        name: rabbitmq
        volumeMounts:
        - name: config-volume
          mountPath: /etc/rabbitmq
        ...
      volumes:
        - name: config-volume
          configMap:
            name: rabbitmq-config
            items:
            - key: rabbitmq.conf
              path: rabbitmq.conf
            - key: enabled_plugins
              path: enabled_plugins
            - key: definitions.json
              path: definitions.json
       ...

首先有几种安装插件的方法。一种是基于您当前使用的图像,添加插件,然后改用新图像。或者你可以使用 Kubernetes life cycle hooks to download the file pre start. Here is an example of postStart

我已结束将持久卷挂载到共享硬盘驱动器,并使用生命周期挂钩将文件复制到正确的路径

  lifecycle:
    postStart:
      exec:
        command: ['sh', '-c', 'cp /data/rabbitmq_delayed_message_exchange-20171201-3.7.x.ez /opt/rabbitmq/plugins/']

之前我是用lifecycle丢个wget去下载url然后解压复制文件,不过我觉得上面更"elegant"

lifecycle:
          postStart:
                  exec:
                    command: ['sh', '-c', 'wget https://dl.bintray.com/rabbitmq/community-plugins/3.7.x/rabbitmq_delayed_message_exchange/rabbitmq_delayed_message_exchange-20171201-3.7.x.zip && unzip rabbitmq_delayed_message_exchange-20171201-3.7.x.zip -d /opt/rabbitmq/plugins/']

我使用了以下生命周期钩子来启用插件:

lifecycle:
  postStart:
    exec:
      command: ["/bin/sh", "-c", "rabbitmq-plugins --offline enable rabbitmq_management rabbitmq_peer_discovery_k8s rabbitmq_prometheus"]

需要使用--offline标志等待rabbitmq启动然后启用。

安装对我不起作用。我在无法在 /etc/rabbitmq 中写入文件的 rabbitmq 中遇到错误。由于这个 https://github.com/kubernetes/kubernetes/pull/58720

无法解决

在这里您可以看到一份清单示例:

---
apiVersion: v1
kind: Service
metadata:
  name: rabbitmq
  namespace: develop
spec:
  type: ClusterIP
  selector:
    app: rabbitmq
    tier: core
  ports:
    - name: port-5672-tcp
      port: 5672
    - name: port-15672-tcp
      port: 15672

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq
  namespace: develop
spec:
  replicas: 2
  selector:
    matchLabels:
      app: rabbitmq
      tier: core
  template:
    metadata:
      labels:
        app: rabbitmq
        tier: core
    spec:
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      volumes:
        - name: rabbitmq-storage
          persistentVolumeClaim:
            claimName: rabbitmq-pvc
      containers:
        - name: rabbitmq
          image: rabbitmq:3.8-management
          lifecycle:
            postStart:
              exec:
                command: ["/bin/sh", "-c", "rabbitmq-plugins --offline enable rabbitmq_management rabbitmq_peer_discovery_k8s rabbitmq_prometheus"]
          resources:
            requests:
              memory: 2Gi
              cpu: 1
            limits:
              memory: 2Gi
              cpu: 1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 5672
            - containerPort: 15672
          volumeMounts:
            - name: rabbitmq-storage
              mountPath: "/var/lib/rabbitmq/"
          env:
            - name: RABBITMQ_DEFAULT_USER
              valueFrom:
                secretKeyRef:
                  name: rabbitmq-username
                  key: RABBITMQ__USERNAME
            - name: RABBITMQ_DEFAULT_PASS
              valueFrom:
                secretKeyRef:
                  name: rabbitmq-password
                  key: RABBITMQ__PASSWORD
      nodeSelector:
        type: ultrafastest