【问题标题】:How to install rabbitmq plugin on kubernetes?如何在 kubernetes 上安装 rabbitmq 插件?
【发布时间】:2018-06-29 06:59:47
【问题描述】:

我有一个 Kubernetes 环境,其中有一个 rabbitmq servirve,它部署了 2 个 rabbitmq pod。

我需要在rabbitmq上安装一个插件,(延迟消息插件)但是我不喜欢“手动”的方式,所以如果pod被删除了,我必须重新安装插件。

我想知道实现此目的的推荐方法。

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

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

【问题讨论】:

  • 您可以将 ConfigMap 的内容挂载到您的容器中。 Add ConfigMap data to a volume
  • 谢谢。我去看看
  • 我已经阅读了文档,但仍然可以理解如何将文件上传到 k8s。你能再解释一下吗?

标签: kubernetes rabbitmq rabbitmqctl


【解决方案1】:

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

例如:

配置映射:

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 下载文件预启动。这是example of postStart

【讨论】:

  • 是的,我明白了,但是如何上传插件的二进制文件呢?
  • 我明白了。也许调整图像使其已经存在是有意义的?或者,您可以使用Kubernetes life cycle hooks 下载文件预启动。这是example of postStart
  • 我已结束将持久卷安装到共享硬盘,并使用生命周期挂钩将文件复制到正确的路径
  • 让我将我的评论添加到答案中,如果它有助于解决您的问题。
【解决方案2】:

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

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

之前,我是使用生命周期向下载地址扔一个wget,然后解压并复制文件,但我认为上面更“优雅”

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/']

【讨论】:

    【解决方案3】:

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

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

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

    安装对我不起作用。我在 rabbitmq 中遇到错误,无法在 /etc/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
    

    【讨论】:

      猜你喜欢
      • 2019-06-19
      • 2023-03-31
      • 2020-06-21
      • 2020-11-11
      • 2020-04-07
      • 1970-01-01
      • 2019-02-23
      • 2017-09-04
      • 2019-04-05
      相关资源
      最近更新 更多