Docker Swarm中RabbitMQ:如何按主机名发现任务实例
Docker Swarm中RabbitMQ DNS对等发现的问题
当前RabbitMQ集群配置
我在Docker Swarm中运行RabbitMQ集群,配置为全局服务,容器主机名设置为节点主机名,对应的docker-compose配置如下:
services: rabbitmq: image: "rabbitmq:3-management" hostname: "rabbitmq-{{.Node.Hostname}}" networks: - rabbitmq configs: - source: rabbitmq_config target: /etc/rabbitmq/rabbitmq.conf secrets: - source: rabbitmq_erlang_cookie target: /var/lib/rabbitmq/.erlang.cookie environment: RABBITMQ_NODENAME: "rabbit@rabbitmq-{{.Node.Hostname}}" deploy: mode: global
现有集群组建方式
目前每个节点会接收动态生成的配置文件来形成集群,生成该配置的脚本如下:
docker_hosts=$(docker node ls --format '{{.Hostname}}') count=0 for host in ${docker_hosts}; do count=$((count+1)) echo "cluster_formation.classic_config.nodes.${count} = rabbit@rabbitmq-${host}" >> rabbitmq.conf done
切换到DNS对等发现的阻碍
我希望将上述经典发现配置替换为DNS对等发现后端,实现自动发现其他任务,但遇到了问题:
Docker Swarm内置的DNS支持通过查询tasks.<service name>来发现服务任务,查询tasks.rabbitmq的结果如下:
root@rabbitmq-foo-1:/# nslookup tasks.rabbitmq Server: 127.0.0.11 Address: 127.0.0.11#53 Non-authoritative answer: Name: tasks.rabbitmq Address: 10.100.8.158 Name: tasks.rabbitmq Address: 10.100.8.162 Name: tasks.rabbitmq Address: 10.100.8.163
按照RabbitMQ的逻辑,将tasks.rabbitmq作为种子主机名传递给它后,启动时会执行A记录查询,并将当前节点的前缀(比如rabbit@hostname1.example.local里的rabbit)追加到每个主机名返回结果。
但手动对查询到的IP做反向解析时,得到的结果是:
root@rabbitmq-foo-1:/# nslookup 10.100.8.158 158.8.100.10.in-addr.arpa name = foo_rabbitmq.tjqxe6kpe5g4mnmgwoiuink16.xhosndlwm3eaoldu36udvjfi9.rabbitmq-net.
Docker DNS生成的反向记录格式为:
<Project Name>_<Task Name>.<Task ID>.<Container ID>.<Network Name>.
遗憾的是,RabbitMQ会检查解析后的反向记录是否与节点主机名匹配,只有匹配时才会加入集群。它需要的是类似rabbitmq-foo-1.whatever.的名称(对应节点主机名foo-1),而非Docker DNS返回的长格式名称,这导致无法正常组建集群。
问题
有没有办法解析到任务实例指定的主机名?或者有没有能获取所有Swarm节点的DNS端点?
内容的提问来源于stack exchange,提问作者Moritz Mazetti
相关产品推荐
相关产品推荐

