在使用marathon發佈程序時常常發現端lb上的端口號不是本身想發佈的,而是一個隨機端口。nginx
仔細研究了下marathon-lb的端口機制,發現servicePort纔是真正在lb上對外釋放的端口。api
以下端口的配置意思是容器內,程序監聽的容器端口是30590,在lb上對外釋放50000端口,主機上對應橋接端口是30010(也能夠是其餘端口,或隨機端口,隨機端口填0),VIP_0這個地方端口號要與容器內的端口號一致,其主要做用是的配合lb作負載均衡時使用,讓用戶能夠再mesos集羣外部經過訪問lb的50000端口能夠訪問到容器內的30590的服務。網絡
"portMappings": [ { "containerPort": 30590, "hostPort": 30010, "labels": { "VIP_0": "/api:30590" }, "protocol": "tcp", "servicePort": 50000, "name": "api" } ],
VIP包含3個部分:app
api即一個service endpoint, 在DC/OS集羣裏面(包含master節點)裏面能夠使用VIP地址(命名約定):api..marathon.l4lb.thisdcos.directory:30590來訪問該服務。若是配置了VIP,marathon-lb則直接使用該VIP來實現對各個instance之間的負載均衡。負載均衡
網絡採用bridge模式:tcp
"networks": [ { "mode": "container/bridge" } ],
若是須要發佈端口到marathon-lb上,標籤的配置不能缺乏,若是缺乏標籤配置,則不會發布端口到lbthis
"labels":{ "HAPROXY_GROUP":"external" }
這個group有2個選項: external, internal,取決於將lb用於外部仍是內部,或者2個都配置,用逗號隔開,同時用於內部和外部。code
另外須要注意的是marathon的app沒有完成部署(即非running狀態),對外的端口是不會發布到lbs上的。ssl
總而言之,servicePort和label 2個配置一塊兒完成lb的配置。部署
若是須要對HTTP請求作更多的頭部設置能夠在每一個應用的labels裏面的相應字段添加相關信息:
如:
"labels":{ "HAPROXY_GROUP":"external", "HAPROXY_0_BACKEND_HTTP_OPTIONS":" option forwardfor\n no option http-keep-alive\n http-request set-header X-Forwarded-Port %[dst_port]\n http-request add-header X-Forwarded-Proto https if { ssl_fc }\n" }
"labels":{ "HAPROXY_0_STICKY":true, "HAPROXY_0_REDIRECT_TO_HTTPS":true, "HAPROXY_0_VHOST":"nginx.mesosphere.com" }
"labels":{ "HAPROXY_0_VHOST":"nginx.mesosphere.com", "HAPROXY_0_SSL_CERT":"/etc/ssl/certs/nginx.mesosphere.com" }