在使用marathon发布程序时经常发现端lb上的端口号不是自己想发布的,而是一个随机端口。
仔细研究了下marathon-lb的端口机制,发现servicePort才是真正在lb上对外释放的端口。
如下端口的配置意思是容器内,程序监听的容器端口是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个部分:
- Private virtual IP address -----容器自动分配的内部地址
- Port (a port which the service is available on)------这也就是说该端口必须与容器内端口一致才能有效访问到服务
- Service name
api即一个service endpoint, 在DC/OS集群里面(包含master节点)里面可以使用VIP地址(命名约定):api..marathon.l4lb.thisdcos.directory:30590来访问该服务。如果配置了VIP,marathon-lb则直接使用该VIP来实现对各个instance之间的负载均衡。
网络采用bridge模式:
"networks": [ { "mode": "container/bridge" } ],
如果需要发布端口到marathon-lb上,标签的配置不能缺少,如果缺少标签配置,则不会发布端口到lb
"labels":{ "HAPROXY_GROUP":"external" }
这个group有2个选项: external, internal,取决于将lb用于外部还是内部,或者2个都配置,用逗号隔开,同时用于内部和外部。
另外需要注意的是marathon的app没有完成部署(即非running状态),对外的端口是不会发布到lbs上的。
总而言之,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" }