这一章主要探讨是Mesos关于服务发现与应用的负载均衡的解决方案,主要侧重对服务发现与负载均衡进行讲解,须要明白的一点,Mesos做为 两层架构,Marathon做为Mesos的systemd服务,服务发现功能只须要向marathon提供便可,marathon启动的k8s、 Cloud Foundry都用自身的服务发现功能。html
服务发现的功能实现是为Dcos系统中的服务提供便捷的网络通讯,它的侧重点在于对服务进行注册,更新,查询等功能,服务发现的实现方法较多, 主要有DNS、集中式服务路由、应用内部实现服务注册/服务发现等方式,Dcos服务发现功能采用的是Mesos-DNS策略,有关Mesos-DNS的 具体介绍详见上一篇文章。
经过Mesos-DNS的服务发现策略,能够经过辅助脚本利用Marathon REST API定时(经过Linux crond服务)产生HAProxy 配置文件,经过diff 生成的hapxoy配置文件与已有的haproxy,来判断是否进行reload haproxy操做。node
Mesos-slave默认想master提供的端口资源的范围是31000-32000,当marathon启动一个task 实例时,所在的mesos-slave会随意给其绑定一个或多个在其范围内的端口。须要注意的是应用绑定的实际端口(即mesos-slave分配给它的 端口)和应用在配置时所指定的形式端口(这是之后直接访问的应用端口)之间的区别,形式端口(即应用端口)是应用运行在marathon的一种命名空间, 不是直接绑定的,也就是说其余服务也能够绑定这样一个端口,只是服务不一样而已,它间接的被负载均衡器所使用。python
服务发现功能,容许marathon上的应用能够经过配置的端口与其余marathon应用进行通讯,这样作的好处就是,无需知道实际分配的端口是 多少,例如: Python的wsgi服务(配置时你指定的是80)须要跟MySQL(配置时你指定的327)进行通讯,这样你能够直接与localhost:327进 行通讯便可。mysql
HAProxy会把请求路由到具体的服务节点上,若是此服务路径不可达,它将继续将路由到下一个服务节点。须要注意的是,目前服务发现功能只支持marathon上的应用。linux
使用 HAProxygit
Marathon附带一个简单的被叫作 haproxy-marathon-bridge 的shell脚本以及更高级的python脚本 servicerouter.py(这个脚本在marathon/bin下面)。两个脚本均可以将Marathon的REST API列表中正在运行的任务推送到HAproxy的设置文件中,HAproxy是一个轻量级的TCP/HTTP的代理。haproxy- marathon-bridge提供了一个最小设置功能。 而servicerouter.py支持如SSL卸载,sticky链接和虚拟主机的负载均衡的更高级的功能。github
负载均衡实现原理就是上述说起的,经过辅助脚本(这里是使用haproxy-marathon-bridge)利用Marathon REST API定时(经过linux crond服务)产生HAProxy 配置文件,经过diff 生成的hapxoy配置文件与已有的haproxy,来判断是否进行reload haproxy操做。sql
下图描述了在一个集群分别在两个节点安装同一服务,SVC1和SVC2,分配配置的应用端口是1111和2222,能够看到实际分配给它们的是31100和31200。docker
当slave2节点上的SVC2服务经过localhost:2222链接SVC1服务时,HAProxy将把请求转发到第一配置项SVC1的slave1节点。shell
若是slave1节点挂了,下一次对Localhost:2222的请求,将被转发到slave2上。
haproxy与Marathon的桥接
经过 haproxy-marathon-bridge脚本从Marathon生成一个HAProxy配置在leader.mesos:8080运行:
$ ./bin/haproxy-marathon-bridge leader.mesos:8080 > /etc/haproxy/haproxy.cfg
从新加载HAProxy配置而不中断现有的链接:
$ haproxy -f haproxy.cfg -p haproxy.pid -sf $(cat haproxy.pid)
配置脚本并从新加载能够经过Cron常常触发来跟踪拓扑变化。若是一个节点在从新加载时消失, HAProxy的健康检查将抓住它并中止向这个node发送traffic 。
为了方便这个设置,haproxy-marathon-bridge 脚本以另外一种方式能够调用安装脚本自己,HAProxy和定时任务每分钟ping一次的Marathon服务,若是有任何改变将马上刷新HAProxy。
$ ./bin/haproxy-marathon-bridge install_haproxy_system leader.mesos:8080
Marathon须要ping的列表存按行存储在 /etc/haproxy-marathon-bridge/marathons
脚本安装在 /usr/local/bin/haproxy-marathon-bridge
-cronjob安装在/etc/cron.d/haproxy-marathon-bridge 注意须要用root来运行。
所提供的只是一个基本的示例脚本。
servicerouter.py
经过servicerouter.py脚本从Marathon生成一个HAProxy配置在leader.mesos:8080运行:
$ ./bin/servicerouter.py --marathon http://leader.mesos:8080 --haproxy-config /etc/haproxy/haproxy.cfg
若是有任何变化,将会刷新haproxy.cfg,这样HAproxy将会从新自动加载。
servicerouter.py有许多额外的功能,像sticky 会话,HTTP到HTTPS的重定向,SSL卸载,VHost支持和模板功能。
场景:当你在Mesos集群上部署的了一系列的微服务,而这些服务可以以HTTP方式经过访问特定的URL来对外提供服务或者对内进行通讯。
Bamboo的处理流程跟上述的方案是殊途同归的。
优势:
1. 容许任意URL与服务进行对应
2. 容许经过HTTP Header与服务进行对应
3. 及时的触发Marathon event来促使HAProxy进行改变
4. HAProxy heavy lifting
不足:
1. 对于非HTP不适用
2. 内部须要有HAProxy故障切换机制除非可以实现SmartStack架构的服务
3. 内部非流量都邹另外的hop(HAProxy)
实现
一、安装HAProxy和Bamboo
HAProxy
HAProxy的安装可使用以下方式:
apt-get install haproxy
Bamboo
Bamboo项目地址,你能够经过构建脚本来制做deb或者rpm的软件包,固然也能够经过build container进行构建deb 软件包
docker build -f Dockerfile-deb -t bamboo-build . docker run -it -v $(pwd)/output:/output bamboo-build # package ends up as output/bamboo_1.0.0-1_all.deb
须要注意的是,须要修改/var/bamboo/production.json
来修改对应的Marathon、HAProxy、Zookeeper的hostname,而后重启bamboo,经过retsart bamboo-server
。
二、在marathon上部署应用
编辑ghost.json文件,填入下述配置:
{ "id": "ghost-0", "container": { "type": "DOCKER", "docker": { "image": "ghost", "network": "BRIDGE", "portMappings": [{ "containerPort": 2368 }] } }, "env": {}, "instances": 1, "cpus": 0.5, "mem": 256, "healthChecks": [{ "path": "/" }] }
而后使用curl -X POST -H "Content-Type: application/json" http://marathon.mesos:8080/v2/apps -d@ghost.json
便可部署该应用,能够看到marathon UI
三、Bamboo配置rules
能够定义rules来告诉HAProxy如何去proxy:
首先,在/etc/hosts
添加一行,这样就能够匹配Host Header:
# ip of HAProxy 192.168.99.100 ghost.local
访问Bamboo UI,一般是http://haproxy:8000, 而后添加对应的name:ghost-0,以下图:
查看一下是否添加成功:
ok!能够访问http://ghosts.local/
参考文档:
一、Service Discovery mesosphere
二、marathon-lb github
三、Service Discovery pi
四、Bamboo-haproxy-marathonbamboo
五、数人科技mesosphere中文文档