我使用此图片在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设置为始终使用相同的数据库目录?
答案 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技术预览版中都处于测试阶段。
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 中的说明。