marathon-lb使用实践

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

  • 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模式: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"
    }
相关文章
相关标签/搜索