我有一个Kubernetes环境,其中有一个Rabbitmq服务台,部署了2盒RabbitMq。
我需要在Rabbitmq(延迟消息插件)上安装一个插件,但我不喜欢这种“手动”方式,因此,如果删除了pod,我必须再次安装该插件。
我想知道哪种是实现此目标的推荐方法。
仅供参考:手动方法是将文件复制到plugins文件夹中,然后启动以下命令:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
答案 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