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

在本地主机IP为192.168.20.47的主机上部署Marathon-lb。


安装Haproxy

1、Haproxy需要lua5.3及以上版本,CentOS7.2默认的lua版本是5.1.4,所以首先安装lua5.3.4,这里使用编译安装,需要确保系统中已经安装gcc和readline-devel:

1
2
3
4
5
6
7
8
[root@marathon-lb ~] # wget http://www.lua.org/ftp/lua-5.3.4.tar.gz
[root@marathon-lb ~] # tar  xf lua-5.3.4.tar.gz 
[root@marathon-lb ~] # cd lua-5.3.4 
[root@marathon-lb lua-5.3.4] # make linux test
[root@marathon-lb lua-5.3.4] # cd src
[root@marathon-lb src] # cp lua luac /usr/bin/ 
[root@marathon-lb ~] # lua -v
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio

2、安装Haproxy

先安装必要的模块:

1
[root@marathon-lb ~] # yum install socat openssl-devel pcre-devel zlib-devel libcurl-devel -y

下载最新的源码包安装:

1
2
3
4
5
6
7
8
[root@marathon-lb ~] # wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz 
[root@marathon-lb ~] # tar xf haproxy-1.7.8.tar.gz 
[root@marathon-lb ~] # cd haproxy-1.7.8
[root@marathon-lb 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
[root@marathon-lb haproxy-1.7.8] # make install PREFIX=/usr/local/haproxy
[root@marathon-lb haproxy-1.7.8] # haproxy -v
HA-Proxy version 1.7.8 2017 /07/07
Copyright 2000-2017 Willy Tarreau <willy@haproxy.org>

3、编写启动脚本,此处可参考系统自带的启动脚本,设置配置文件路径。测试使用reload命令是否正常。

1
2
/etc/init .d /haproxy  start
/etc/init .d /haproxy  reload


安装Marathon-lb

1、从github上下载安装Marathon-lb

1
2
3
[root@marathon-lb ~] # git clone https://github.com/mesosphere/marathon-lb.git 
[root@marathon-lb ~] # mv marathon-lb  /
[root@marathon-lb ~] # cd /marathon-lb

2、创建ca证书和pem文件(防止启动时报错,这里只做内部使用,可根据自己的实际需求申请证书)

1
2
3
4
5
cd  /etc/ssl/
openssl genrsa -out ca.key 1024
openssl req -new -key ca.key -out ca.csr 
openssl x509 -req -days 365 - in  ca.csr -signkey ca.key -out ca.crt 
cat  ca.crt ca.key > cert.pem

3、创建haproxy的global配置文件,启动haproxy

1
haproxy -f  /etc/haproxy/haproxy .cfg

4、在marathon上发布含有HAPROXY_GROUP类型的标签的app,这里发布一个haproxy组信息为“external”标签的tomcat容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{  
"id" : "tomcat"
"labels" : {
   "HAPROXY_GROUP" : "external" ,
   "HAPROXY_0_VHOST" : "tomcat-test.com"
    },
  
"cpus" :1,  
"mem" :128,  
"instances" : 1,  
"constraints" : [[ "hostname" "UNIQUE" , "" ]],  
"container" : {  
"type" : "DOCKER" ,  
"docker" : {  
"image" "tomcat" ,                                              
"network" "BRIDGE"
"portMappings" : [  
{ "containerPort" : 8080,  "hostPort" : 0, "servicePort" : 0,  "protocol" "tcp"  }  
]  
   }  
     }  
       }


5、配置Marathon-lb通过Marathon API获取容器应用状态,使用marathon-lb.py脚本更新haproxy配置信息并自动重新加载haproxy,这里需要指定marathon集群主机信息:

1
2
3
[root@marathon-lb 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 sse --group external \
--health-check

此时,会在/etc/haproxy目录下生成一个haproxy.cfg的文件。并会自动执行happroxy的reload操作。

提示:marathon-lb的python脚本需要运行在python3版本的环境,如果过是系统默认的python2.7,请参考此链接安装python3

6、每次执行marathon-lb.py的文件才会去更新haproxy配置,可以写一个marathon-lb的启动脚本使marathon-lb持续运行,这里只是示例,脚本比较粗糙,大家可以自行优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
# marathon-lb management script
# tryingstuff.blog.51cto.com
 
PIDFILE= /var/run/haproxy .pid
SINGNFILE= /tmp/marathon-lb .sign
MLB_HOME= /marathon-lb/
start() {
PRO_CUNT=` ps  -ef| grep  marathon_lb| grep  - v  'grep' | wc  -l`
if  [ $PRO_CUNT -gt 1 ]
   then
     echo  "marathon-lb already running!"
     exit  1
else 
     echo  "marathon-lb start! "  >  $SINGNFILE
fi
while  [ -f $SINGNFILE ]
   do
     cd  $MLB_HOME && . /marathon_lb .py -m http: //192 .168.20.41:8080 -m http: //192 .168.20.42:8080 -m http: //192 .168.20.43:8080 sse --group external --health-check &>  /dev/null
    done  
}
stop() {
rm  -f $SINGNFILE
echo  "marathon-lb stopped!"
}
case  "$1"  in
   start)
     start
     ;;
   stop)
     stop
     ;;
   *)
     echo  $ "Usage: $0 {start|stop}"
     exit  1
esac

给脚本添加执行权限并命名为marathon-lb,启动marathon-lb:

1
nohub marathon-lb start &

关闭marathon-lb:

1
marathon-lb stop

7、访问tomcat容器:

在本地hosts 文件中添加 marathon-lb IP(此处为192.168.20.47)和域名的对应记录(tomcat-test.com),访问tomcat-test.com:

wKiom1mSo7iAa20zAAGS-H0PbwU647.jpg



以容器方式配置Marathon-lb

理解了主机配置的方式,相对于以容器方式配置Marathon-lb那就太简单了,只需下载镜像,启动容器两步即可, 生产中推荐使用这种方式。

1、从官方下载Marathon-lb容器镜像

1
docker pull docker.io /mesosphere/marathon-lb

2、指定mesos的master主机和Haproxy 组,启动Marathon-lb容器:

1
2
3
4
docker run -d --privileged -e PORTS=9090 --net=host \
docker.io /mesosphere/marathon-lb  sse \
-m http: //192 .168.20.41:8080 -m http: //192 .168.20.42:8080 \
-m http: //192 .168.20.43:8080  --group external

这里所指定网络模式为host.

3、发布APP要指定标签类型,否则不会被marathon-lb获取到状态信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
   "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"  }
       ]
     }
   }
}

如果要实现多个APP负载均衡,可以直接在marathon上对当前的app进行扩容,点击“scale application”节点会自动添加到haproxy中。


4、我们可以通过访问marathon-lb容器所在的主机IP来访问nginx(指定了VHOST需要做解析或在本地添加hosts记录),使用如下格式访问9090端口来查看当前haproxy的状态:

http://192.168.20.45:9090/haproxy?stats                                                                          

可以创建多个marathon-lb容器作为高可用。


参考资料:

http://www.bubuko.com/infodetail-1506228.html 

https://github.com/mesosphere/marathon-lb 




 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1955757

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
7月前
|
开发框架 负载均衡 Java
Spring Cloud 介绍及负载均衡Ribbon、服务容错Hystrix 组件使用详解
Spring Cloud 介绍及负载均衡Ribbon、服务容错Hystrix 组件使用详解
115 0
|
4月前
|
负载均衡 算法 应用服务中间件
这些负载均衡都解决哪些问题?服务、网关、NGINX?
这些负载均衡都解决哪些问题?服务、网关、NGINX?
104 1
|
7月前
|
域名解析 负载均衡 网络协议
keepalived+vip+lvs高可用负载均衡服务演化
keepalived+vip+lvs高可用负载均衡服务演化
317 0
|
7月前
|
负载均衡 应用服务中间件 nginx
nginx配置负载均衡的服务宕机了,怎么配置高可用
nginx配置负载均衡的服务宕机了,怎么配置高可用
145 0
|
8月前
|
域名解析 运维 负载均衡
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
251 1
|
11月前
|
存储 负载均衡 容灾
Nacos多级服务存储模型, NacosRule负载均衡规则入门
下面来简单认识一下今天的主角Nacos吧.Nacos给我们提供了一个这样的服务分级存储模型:1级是服务, 2级是集群, 3级是实例. Nacos提供了权重配置来控制访问频率, 权重越大访问频率越高;Nacos同一集群的默认权重是1:1的;Nacos控制台可以设置实例的权重值0~1之间
282 0
BXA
|
11月前
|
Kubernetes 负载均衡 监控
探索 Kubernetes 网络的基础、服务、端点和负载均衡
Kubernetes 是一个开源容器编排系统,负责自动化部署、扩展和运行容器化应用程序。网络是 Kubernetes 架构中的一个重要组成部分,它为容器之间的通信提供基础服务。 在 Kubernetes 中每个 Pod 都有一个独立的 IP 地址,Pod 之间可以通过这个 IP 地址进行通信。同时,Kubernetes 还提供了一些机制来管理 Pod 的网络:如 Service、Endpoint、Ingress、NetworkPolicy 等。
BXA
121 0
|
设计模式 负载均衡 C++
如何使用单例模式确保服务 “负载均衡” 的唯一性?
如何通过 SingletonConstructor(单例对象构造器)快速地创建单例对象,在单进程应用中确保对象的唯一性至关重要!
132 0
如何使用单例模式确保服务 “负载均衡” 的唯一性?
|
负载均衡 Java API
Spring Cloud Gateway整合Nacos实现服务路由及集群负载均衡
我们都知道Spring Cloud Gateway是一个基于Spring Boot、Spring WebFlux、Project Reactor构建的高性能网关,旨在提供简单、高效的API路由。
Spring Cloud Gateway整合Nacos实现服务路由及集群负载均衡
|
负载均衡 应用服务中间件 测试技术
【Nginx】Windows平台下配置Nginx服务实现负载均衡
系统环境:win10 测试用的开发环境和服务类型:VS2022 + DotNet 6 + WebApi
293 0
【Nginx】Windows平台下配置Nginx服务实现负载均衡