概述

最近在做marathon-lb的虚拟域名配置,发现官方的文档中都是这样写的HAPROXY_0_VHOST,之前从官方文档知道如何绑定多个域名(多个域名用逗号隔开,marathon-lb会自动发现注册到haproxy的配置中),但是对其中的{n},为啥都用0表示,耿耿于怀~

背景

之前根据项目要求,访问同一域名需要根据目录转发到不同的容器上,继而配置了HAPROXY_0_PATH,该项和HAPROXY_0_VHOST项的值以笛卡尔积结果过滤请求的URL。

"labels": {
    "HAPROXY_GROUP": "dsp",
    "HAPROXY_0_PATH": "-i /dsp-admin /dsp-api",
    "HAPROXY_0_VHOST": "test.dsp.com.cn,test.api.dsp.com"
  }

分析

访问http://test.dsp.com.cn/dsp-admin(本机已配置host,IP指向marathon-lb容器实例所在机器的IP)可以返回对应结果。
此处有几点细节要注意:

  • 自己的PC要配置hosts,IP指向marathon-lb容器实例所在机器的IP

  • marathon-lb应该固定主机启动,这样不至于容器乱飘,自己的PC要不停修改hosts

  • 这里建议以Host模式启动容器,因为在centos7下启用的是firewall-cmd防火墙,marathon网关不支持开放bridge模式随机分配的端口,如果还是iptables则无此问题,自由选择

  • 如果选择Host模式,需要配置marathon分配的端口号范围,然后开启firewall-cmd相同端口区间,再去容器的启动脚本里替换tomcat的启动端口号,server.xml中的8080,8005,8009,8443,还有catalina.sh文件中的8000端口,否则在同一台主机启动多个相同应用会报端口冲突(原因请自行研究Host模式细节),Host模式端口配置

    "portDefinitions": [

    {
      "port": 0,
      "protocol": "tcp",
      "labels": {}
    },
    {
      "port": 0,
      "protocol": "tcp",
      "labels": {}
    },
    {
      "port": 0,
      "protocol": "tcp",
      "labels": {}
    },
    {
      "port": 0,
      "protocol": "tcp",
      "labels": {}
    },
    {
      "port": 0,
      "protocol": "tcp",
      "labels": {}
    }

    ]

    启动(shell)脚本对应配置

    echo "PORT0:${PORT0}"
    if [ x"${PORT0}" != x ]; then
    sed -i "s;8080;${PORT0};" /app/tomcat/conf/server.xml
    echo "tomcat http port is replaced by : ${PORT0}"
    fi

    echo "PORT1:${PORT1}"
    if [ x"${PORT1}" != x ]; then
    sed -i "s;8000;${PORT1};" /app/tomcat/bin/catalina.sh
    echo "tomcat catalina 8000 port is replaced by : ${PORT1}"
    fi

    echo "PORT2:${PORT2}"
    if [ x"${PORT2}" != x ]; then
    sed -i "s;8005;${PORT2};" /app/tomcat/conf/server.xml
    echo "tomcat server 8005 port is replaced by : ${PORT2}"
    fi

    echo "PORT3:${PORT3}"
    if [ x"${PORT3}" != x ]; then
    sed -i "s;8009;${PORT3};" /app/tomcat/conf/server.xml
    echo "tomcat server 8009 port is replaced by : ${PORT3}"
    fi

    echo "PORT4:${PORT4}"
    if [ x"${PORT4}" != x ]; then
    sed -i "s;8443;${PORT4};" /app/tomcat/conf/server.xml
    echo "tomcat server 8443 port is replaced by : ${PORT4}"
    fi

    通过PORT0等环境变量获取容器在主机上分配的端口号,即完成Host模式启动脚本配置。

重点!!!

HAPROXY_{n}_VHOST这里的n为啥写0呢?
在labels中,包含0的Key与servicePort定义对应 ,从0开始。如果你有多个servicePort定义,你会遍历它们作为0,1,2,依此类推。
Host模式下HAPROXY_0_VHOST表示我要将portDefinitions定义的第一个port号映射到haproxy的80端口上,这里我把haproxy的配置文件贴上来

图片描述

haproxy的配置细节可自行百度。

总结:n表示你想将自己的这个容器的第几个端口暴露在marathon-lb:80端上。

感觉总结的不太好,举个栗子吧:
假设portDefinitions定义的端口,第一个分到的主机port是20001,则对应容器暴露的也是20001,第二个分到的是20002,对应容器暴露的端口也是20002,(因为我们把tomcat的8080换成了20001,上面脚本的PORT0),如果再启动第二个tomcat的话,把第二个tomcat的8080也换成20002,然后配置

"HAPROXY_0_VHOST": "a.com"
"HAPROXY_1_VHOST": "b.com"

访问a.com,则会打开tomcat1的首页,访问b.com则会打开tomcat2的首页,其实就是告诉浏览器通过域名访问都是经过marathon-lb的haproxy的80端口然后根据VHOST的域名配置转发到后台容器暴露的端口上。


dahong
32 声望0 粉丝