amazon-ec2 - 在 Kubernetes 上运行时更改主机名会破坏 Rabbitmq

标签 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_LONGNAMEtrue打破:
Can't set long node name!\nPlease check your configuration\n"
更新:
  • 设置 RABBITMQ_NODENAME到rabbitmq@ 本地主机 工作,但这否定了集群实例的任何可能性。
              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
    

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

    最佳答案

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

    正如您所说,您必须为每个创建自定义 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

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

    关于amazon-ec2 - 在 Kubernetes 上运行时更改主机名会破坏 Rabbitmq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36857097/

    相关文章:

    python - celery send_task() 方法

    hadoop - 为什么 Flume 需要有 AMQP 源?

    hadoop - 如何从亚马逊 emr 访问 .pem 文件

    amazon-web-services - AWS - 将 EC2 扩展到更大的类型(示例 : micro -> large)

    python - 亚马逊 EC2 虚拟环境 : pip says it installed numpy but python can't find it

    amazon-web-services - 让外部 DNS 与 Kops AWS 1.7 K8s 集群中的入口对象一起使用

    reactjs - React App 与 Go 后端 api 通信

    RabbitMQ 上的 Autoconfigure 的 Spring Boot 启动失败

    apache - Ubuntu 和 www :data permissions in amazon aws

    amazon-web-services - 未在父级列出的主名称服务器