2016-05-25 7 views
1

Ich möchte den gleichen Dienst auf zwei Domänen mit unterschiedlichen Pfaden treffen. Konfiguriert in Marathon lb.Mehrere Domänen differen Wege marathon lb

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

und

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

Ich habe versucht:

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

Das bin ich

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

Nicht genau was ich wollte.

Ich habe auch versucht,

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

dass sich nichts verändert.

Zwei separate VHOST Etiketten nicht funktioniert entweder

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 und 1_PATH ignoriert

Antwort

3

Die Logik Sie suchen nicht ganz in MLB existieren. Es klingt wie du willst etwas wie:

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

Es gibt einen Trick, um den obigen Code zu erreichen. Wenn Sie sich die generierte Konfiguration ansehen, sollten Sie eine Reihe von ACLs in den Frontends für HTTP und HTTPS sehen. Um die überflüssige Konfiguration loszuwerden, konfigurieren Sie nur einen vhost und wechseln Sie zum einfacheren HAPROXY_HTTP_FRONTEND_ACL. Wir müssen die Standardeinstellungen wie folgt überschreiben:

{ 
    "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" 
    } 
} 

Das sollte es tun. Überprüfen Sie die generierte HAProxy-Konfiguration von MLB mit curl marathon-lb.marathon.mesos:9090/_haproxy_getconfig.

Sie müssen auch die entsprechenden HTTPS-Front-End-ACLs aktualisieren, wenn Sie HTTPS verwenden. Look here for a full list of the templates.

2

Denken Sie daran, dass sich der Index {n} in den Etiketten auf den servicePort Index des Dienstes selbst bezieht.

Damit die separaten VHOST-Labels funktionieren, müssen Sie eine zusätzliche Portzuordnung und Portdefinition für den Dienst erstellen (für insgesamt zwei Sets).

zum Beispiel

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

und

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

Dann können Sie die Etiketten auf den Dienst hinzufügen, wie Sie

beabsichtigen, wurden
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 

...das HAPROXY_1_PATH=/ Etikett ist nicht notwendig ;-)

Wenn Sie das HAPROXY_{n}_PATH Label verwenden, werden Sie sicherlich ein zusätzliches Label festlegen müssen HAPROXY_{n}_HTTP_BACKEND_PROXYPASS_PATH den Pfad zur Karte (in unserem Beispiel /auth) auf die Root-Ebene Ihrer App (In unserem Beispiel /)

natürlich überprüfen Sie die HA-Proxy Config bei

curl marathon-lb.marathon.mesos:9090/_haproxy_getconfig 

Wie Brenden Mathews sagte ;-)