概述
最近在做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}"
fiecho "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}"
fiecho "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}"
fiecho "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}"
fiecho "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的域名配置转发到后台容器暴露的端口上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。