【发布时间】:2017-12-01 18:07:44
【问题描述】:
当我使用 VIP 发布服务时,通告的地址无法正确路由到通告的端口。例如,对于 MariaDB Galera 3 节点集群服务,VIP 指定为:
"labels": {
"VIP_0": "/mariadb-galera:3306"
}
在服务页面的配置选项卡上(根据文档),负载均衡地址是:
mariadb-galera.marathon.l4lb.thisdcos.directory:3306
我可以 ping 通 DNS 名称,但是...
当我尝试连接一个前端服务(Drupal7、wordpress)来使用这个负载均衡的地址:端口组合时,会出现大量的连接失败和超时。并不是说它永远不会起作用,而是它非常零星地起作用,如果有的话。 Drupal7 几乎立即死亡并开始引发 Bad Gateway 错误。
我通过实验发现,如果我为有问题的服务指定一个 hostPort,只要我使用 hostPort 值,负载平衡地址就可以工作,而不是广告负载均衡服务端口如上。在这种特定情况下,我指定了 3310 的 hostPort。
"network":"USER",
"portMappings": [
{
"containerPort": 3306,
"hostPort": 3310,
"servicePort": 10000,
"name": "mariadb-galera",
"labels": {
"VIP_0": "/mariadb-galera:3306"
}
}
然后,如果我在 Drupal7 settings.php 中使用负载平衡地址 (mariadb-galera.marathon.l4lb.thisdcos.directory) 和主机端口值 (3310),前端连接并正常工作。
我注意到在 DC/OS 环境中连接到 mongodb 后端的自定义应用程序也有类似的行为......似乎指定的负载平衡地址/端口组合永远不会可靠地工作......但是如果您替换 hostPort 值,确实如此。
文档明确指出:
地址和端口作为一对而不是单独进行负载平衡。
(来自https://docs.mesosphere.com/1.9/networking/dns-overview/)
但是,当我指定 VIP 指定端口时,我无法有效连接。然而,当我使用 hostPort 时它确实有效(除非我在服务定义 json 中指定一个特定的 hostPort,否则它根本不起作用)。根据文档中的措辞,这种方法是否实际上是负载平衡的仍然是一个问题。
我一定是做错了什么,但我不知所措……感谢您的帮助。
我的集群节点是 VMWare 虚拟机。
【问题讨论】:
-
老实说,这比通过 CLI 更容易通过仪表板完成。