Mesos:服务发现与负载均衡

Mesos: Service Discovery & Load Balancing

这一章主要探讨是Mesos关于服务发现与应用的负载均衡的解决方案,主要侧重对服务发现与负载均衡进行讲解,须要明白的一点,Mesos做为 两层架构,Marathon做为Mesos的systemd服务,服务发现功能只须要向marathon提供便可,marathon启动的k8s、 Cloud Foundry都用自身的服务发现功能。html

一、Service Discovery with Marathon-Bridge and HAProxy

服务发现的功能实现是为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

HAProxy请求转发

若是slave1节点挂了,下一次对Localhost:2222的请求,将被转发到slave2上。

HAProxy转发

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支持和模板功能。

二、Service Discovery with Bamboo and HAProxy

场景:当你在Mesos集群上部署的了一系列的微服务,而这些服务可以以HTTP方式经过访问特定的URL来对外提供服务或者对内进行通讯。

  • Mesos 集群上经过Marathon框架启动应用(服务),Marathon经过健康检查(healthcheck)跟踪它们的状态
  • Bamboo经过监听Marathon event以更新HAProxy配置文件
  • HAProxy ACL规则经过Bamboo进行配置,其可以根据请求的特征,如URL规则、hostname、HTTP headers,来匹配应用服务。

处理流程

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

Marathon UI

三、Bamboo配置rules

能够定义rules来告诉HAProxy如何去proxy:

rules

首先,在/etc/hosts添加一行,这样就能够匹配Host Header:

# ip of HAProxy
192.168.99.100 ghost.local
  • 1
  • 2

访问Bamboo UI,一般是http://haproxy:8000, 而后添加对应的name:ghost-0,以下图:

Bamboo

查看一下是否添加成功:

这里写图片描述

ok!能够访问http://ghosts.local/

local

参考文档:
一、Service Discovery mesosphere
二、marathon-lb github
三、Service Discovery pi
四、Bamboo-haproxy-marathonbamboo
五、数人科技mesosphere中文文档

相关文章
相关标签/搜索