我正在尝试在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
这是正确的方法吗?如果节点名称相同,我仍然可以聚集多个实例吗?
答案 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/dns#A 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的角度来看,这种方法可能几乎相同。