如何在Openshift上正确设置RabbitMQ

时间:2017-08-08 13:38:15

标签: rabbitmq openshift

我使用此图片在OpenShift上创建了新应用:https://hub.docker.com/r/luiscoms/openshift-rabbitmq/

它成功运行,我可以使用它。我已经添加了一个持久卷。 但是,每次重新启动POD时,我都会放弃所有数据。这是因为RabbitMq使用主机名来创建数据库目录。

例如:

node           : rabbit@openshift-rabbitmq-11-9b6p7
home dir       : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash    : BsUC9W6z5M26164xPxUTkA==
log            : tty
sasl log       : tty
database dir   : /var/lib/rabbitmq/mnesia/rabbit@openshift-rabbitmq-11-9b6p7

如何将RabbitMq设置为始终使用相同的数据库目录?

3 个答案:

答案 0 :(得分:5)

您应该能够设置环境变量RABBITMQ_MNESIA_DIR以覆盖默认配置。这可以通过OpenShift控制台在部署配置中添加条目或通过oc工具完成,例如:

oc set env dc/my-rabbit RABBITMQ_MNESIA_DIR=/myDir

然后,您需要在Pod中以所需路径安装持久卷。既然你已经说它已经创建了,那么你只需要更新它,例如:

oc volume dc/my-rabbit --add --overwrite --name=my-pv-name --mount-path=/myDir

您需要确保在提供的装载路径上具有正确的r / w访问权限

编辑:基于评论中的问题的一些其他解决方法

动态主机名引起的问题可以通过多种方式解决:

1.(首选IMO)将部署移至StatefulSet。 StatefulSet将提供命名的稳定性,从而提供Pod的网络标识符,必须由无头服务提供。从版本3.5开始,此功能在Kubernetes 1.9和OpenShift技术预览版中都处于测试阶段。

  1. 如果Statefulsets不是选项,请设置Pod的主机名。这可以通过添加环境变量oc set env dc/example HOSTNAME=example来使主机名静态并将RABBITMQ_NODENAME设置为同样来完成。

答案 1 :(得分:0)

我能够通过设置HOSTNAME环境变量来使其工作。 OSE通常将该值设置为pod名称,因此每次pod重新启动时它都会更改。通过设置,当pod重新启动时,pod的主机名不会发生变化。

与持久卷结合使用队列,消息用户和我假设通过pod重新启动保持其他任何配置。

这是在OSE 3.2服务器上完成的。我刚刚在部署配置中添加了一个环境变量。您可以通过UI或使用OC CLI执行此操作:

oc set env dc/my-rabbit HOSTNAME=some-static-name

如果您为该服务运行多个pod,这可能会出现问题,但在这种情况下,您需要设置正确的RabbitMq群集,这是一个完全不同的野兽。

答案 2 :(得分:0)

在 K8s 上运行 RabbitMQ 的最简单、最安全的方法是 RabbitMQ Cluster Operator

对于 OpenShift,请确保另外遵循 https://www.rabbitmq.com/kubernetes/operator/install-operator.html#openshift 中的说明。