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

时间:2016-04-26 06:40:05

标签: amazon-ec2 dns rabbitmq kubernetes hostname

我正在尝试在AWS上使用Kubernetes运行Rabbitmq。我正在使用official Rabbitmq docker container。每次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)

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

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

RABBITMQ_NODENAME设置为可解析的DNS名称会中断:

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

RABBITMQ_USE_LONGNAME设置为true会打破:

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
    
  • 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
    

这是正确的方法吗?如果节点名称相同,我仍然可以聚集多个实例吗?

2 个答案:

答案 0 :(得分:3)

我们的想法是使用不同的服务'和'部署'对于您要创建的每个节点。

正如你所说,你必须为每个人创建一个自定义的NODENAME:

RABBITMQ_NODENAME=rabbit@rabbitmq-1

还必须从每个节点解析rabbitmq-1,rabbitmq-2,rabbitmq-3。为此你可以使用kubedns。 /etc/resolv.conf将如下所示:

search rmq.svc.cluster.local 

/etc/hosts必须包含:

127.0.0.1 rabbitmq-1  # or rabbitmq-2 on node 2...

这里的服务是为每个节点创建一个稳定的网络标识

rabbitmq-1.svc.cluster.local
rabbitmq-2.svc.cluster.local
rabbitmq-3.svc.cluster.local

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

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

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

答案 1 :(得分:2)

除了@ ant31的第一个回复:

Kubernetes现在允许设置主机名,例如在yaml:

template:
  metadata:
    annotations:
      "pod.beta.kubernetes.io/hostname": rabbit-rc1

请参阅https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dnsA Records and hostname Based on Pod Annotations - A Beta Feature in Kubernetes v1.2

似乎整个配置活动多次重启或重新安排。我没有设置群集但是我要按照mongodb的教程进行操作,请参阅https://www.mongodb.com/blog/post/running-mongodb-as-a-microservice-with-docker-and-kubernetes

从kubernetes的角度来看,这种方法可能几乎相同。