1. 程式人生 > >Marathon-lb 服務自動發現和負載均衡

Marathon-lb 服務自動發現和負載均衡

lb marathon

Marathon-lb用途

在使用Marathon+Mesos 的容器集群中,我們會構建很多個容器,這些容器在不同的slave上分配了不同的隨機端口,這些Docker容器在HA模式下運行,如果任何slave節點故障導致容器實例意外退出,它將自動重新創建到健康的節點上。 所以我們不必擔心高可用性問題,Marathon會自動幫我們處理這些問題。

但是,當我們要使用這些容器處理我們的業務數據時,問題就來了。如我們有多個nginx提供web服務,我們如何分配流量? 如果slave節點發生硬件故障,或者容器實例崩潰,那麽新創建的容器IP和端口隨時可能發生變化。 我們需要確保我們的負載均衡器能夠在最短時間內檢測這些變化,並相應地路由流量。 要解決這個問題,我們就要使用Marathon-lb。 Marathon-lb是通過監測Marathon應用程序狀態來管理HAProxy的工具。而 HAProxy是一款快速,高效,經過測試的高可用性負載平衡器,具有許多高級功能,如健康檢查,SSL,會話持久性等。


Marathon-lb設計思想

Marathon-lb通過調用自身的marathon_lb.py 腳本,連接到Marathon API以檢索所有正在運行的應用程序,根據檢索的信息生成HAProxy配置並重新加載HAProxy。 每當應用程序狀態有任何變化時,Marathon-lb就會使用最新的IP和端口號更新haproxy配置文件,並重新加載haproxy。 默認情況下,Marathon-lb會綁定到每個應用的服務端口,並將傳入的請求發送到應用實例。


Marathon-lb依賴於嵌入在haproxy中的最新lua支持來生成配置文件。 我們需要下載並安裝具有Lua支持的Haproxy,需要使用haproxy 1.6.0以上版本。


Marathon-lb可以直接從官方下載docker鏡像,簡單配置之後就可以和其它容器一起放在Mesos集群中以容器的方式運行,也可以使用傳統的方法在某一兩臺主機上安裝,設置vip,配置為高可用的模式,這兩種方式各有優缺點,可以根據自己的業務要求進行合理規劃。下面就這兩種方式為大家一一介紹。


使用單獨主機配置Marathon-lb

安裝Haproxy

1、Haproxy需要lua5.3及以上版本,CentOS7.2默認的lua版本是5.1.4,所以首先安裝lua5.3.4,這裏使用編譯安裝,需要確保系統中已經安裝gcc和readline-devel:

[[email protected]
~]# wget http://www.lua.org/ftp/lua-5.3.4.tar.gz [[email protected] ~]# tar xf lua-5.3.4.tar.gz [[email protected] ~]# cd lua-5.3.4 [[email protected] lua-5.3.4]# make linux test [[email protected] lua-5.3.4]# cd src [[email protected] src]# cp lua luac /usr/bin/ [[email protected] ~]# lua -v Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio

2、安裝Haproxy

先安裝必要的模塊:

[[email protected] ~]# yum install openssl-devel pcre-devel zlib-devel libcurl-devel -y

下載最新的源碼包安裝:

[[email protected] ~]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz 
[[email protected] ~]# tar xf haproxy-1.7.8.tar.gz 
[[email protected] ~]# cd haproxy-1.7.8
[[email protected] haproxy-1.7.8]# make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_LUA=1
[[email protected] haproxy-1.7.8]# make install PREFIX=/usr/local/haproxy
[[email protected] haproxy-1.7.8]# haproxy -v
HA-Proxy version 1.7.8 2017/07/07
Copyright 2000-2017 Willy Tarreau <[email protected]>

安裝Marathon-lb

1、從github上下載安裝Marathon-lb

[[email protected] ~]# git clone https://github.com/mesosphere/marathon-lb.git 
[[email protected] ~]# mv marathon-lb  /
[[email protected] ~]# cd /marathon-lb


2、配置Marathon-lb通過Marathon API獲取容器應用狀態,生成haproxy配置並重新加載haproxy.

[[email protected] marathon-lb]# ./marathon_lb.py -m http://192.168.20.41:8080  -m http://192.168.20.42:8080 -m http://192.168.20.43:8080  --group external --dont-bind-http-https

此時,會在/etc/haproxy目錄下生成一個haproxy.cfg的文件。

提示:如果出現如下報錯,請參考此鏈接安裝python3

/usr/bin/env: python3: No such file or directory

3、啟動haproxy

haproxy -f  /etc/haproxy/haproxy.cfg

4、發布含有HAPROXY_GROUP類型的標簽的app,marathon-lb就能實時更新haproxy配置信息。


以容器方式配置Marathon-lb

以容器方式配置Marathon-lb非常簡單,只需下載鏡像,啟動容器兩步即可完成。

1、從官方下載Marathon-lb容器鏡像

docker pull docker.io/mesosphere/marathon-lb

2、指定mesos的master主機和Haproxy 組,啟動Marathon-lb容器:

docker run -d --privileged -e PORTS=9090 --net=host docker.io/mesosphere/marathon-lb sse -m http://192.168.20.41_ip:8080 -m http://192.168.20.42:8080 -m http://192.168.20.43:8080  --group external

這裏所指定網絡模式為host.

3、發布APP要指定標簽類型,否則不會被marathon-lb獲取到狀態信息:

{
  "id":"nginx",
  "labels": {
  "HAPROXY_GROUP":"external",
  "HAPROXY_0_VHOST":"nginx1.com"
   },
  "cpus":0.2,
  "mem":20.0,
 "instances": 1,
 "constraints": [["hostname", "UNIQUE",""]],
 "container": {
    "type":"DOCKER",
   "docker": {
     "image": "nginx",
     "network": "BRIDGE",
     "portMappings": [
        {"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" }
      ]
    }
  }
}

4、我們可以通過訪問marathon-lb容器所在的主機IP來訪問nginx(指定了VHOST需要做解析或在本地添加hosts記錄),使用如下格式訪問9090端口來查看當前haproxy的狀態:

http://192.168.20.45:9090/haproxy?stats



參考資料:

http://www.bubuko.com/infodetail-1506228.html



本文出自 “Trying” 博客,請務必保留此出處http://tryingstuff.blog.51cto.com/4603492/1955757

Marathon-lb 服務自動發現和負載均衡