在使用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" }