多域不同路径马拉松 lb

Multiple domains differen paths marathon lb

我想在两个不同路径的域上访问相同的服务。 配置马拉松 lb.

http://front-dev.marathon.ice.mesos/auth

http://auth-dev.marathon.ice.mesos

我试过:

HAPROXY_0_VHOST=front-dev.marathon.ice.mesos,auth-dev.marathon.ice.mesos
HAPROXY_0_PATH=/auth

这会让我打

http://front-dev.marathon.ice.mesos/authhttp://auth-dev.marathon.ice.mesos/auth

不完全是我想要的。

我也试过了

HAPROXY_0_VHOST=front-dev.marathon.ice.mesos,auth-dev.marathon.ice.mesos
HAPROXY_0_PATH=/auth
HAPROXY_1_PATH=/

这没有任何改变。

两个单独的 VHOST 标签也不起作用

HAPROXY_0_VHOST=front-dev.marathon.ice.mesos
HAPROXY_1_VHOST=auth-dev.marathon.ice.mesos
HAPROXY_0_PATH=/auth
HAPROXY_1_PATH=/

1_VHOST 和 1_PATH 被忽略

MLB 中并不完全存在您要查找的逻辑。听起来你想要这样的东西:

if (vhostA) use backend
else if (vhostB && pathB) use backend

有一个技巧可以完成上面的代码。如果查看生成的配置,您应该会在前端看到一组用于 HTTP 和 HTTPS 的 ACL。要摆脱多余的配置,只需配置 一个虚拟主机并切换到更简单的 HAPROXY_HTTP_FRONTEND_ACL。我们需要覆盖默认值,如下所示:

{
  "labels": {
    "HAPROXY_0_HTTP_FRONTEND_ACL"="  acl path_is_auth path_beg /auth\n  acl host_is_front_dev hdr(host) -i front-dev.marathon.ice.mesos\n  acl host_is_auth_dev hdr(host) -i auth-dev.marathon.ice.mesos\n  use_backend {backend} if host_is_auth_dev or host_is_front_dev path_is_auth\n"
  }
}

应该可以了。使用 curl marathon-lb.marathon.mesos:9090/_haproxy_getconfig.

检查从 MLB 生成的 HAProxy 配置

如果您使用的是 HTTPS,则还需要更新等效的 HTTPS 前端 ACL。 Look here for a full list of the templates.

请记住,标签中的 {n} 索引是指服务本身的 servicePort 索引。

因此,要使单独的 VHOST 标签起作用,您必须为服务创建额外的端口映射和端口定义(总共两套)。

例如

"portMappings": [
    {
      "containerPort": 80,
      "hostPort": 0,
      "servicePort": 10010,
      "protocol": "tcp",
      "labels": {}
    },
    {
      "containerPort": 80,
      "hostPort": 0,
      "servicePort": 10011,
      "protocol": "tcp",
      "labels": {}
    }
  ],

"portDefinitions": [
    {
      "port": 10010,
      "protocol": "tcp",
      "labels": {}
    },
    {
      "port": 10011,
      "protocol": "tcp",
      "labels": {}
    }
]

然后,您可以按照预期将标签添加到服务中

HAPROXY_0_VHOST=front-dev.marathon.ice.mesos
HAPROXY_0_PATH=/auth
HAPROXY_0_HTTP_BACKEND_PROXYPASS_PATH=/auth
HAPROXY_1_VHOST=auth-dev.marathon.ice.mesos

... HAPROXY_1_PATH=/ 标签不是必需的 ;-)

如果您使用 HAPROXY_{n}_PATH 标签,您肯定需要设置一个额外的标签 HAPROXY_{n}_HTTP_BACKEND_PROXYPASS_PATH 以将路径(在我们的示例中为 /auth)映射到根目录您的应用级别(在我们的示例中,/

当然要在

检查 HA-Proxy 配置
curl marathon-lb.marathon.mesos:9090/_haproxy_getconfig

Brenden Mathews所说;-)