如何在kubernetes上安装Rabbitmq插件?

时间:2018-06-29 06:59:47

标签: kubernetes rabbitmq rabbitmqctl

我有一个Kubernetes环境,其中有一个Rabbitmq服务台,部署了2盒RabbitMq。

我需要在Rabbitmq(延迟消息插件)上安装一个插件,但我不喜欢这种“手动”方式,因此,如果删除了pod,我必须再次安装该插件。

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

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

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

3 个答案:

答案 0 :(得分:2)

您应该从配置映射中安装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来下载文件,开始之前。这是example of postStart

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我已经使用以下生命周期挂钩来启用插件:

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
相关问题