参考文档:

  1. Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/
  2. 参考:http://www.cnblogs.com/kevingrace/p/6845980.html
  3. 基于脚本实现服务自发现与负载均衡(供参考,marathon-lb之前的方案):

    http://dockone.io/article/439

    https://github.com/draculavlad/SetUpMesosphereOnCentos7WithServiceDiscovery/

本文主要基于marathon-lb实现mesos+marathon平台的的服务自发现与负载均衡。

一.环境

1. 环境说明

基于《基于zookeeper+mesos+marathon的docker集群管理平台》的环境,不同处:

  1. 自发现与负载均衡服务由镜像marathon-lb生成的容器完成,下发到任意1台salve节点;
  2. 所有salve节点安装keepalived服务做服务的高可用,vip:10.11.5.145。 

二.部署marathon-lb

1. 准备marathon-lb镜像

#在3个slave节点提前准备镜像,以节省容器部署时间
[root@slave-node1 ~]# docker pull mesosphere/marathon-lb
[root@slave-node1 ~]# docker images

2. 拓扑编写marathon-lb的json文件

#在任意marathon master节点上编写关于marathon-lb的json文件
[root@master-node1 ~]# vim marathon-lb.json #”network”采用HOST模式,与宿主机共享namespace;
#”args”参数将3个marathon master节点的ip:8080都带上,即marahon的api接口地址,因为不确定marathon下发marathon-lb容器时,会下发到哪一台宿主机;
#”group”参数为”external”,可以定义多个不同的”group”(即不同的marathon-lb),针对不同的应用可以绑定到不同的”group”;
#请注意json文件的格式,如标点符号等,marathon web下的”JSON Mode”框有检查语法正确与否的功能。
{
"id":"marathon-lb",
"cpus": 1,
"mem": 128,
"instances": 1,
"constraints": [["hostname", "UNIQUE"]],
"container": {
"type":"DOCKER",
"docker": {
"image": "mesosphere/marathon-lb",
"privileged": true,
"network": "HOST"
}
},
"args": ["sse", "-m", "http://10.11.4.156:8080", "-m", "http://10.11.4.157:8080", "-m", "http://10.11.4.158:8080", "--group", "external"]
}

3. 下发marathon-lb容器

1)方式1:通过curl调用json配置

#调用保存有json文件的maste节点8080端口下的json文件,即调用marathon的api
[root@master-node1 ~]# curl -X POST http://10.11.4.156:8080/v2/apps -d@/root/marathon-lb.json -H "Content-type:application/json"

2)方式2:通过marathon web下发json配置

4. 查看marathon-lb

1)marathon web

marathon-lb作为一种长服务,已经下发,运行正常,如下:

marathon-lb已下发到slave节点10.11.4.146:31187,如下:

2)mesos web

mesos active tasks中显示marathon-lb任务下发成功,如下:

5. 查看haproxy

1)设置iptables

#marathon-lb生成的haproxy容器映射到宿主机的tcp 9090端口,可以在相应宿主机通过”netstat -tunlp | grep haproxy”查看;
#需要在所有的宿主机,即slave节点放行tcp 9090端口,因为在没有指定特定主机的时候(在slave启动参数中设置机器属性 --attributes=VALUE),通过marathon下发的marathon-lb容器是随机下发到任意slave节点的;
#不重启iptables,如果重启则docker daemon也需要重启,否则iptables相关的docker的forward规则会丢失;或者在没有容器的情况下提前放行相应端口再做容器相关操作
[root@slave-node1 ~]# iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 9090 -j ACCEPT

2)haproxy监控页面

浏览器查看:http://10.11.4.146:9090/haproxy?stats

另外还有一些haproxy监控页面(ip地址是宿主机,即相应slave节点的ip),如下:

三.验证自动发现与负载均衡

通过部署nginx服务可以验证自动发现与负载均衡两项功能。

1. 编写生成nginx服务的json文件

#在任意marathon master节点上编写json文件
[root@master-node1 ~]# vim marathon-nginx.json

#“labels”中的“HAPROXY_GROUP”,与相关的marathon-lb绑定即可,“group”在下发marathon-lb容器时已经定义;
#“labels”中"HAPROXY_0_VHOST"主要起标签作用;对于web服务可以加上VHOST标签,让marathon-lb设置WEB虚拟主机;标签名字自定义,目的是为了便于区别应用容器,一般可以用业务域名来描述标签;
#"instances",实例数;
#"healthChecks",对应示例健康状态检测点;
#"portMappings"中的"containerPort"是容器应用端口;"hostPort"是映射的宿主机的端口(设置为”0”即随机);"servicePort"是marathon-lb配置的haproxy代理端口(设置为”0”即随机),设置"servicePort"对一组实例服务非常有用;
{
"id":"web",
"labels": {
"HAPROXY_GROUP":"external",
"HAPROXY_0_VHOST":"web.nginx.com"
},
"cpus":0.2,
"mem":20.0,
"instances": 2,
"healthChecks": [{ "path": "/" }],
"container": {
"type":"DOCKER",
"docker": {
"image": "nginx",
"network": "BRIDGE",
"portMappings":[{"containerPort":80,"hostPort":0,"servicePort":0,"protocol":"tcp"}]
}
}
}

2. 下发nginx服务

#采用上述方式1下发服务即可;
#nginx镜像已经提前准备
[root@master-node1 ~]# curl -X POST http://10.11.4.156:8080/v2/apps -d@/root/marathon-nginx.json -H "Content-type:application/json"

3. 验证

1)查看marathon&mesoso ui

(1)marathon ui显示web服务已经是"Running"状态,且服务名后带标签;

(2)点击查看服务的具体信息,"Instances"标签中显示了2个instance容器部署的slave节点与映射的端口信息(可以在具体的slave节点通过"docker ps"命令查看),同时健康检查状态正常;

(3) "Configuration"标签中有展示服务的具体配置信息,同json文件,关注标红框的"servicePort"是10002,此服务端口是随机分配的,可通过marathon-lb所在节点的ip+port的方式访问服务,而不是访问单独的某个instance节点提供的服务;

(4)mesos ui展示显示web服务的两个instance任务已经下发。

2)访问容器instance提供的服务

#可以先将2个nginx instance的web页面提前修改;
#如marathon ui展示,1个nginx容器在slave节点10.11.4.146:31005
#在10.11.4.146,即slave-node1节点编写index.html文件,使用”docker cp”将文件覆盖对应容器的默认web站点目录”/usr/share/nginx/html”下的index.html文件
[root@slave-node1 ~]# echo "This is Nginx Server: 10.11.4.146:31005" >> index.html
[root@slave-node1 ~]# docker cp /root/index.html 2c7448e2d185:/usr/share/nginx/html

#如marathon ui展示,另1个nginx容器在slave节点10.11.4.147:31071;
#10.11.4.147,即slave-node2节点
[root@slave-node2 ~]# echo "This is Nginx Server: 10.11.4.147:31071" >> index.html
[root@slave-node2 ~]# docker cp /root/index.html 11060abfad4f:/usr/share/nginx/html

3)访问haproxy提供的服务

(1)访问marathon-lb所在slave节点的10002端口(在marathon ui服务的configuration可以查询分配的servicePort);

URL:http://10.11.4.146:10002

PS:10002端口需要在相应节点不重启iptables的情况下放行,可以执行iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 10002 -j ACCEPT

(2)查看marathon-lb haproxy的配置;

URL:http://10.11.4.146:9090/_haproxy_getconfig

PS:或者登陆到marathon-lb容器中查看haproxy.cfg文件(效果一致)。

(3)查看marathon-lb haproxy的状态页;

URL:http://10.11.4.146:9090/haproxy?stats

四.keepalived高可用配置

对于marathon-lb或者其后端的real-server来说,对外提供的服务都依靠marathon-lb容器所在slave节点本身的ip,虽然marathon能长久保持服务在线,但对外提供服务的ip的变化还是需要高可用的设置,这里采用keepalived实现,vip:10.11.4.145。

Keepalived服务需要安装配置在所有marathon-lb可能下发到的slave节点。

1. 安装keepalived

Keepalived服务需要安装配置在所有marathon-lb可能下发到的slave节点。

keepalived版本:keepalived-1.3.6

具体的安装步骤请见:http://www.cnblogs.com/netonline/p/7598744.html

PS:注意各keepalived节点之间通告采用组播,iptables需要放行组播或vrrp相关协议。

2. keepalived配置文件

#各slave节点的keepalived配置文件根据情况做微小调整
[root@slave-node1 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf

! Configuration File for keepalived global_defs {
notification_email {
root@localhost.local
}
notification_email_from root@localhost.local
smtp_server 10.11.4.146
smtp_connect_timeout 30
router_id MARATHON_DEVEL
} vrrp_script chk_marathonlb {
script "/usr/local/keepalived/etc/chk_marathonlb.sh"
interval 1
weight 2 //脚本检测返回值为”0”时,权重上升
rise 1
} vrrp_instance VI_1 {
state BACKUP
interface br0
virtual_router_id 201
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 987654
}
virtual_ipaddress {
10.11.4.145
}
track_script {
chk_marathonlb
}
}

3. marathon-lb检测脚本

#根据配置文件中的配置设定检测脚本
[root@slave-node1 ~]# touch /usr/local/keepalived/etc/chk_marathonlb.sh
[root@slave-node1 ~]# chmod +x /usr/local/keepalived/etc/chk_marathonlb.sh
[root@slave-node1 ~]# vim /usr/local/keepalived/etc/chk_marathonlb.sh #!/bin/bash
# check if thers is a matathon-lb container running, then this is a keepalived master.
# 2017-09-18 v0.1 MARATHONLB_LOG="/tmp/marathon-lb.log" MARATHONLB=`netstat -tunlp | grep "haproxy" | grep ":80" | awk '{print $4}' | awk 'BEGIN{FS=":"} {print $2}'` #检测marathon-lb服务的80端口,若存在则返回”0”,不存在返回”1”;
#记录日志,非必须项
if [ ${MARATHONLB} -eq 80 ]; then
echo -e "`date +%F\ %T`: Matathon-lb is here, exit!\n" >> $MARATHONLB_LOG
exit 0 else
echo -e "`date +%F\ %T`: Matathon-lb is not here, the keepalived weight will be downgraded." >> $MARATHONLB_LOG
exit 1
fi

4. 验证

1)启动并查看vip

#验证过程中,marathon-lb所在的slave1节点宕机,marathon为了保持服务,将marathon-lb重新下发到在salve2节点
[root@slave-node2 ~]# systemctl daemon-reload
[root@slave-node2 ~]# systemctl restart keepalived
[root@slave-node2 ~]# ip a show br0

2)访问服务

#web服务下的两个instance都被重置过,这里修改新instance容器的index.html文件
[root@slave-node2 ~]# echo "This is Nginx Server: 10.11.4.147:31288" > index.html
[root@slave-node2 ~]# docker cp /root/index.html 9489b51370fd:/usr/share/nginx/html
[root@slave-node2 ~]# echo "This is Nginx Server: 10.11.4.147:31646" > index.html
[root@slave-node2 ~]# docker cp /root/index.html 2aee995a6ce7:/usr/share/nginx/html

(1)访问vip的10002端口;

URL:http://10.11.4.145:10002

(2)通过vip访问marathon-lb状态页。

URL:http://10.11.4.145:9090/haproxy?stats

基于marathon-lb的服务自发现与负载均衡的更多相关文章

  1. marathon的高可用服务自动发现和负载均衡

    上一篇我们说谈了docker+zookeeper+mesos+marathon集群,本篇我们来谈谈marathon的集群和自动发现服务. marathon的服务自动发现和负载均衡有两种,1是mesos ...

  2. 服务发现与负载均衡 dubbo zk原理

    服务发现与负载均衡 拓展阅读 : dubbo 原理概念图 2016-03-03 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 内容整理自文章“实施 ...

  3. 【云计算】mesos+marathon 服务发现、负载均衡、监控告警方案

    Mesos-dns 和 Marathon-lb 是mesosphere 官网提供的两种服务发现和负载均衡工具.官方的文档主要针对DCOS,针对其它系统的相关中文文档不多,下面是我在Centos7上的安 ...

  4. grpc服务发现与负载均衡

    前言 在后台服务开发中,高可用性是构建中核心且重要的一环.服务发现(Service discovery)和负载均衡(Load Balance)一直都是我关注的话题.今天来谈一下我在实际中是如何理解及落 ...

  5. (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh

    看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...

  6. 基于gRPC的注册发现与负载均衡的原理和实战

    gRPC是一个现代的.高性能.开源的和语言无关的通用RPC框架,基于HTTP2协议设计,序列化使用PB(Protocol Buffer),PB是一种语言无关的高性能序列化框架,基于HTTP2+PB保证 ...

  7. kubernetes云平台管理实战: 服务发现和负载均衡(五)

    一.rc控制器常用命令 1.rc控制器信息查看 [root@k8s-master ~]# kubectl get replicationcontroller NAME DESIRED CURRENT ...

  8. Consul + fabio 实现自动服务发现、负载均衡 - DockOne.io

    Consul + fabio 实现自动服务发现.负载均衡 - DockOne.io   http://dockone.io/article/1567

  9. 从零开始入门 | Kubernetes 中的服务发现与负载均衡

    作者 | 阿里巴巴技术专家  溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...

随机推荐

  1. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 首先 详解 STM32 以太网数据 到达 的第一站: ETH DMA 中断函数

    要 运行  LWIP  不光 要实现  OS  的 一些 接口  ,还要 有 硬件 数据 接口 移植 ,即 网线上 来的 数据 怎么个形式 传递给  LWIP ,去解析 做出相应的 应答  ,2017 ...

  2. Source folder is not on the Java build class path

    源文件夹不在Java构建类路径上 只需右键单击文件夹src - > build path - >Using source folders就是这样

  3. PE下安装官方WIN7

    进入PE后,用虚拟光驱 加载 win*.iso 文件后,运行安装程序setup.exe. 开始安装:

  4. NOIP2018 Day2毒瘤题目

    Day2毒瘤题目 T1:travel 拿到题目,一看,图论,完了...... 仔细看了看题目,诶这个不是dfs序么?当场敲出dfs.跑样例一,过了,结果一跑样例二,当场废掉.(样例二有环,会跑不出正解 ...

  5. VS2015菜单栏重复删除

    举个例子,这个是工具栏的,出现了重复 只要选择工具栏自定义那个选项,在多余命令的下方,先删除几个外部命令,然后把空行删除,最后全部重置即可 结果如下图

  6. 【学时总结】 ◆学时 · I◆ A*算法

    [学时·I]A*算法 ■基本策略■ --A*(A Star)无非就是BFS的升级,当BFS都超时的时候-- 同样以队列为基础结构,BFS使用FIFO队列(queue),而A*则使用优先队列(prior ...

  7. 19-3-15Python中闭包,迭代器,递归

    函数名的使用 函数名可以当作值赋值给变量 函数名可以当作元素放到容器里 闭包 一个嵌套函数 在嵌套函数内的函数使用外部(非全局的变量) 满足以上两条就是闭包 python中闭包,会进行内存驻留,普通函 ...

  8. MySQL语句详解(用户表、密码、权限、远程)

    注: mysql.user表中Host为%的含义 Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1.这里的意思就是说root用户只能通过192.168 ...

  9. tp5上传压缩包到相应文件并自动解压到相应文件下

    <?phpnamespace app\admin\controller\upload; use app\common\controller\Backend;use think\db;use th ...

  10. Delphi 的TStringBuilder防止服务器内存碎片化

    Delphi 2009+ 的 System.SysUtils提供了一个类似.Net的StringBuilder,用于存储字符数组. 很多人不明白为什么要用TStringBuilder, Delphi中 ...