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

安装Haproxy

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

[[email protected] ~]# wget http://www.lua.org/ftp/lua-5.3.4.tar.gz
[[email protected] ~]# tar  xf lua-5.3.4.tar.gz 
[[email protected] ~]# cd lua-5.3.4 
[[email protected] lua-5.3.4]# make linux test
[[email protected] lua-5.3.4]# cd src
[[email protected] src]# cp lua luac /usr/bin/ 
[[email protected] ~]# lua -v
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio

2、安装Haproxy

先安装必要的模块:

[[email protected] ~]# yum install openssl-devel pcre-devel zlib-devel libcurl-devel -y

下载最新的源码包安装:

[[email protected] ~]# wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz 
[[email protected] ~]# tar xf haproxy-1.7.8.tar.gz 
[[email protected] ~]# cd haproxy-1.7.8
[[email protected] 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
[[email protected] haproxy-1.7.8]# make install PREFIX=/usr/local/haproxy
[[email protected] haproxy-1.7.8]# haproxy -v
HA-Proxy version 1.7.8 2017/07/07
Copyright 2000-2017 Willy Tarreau <[email protected]>

安装Marathon-lb

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

[[email protected] ~]# git clone https://github.com/mesosphere/marathon-lb.git 
[[email protected] ~]# mv marathon-lb  /
[[email protected] ~]# cd /marathon-lb

2、配置Marathon-lb通过Marathon API获取容器应用状态,生成haproxy配置并重新加载haproxy.

[[email protected] 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  --group external --dont-bind-http-https

此时,会在/etc/haproxy目录下生成一个haproxy.cfg的文件。

提示:如果出现如下报错,请参考此链接安装python3

/usr/bin/env: python3: No such file or directory

3、启动haproxy

haproxy -f  /etc/haproxy/haproxy.cfg

4、发布含有HAPROXY_GROUP类型的标签的app,marathon-lb就能实时更新haproxy配置信息。

以容器方式配置Marathon-lb

以容器方式配置Marathon-lb非常简单,只需下载镜像,启动容器两步即可完成。

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

docker pull docker.io/mesosphere/marathon-lb

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

docker run -d --privileged -e PORTS=9090 --net=host docker.io/mesosphere/marathon-lb sse -m http://192.168.20.41_ip:8080 -m http://192.168.20.42:8080 -m http://192.168.20.43:8080  --group external

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

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

{
  "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" }
      ]
    }
  }
}

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

http://192.168.20.45:9090/haproxy?stats

参考资料:

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

时间: 2024-12-29 04:26:38

Marathon-lb 服务自动发现和负载均衡的相关文章

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

一.rc控制器常用命令 1.rc控制器信息查看 [root@k8s-master ~]# kubectl get replicationcontroller NAME DESIRED CURRENT READY AGE myweb 3 3 3 3m [root@k8s-master ~]# kubectl get rc NAME DESIRED CURRENT READY AGE myweb 3 3 3 5m 2.删除rc [root@k8s-master ~]# kubectl delete

LB(Load balance)负载均衡集群--{LVS-[NAT+DR]单实例实验+LVS+keeplived实验} 菜鸟入门级

LB(Load balance)负载均衡集群 LVS-[NAT+DR]单实例实验 LVS+keeplived实验 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 逻辑可分为: 1调度层 (Director):它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的. 2[服务器池(server pool)/集群层(Real server)]:是一组真正执行客

Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡

Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Keepalived实现WEB服务的高可用负载均衡服务,终于在2017年的第一天前完成了,所以在此分享给有需要的朋友:说到负载均衡,其实在linux下有很多服务可以实现,比如nginx.haproxy.lvs等服务,当前我们在前面的文章有介绍过了,但是对于高可用服务,我们在linux下最常见也是应用最多的是Kee

[转][网站、云服务与虚拟机]弄清负载均衡的机制

转自:http://blog.csdn.net/shaunfang/article/details/9091491 Azure为网站.云服务和虚拟机都提供了免费的负载均衡能力.关于负载均衡我们需要注意的一点就是它对Session的处理.一般来说,传统的负载均衡器有一种叫session粘滞(sticky)的机制,也就是会根据用户的session信息将用户请求转发到固定的一台机器上,这样,如果应用程序在服务器端存储session信息,那么用户与服务器交互就会顺畅,否则,就会发生用户session丢失

Spring Cloud Ribbon---微服务调用和客户端负载均衡

前面分析了Eureka的使用,作为服务注册中心,Eureka 分为 Server 端和 Client 端,Client 端作为服务的提供者,将自己注册到 Server 端,Client端高可用的方式是使用多机部署然后注册到Server,Server端为了保证服务的高可用,也可以使用多机部署的方式.前面简单搭建了Eureka Client 和 Server,然后将Client成功注册到 Server,本节我们将来看看如何调用Eureka服务,在多机部署情况下如何保证负载均衡.Spring Clou

LB(load balance)负载均衡集群之LVS

LB(load balance)负载均衡集群 原理:当用户的请求过来,会直接发送到分发器上(Director Server),然后它把用户的请求根据预先设置好的算法,智能均衡的分发到后端真是的服务器上(real server).如果不同的机器,可能请求的数据不一样,为了避免这样的情况发生,使用共享存储,保证所有的用户请求的数据是一样的. 常用的负载均衡开源软件有: lvs,keepalived,haproxy,nginx,apache,heartbeat 商业的硬件负载设备: F5,Netsca

1.利用consul实现k8s服务自动发现

标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } ? - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额外的手动配置, 有关详细信息可参阅:https://www.consul.io/docs/platform/k8s/helm.html - 我们使用basic-auth作了授权,当用户访问consul-ui时需要提供用户名和密码 ?shell yum -y install httpd echo "$

干货分享微服务spring-cloud(4.负载均衡ribbon与熔断器hystrix)

Ribbon是一个基于http和tcp的客户端负载均衡工具 Hystrix具备服务降级.服务熔断.线程和信号隔离.请求缓存.请求合并以及服务监控 为了方便消费者负载均衡效果,复制demo-springcloud-client1并重名为demo-springcloud-client2,修改配置文件和启动类,服务提供者1和2服务名均为spring.application.name=demo-springcloud-client 修改YhqContoller实现,为了方便负载均衡观察效果,demo-s

基于Consul+Registrator+Nginx实现容器服务自动发现的集群框架

我们先来看一下服务发现常用的框架有哪些: zookeeper eureka etcd consul 这里就不挨个来介绍它们了,本文中主要以consul为主,如果你在大量接触或使用微服务的话,你可能会碰到一个问题?当你创建的服务数量越来越多时,这些服务之间的通信便越难管理,而且维护代价会越来越高.consul可以给你答案,我们一起来了解一下consul: 1.了解consul Consul是一个分布式,高度可用且支持多数据中心的服务发现,配置和编排工具. Consul支持大规模部署,配置和维护面向