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"
    }
相關文章
相關標籤/搜索