在Kubernetes上运行时,更改主机名会破坏Rabbitmq

Pie*_*rwe 8 dns hostname amazon-ec2 rabbitmq kubernetes

我正在尝试使用AWS上的Kubernetes运行Rabbitmq.我正在使用正式的Rabbitmq docker容器.每次pod重新启动时,rabbitmq容器都会获得一个新的主机名.我已经为具有可解析的DNS名称的pod设置了一个服务(类型为LoadBalancer).

但是,当我使用EBS使兔子配置/消息/队列在重新启动之间保持持久性时,它会断开:

exception exit: {{failed_to_cluster_with,
                     ['rabbitmq@rabbitmq-deployment-2901855891-nord3'],
                     "Mnesia could not connect to any nodes."},
                 {rabbit,start,[normal,[]]}}
  in function  application_master:init/4 (application_master.erl, line 134)
Run Code Online (Sandbox Code Playgroud)

rabbitmq-deployment-2901855891-nord3是以前的主机名rabbitmq容器.这几乎就像Mnesia保存了旧的主机名: - /

容器的信息如下所示:

              Starting broker...
=INFO REPORT==== 25-Apr-2016::12:42:42 ===
node           : rabbitmq@rabbitmq-deployment-2770204827-cboj8
home dir       : /var/lib/rabbitmq
config file(s) : /etc/rabbitmq/rabbitmq.config
cookie hash    : XXXXXXXXXXXXXXXX
log            : tty
sasl log       : tty
database dir   : /var/lib/rabbitmq/mnesia/rabbitmq
Run Code Online (Sandbox Code Playgroud)

我只能将节点名称的第一部分设置为rabbitmq使用RABBITMQ_NODENAME环境变量.

设置RABBITMQ_NODENAME为可解析的DNS名称会破坏:

Can't set short node name!\nPlease check your configuration\n"

设置RABBITMQ_USE_LONGNAMEtrue中断:

Can't set long node name!\nPlease check your configuration\n"

更新:

  • 设置RABBITMQ_NODENAME为rabbitmq @ localhost有效,但是否定了集群实例的任何可能性.

              Starting broker...
    =INFO REPORT==== 26-Apr-2016::11:53:19 ===
    node           : rabbitmq@localhost
    home dir       : /var/lib/rabbitmq
    config file(s) : /etc/rabbitmq/rabbitmq.config
    cookie hash    : 9WtXr5XgK4KXE/soTc6Lag==
    log            : tty
    sasl log       : tty
    database dir   : /var/lib/rabbitmq/mnesia/rabbitmq@localhost
    
    Run Code Online (Sandbox Code Playgroud)
  • 设置RABBITMQ_NODENAME为服务名称,在这种情况下rabbitmq-service像rabbitmq @ rabbitmq-service也可以工作,因为kubernetes服务名称可以通过DNS在内部解析.

              Starting broker...
    =INFO REPORT==== 26-Apr-2016::11:53:19 ===
    node           : rabbitmq@rabbitmq-service
    home dir       : /var/lib/rabbitmq
    config file(s) : /etc/rabbitmq/rabbitmq.config
    cookie hash    : 9WtXr5XgK4KXE/soTc6Lag==
    log            : tty
    sasl log       : tty
    database dir   : /var/lib/rabbitmq/mnesia/rabbitmq@rabbitmq-service
    
    Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?如果节点名称相同,我还能集群多个实例吗?

ant*_*t31 4

这个想法是为您想要创建的每个节点使用不同的“服务”和“部署”。

正如您所说,您必须为每个即创建一个自定义 NODENAME:

RABBITMQ_NODENAME=rabbit@rabbitmq-1
Run Code Online (Sandbox Code Playgroud)

还得rabbitmq-1,rabbitmq-2,rabbitmq-3从各个节点来解决。为此,您可以使用 kubedns。遗嘱/etc/resolv.conf将如下所示:

search rmq.svc.cluster.local 
Run Code Online (Sandbox Code Playgroud)

并且/etc/hosts必须包含:

127.0.0.1 rabbitmq-1  # or rabbitmq-2 on node 2...
Run Code Online (Sandbox Code Playgroud)

这些服务的目的是为每个节点创建稳定的网络身份

rabbitmq-1.svc.cluster.local
rabbitmq-2.svc.cluster.local
rabbitmq-3.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

不同的deployments资源将允许您在每个节点上安装不同的卷。

我正在开发一个部署工具来简化这些操作:我已经完成了一个演示,介绍如何在 kubernetes 上将rabbitmq从 1 个节点扩展和部署到 3 个节点:https: //asciinema.org/a/2ktj7kr2d2m3w25xrpz7mjkbu ?speed=1.5

更一般地说,部署集群应用程序所面临的复杂性在“petset提案”中得到解决:https ://github.com/kubernetes/kubernetes/pull/18016