關於marathon-lb中HAPROXY_{n}_VHOST等配置的說明

概述

最近在作marathon-lb的虛擬域名配置,發現官方的文檔中都是這樣寫的HAPROXY_0_VHOST,以前從官方文檔知道如何綁定多個域名(多個域名用逗號隔開,marathon-lb會自動發現註冊到haproxy的配置中),可是對其中的{n},爲啥都用0表示,耿耿於懷~shell

背景

以前根據項目要求,訪問同一域名須要根據目錄轉發到不一樣的容器上,繼而配置了HAPROXY_0_PATH,該項和HAPROXY_0_VHOST項的值以笛卡爾積結果過濾請求的URL。centos

"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)能夠返回對應結果。
此處有幾點細節要注意:api

  • 本身的PC要配置hosts,IP指向marathon-lb容器實例所在機器的IP瀏覽器

  • marathon-lb應該固定主機啓動,這樣不至於容器亂飄,本身的PC要不停修改hoststomcat

  • 這裏建議以Host模式啓動容器,由於在centos7下啓用的是firewall-cmd防火牆,marathon網關不支持開放bridge模式隨機分配的端口,若是仍是iptables則無此問題,自由選擇app

  • 若是選擇Host模式,須要配置marathon分配的端口號範圍,而後開啓firewall-cmd相同端口區間,再去容器的啓動腳本里替換tomcat的啓動端口號,server.xml中的8080,8005,8009,8443,還有catalina.sh文件中的8000端口,不然在同一臺主機啓動多個相同應用會報端口衝突(緣由請自行研究Host模式細節),Host模式端口配置tcp

    "portDefinitions": [centos7

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

    ]spa

    啓動(shell)腳本對應配置code

    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的域名配置轉發到後臺容器暴露的端口上。

相關文章
相關標籤/搜索