Marathon-lb 服務自動發現和負載均衡
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 服務自動發現和負載均衡