用容器轻松搭建Bamboo来提供Marathon的对外服务
如果我们在marathon上部署了一个tomcat服务并希望它能暴露给外网,应该怎么做呢?Bamboo提供了一个非常方便运行的办法帮我们做到这一点。它集成了HAproxy,当marathon检测到应用挂掉并重启应用时,bamboo能够检测到并更新HAproxy的配置文件,然后自动重启HAproxy,从而无须人工干预便能持续不断地对外提供服务。
准备工作
参考《用容器轻松搭建Marathon运行环境》的准备工作一节,用vagrant搭建两台虚拟机master和slave。
搭建环境
参考《用容器轻松搭建Marathon运行环境》的搭建环境一节,但是用下面这个命令来启动marathon。它相比原来的命令多了一个--event_subscriber http_callback
的参数,如果不配置,便不能实现HAproxy动态加载服务的功能。
现在启动Bamboo镜像,在里面指定marathon的地址:
在浏览器打开http://192.168.33.18:8000/
应该能看到下图:
服务发现
现在让我们用marathon来启动一个tomcat服务。在任意一台机器上运行以下命令,把创建tomcat服务的请求发送给marathon的REST api:
分别刷新marathon和bamboo,就能看到它们各自多了个tomcat的服务。点击bamboo页面上的/tomcat记录最右边的加号按钮,在acl里输入path_beg -i /
(表示运行在根目录上,有兴趣的话可以参考HAproxy的ACL语法),然后点击Create按钮:
顺利的话,打开http://192.168.33.18/
应该能看到tomcat出现啦:
这个时候,在marathon的页面上点击tomcat这行记录,便会到tomcat application页面里。如下图选中当前的tomcat实例,点击Kill按钮:
稍等几秒,就会看到tomcat的服务运行地址从192.168.33.19:31071
变成了192.168.33.19:31571
,端口因机而异。再回去刷新tomcat的http://192.168.33.18/
页面,是不是仍然提供服务呢?如果你手快,应该能看到503 Service Unavailable,那就多刷新两下 :) 到slave虚拟机上用命令删除tomcat容器,再观察一下,是不是一样的效果呢?
其他方法
Marathon官方还支持其它三种服务发现的方法:
- Mesos-DNS:Mesosphere公司提供的DNS产品,不仅适用于marathon,而且适用于其它Mesos Framework。
- Marathon-lb:感觉上跟k8s的NodePort有点像,不过它像Bamboo那样包含了HAproxy。
- haproxy-marathon-bridge:现在已经不推荐了。需要在每个slave上安装HAproxy,定时更新HAproxy的配置文件。