Docker服务编排02-Apache Mesos+Marathon+MarathonLB

一。Mesos简介

Apache Mesos是一个集群管理器,可跨分布式应用程序或框架提供有效的资源隔离和共享。它位于应用程序层和操作系统之间,可以更加轻松地在大规模集群环境中更有效地部署和管理应用程序。它可以在动态共享节点池上运行许多应用程序
Apache Mesos将CPU,内存,存储和其他计算资源从机器(物理或虚拟)中抽象出来,使容错和弹性分布式系统能够轻松构建并有效运行。

Mesos架构:

Mesos 实现了两级调度架构,它可以管理多种类型的应用程序。第一级调度是 Master 的守护进程,管理 Mesos 集群中所有节点上运行的 Slave 守护进程。集群由物理服务器或虚拟服务器组成,用于运行应用程序的任务,比如 Hadoop 和 MPI 作业。第二级调度由被称作 Framework 的“组件”组成。Framework 包括调度器(Scheduler)和执行器(Executor)进程,其中每个节点上都会运行执行器。Mesos 能和不同类型的 Framework 通信,每种 Framework 由相应的应用集群管理。上图中只展示了 Hadoop 和 MPI 两种类型,其它类型的应用程序也有相应的 Framework
 

Mesos Master 协调全部的 Slave,并确定每个节点的可用资源,
聚合计算跨节点的所有可用资源的报告,然后向注册到 Master 的 Framework(作为 Master 的客户端)发出资源邀约。Framework 可以根据应用程序的需求,选择接受或拒绝来自 master 的资源邀约。一旦接受邀约,Master 即协调 Framework 和 Slave,调度参与节点上任务,并在容器中执行,以使多种类型的任务,比如 Hadoop 和 Cassandra,可以在同一个节点上同时运行。

Mesos流程

Slave是运行在物理或虚拟服务器上的Mesos守护进程,是Mesos集群的一部分。Framework由调度器(Scheduler)应用程序和任务执行器(Executor)组成,被注册到Mesos以使用Mesos集群中的资源。

  • Slave 1向Master汇报其空闲资源:4个CPU、4GB内存。然后,Master触发分配策略模块,得到的反馈是Framework 1要请求全部可用资源。
  • Master向Framework 1发送资源邀约,描述了Slave 1上的可用资源。
  • Framework的调度器(Scheduler)响应Master,需要在Slave上运行两个任务,第一个任务分配<2 CPUs, 1 GB RAM>资源,第二个任务分配<1 CPUs, 2 GB RAM>资源。
  • 最后,Master向Slave下发任务,分配适当的资源给Framework的任务执行器(Executor),接下来由执行器启动这两个任务(如图中虚线框所示)。 此时,还有1个CPU和1GB的RAM尚未分配,因此分配模块可以将这些资源供给Framework 2。

Mesos可扩展设计的关键之处是采用两级调度架构。 使用Framework代理任务的实际调度,Master可以用非常轻量级的代码实现,更易于扩展集群发展的规模。 因为Master不必知道所支持的每种类型的应用程序背后复杂的调度逻辑。 此外,由于Master不必为每个任务做调度,因此不会成为容量的性能瓶颈,而这在为每个任务或者虚拟机做调度的整体调度器中经常发生。

二。Mesos集群安装

使用源代码编译安装参考官方文档http://mesos.apache.org/documentation/latest/building/
为了简便,使用docker安装
以下是机器设计:
marathon是一个管理发布docker服务的平台,master负责收集所有slave的资源进行管理
master收集的slave机器的资源信息(cpu ,内存,磁盘)等邀约marthon
所有的docker服务部署到slave上,marathon-lb使用haproxy进行反向代理的软件

注意所有的机器上都需要安装docker环境
安全前最好修改docker默认镜像地址
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式

{
    "registry-mirrors": [
        "https://registry.docker-cn.com"
    ],
    "insecure-registries": []
}

注意关闭防火墙

iptables --flush
systemctl stop firewalld
systemctl disable firewalld

1。安装zookeeper
集群安装参考:https://blog.csdn.net/liaomin416100569/article/details/71642091
为了简单,这里安装一个docker版本的zookeeper
58.144:

docker run --net=host --name zookeeper --restart always -d zookeeper

2。安装Mesos Master
hub.docker.com搜索 mesos-master镜像
构建mesos-master教程参考github的md:https://github.com/mesosphere/docker-containers/tree/master/mesos
58.144和58.145:

docker run -d --net=host \
  -e MESOS_PORT=5050 \
  -e MESOS_ZK=zk://192.168.58.144:2181/mesos \
  -e MESOS_QUORUM=1 \
  -e MESOS_REGISTRY=in_memory \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp/mesos:/var/tmp/mesos" \
  mesosphere/mesos-master:1.5.2

启动后访问
http://192.168.58.144:5050和http://192.168.58.145:5050
其中有一个就是选举出的leader,另外一个5050所有信息是空,因为是standby状态

停止leader这一台,看另外一个是否自动变成leader

注意Leader那里使用的cdh3这样的主机名 如果使用主机名 使用浏览器在其他机器无法访问cdh3

在启动时加上这两个参数在最后,slave也一样

 --no-hostname_lookup --ip=192.168.58.144

最后命令就是

docker run -d --net=host \
  -e MESOS_PORT=5050 \
  -e MESOS_ZK=zk://192.168.58.144:2181/mesos \
  -e MESOS_QUORUM=1 \
  -e MESOS_REGISTRY=in_memory \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp/mesos:/var/tmp/mesos" \
  mesosphere/mesos-master:1.5.2  --no-hostname_lookup --ip=192.168.58.144

最后结果:

3。安装Mesos Slave

hub.docker.com搜索 mesos-slave镜像
构建mesos-slave教程参考github的md:https://github.com/mesosphere/docker-containers/tree/master/mesos

58.145和58.146:

docker run -d --net=host --privileged \
  -e MESOS_PORT=5051 \
  -e MESOS_MASTER=zk://192.168.58.144:2181/mesos \
  -e MESOS_SWITCH_USER=0 \
  -e MESOS_CONTAINERIZERS=docker,mesos \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log_slave/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp_slave/mesos:/var/tmp/mesos" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /cgroup:/cgroup \
  -v /sys:/sys \
  -v /usr/bin/docker:/usr/local/bin/docker \
  mesosphere/mesos-slave:1.5.2

一般启动报错

[root@localhost ~]# docker logs d3
I0125 13:12:51.832160     1 logging.cpp:201] INFO level logging started!
I0125 13:12:51.833210     1 main.cpp:365] Build: 2019-01-24 00:51:22 by ubuntu
I0125 13:12:51.833245     1 main.cpp:366] Version: 1.5.2
I0125 13:12:51.833261     1 main.cpp:369] Git tag: 1.5.2
I0125 13:12:51.833271     1 main.cpp:373] Git SHA: 3088295d4156eb58d092ad9b3529b85fd33bd36e
I0125 13:12:51.860543     1 systemd.cpp:240] systemd version `229` detected
I0125 13:12:51.860637     1 main.cpp:468] Initializing systemd state
E0125 13:12:51.860896     1 main.cpp:477] EXIT with status 1: Failed to initialize systemd: Failed to locate systemd runtime directory: /run/systemd/system

查看帮助mesos-slave中关于sytemd应用

[root@localhost ~]# docker run mesosphere/mesos-slave:1.5.2 --help | grep systemd
  --[no-]systemd_enable_support                                    Top level control of systemd support. When enabled, features such as
                                                                   the agent is launched as a systemd unit. (default: true)
  --systemd_runtime_directory=VALUE                                The path to the systemd system run time directory
                                                                   (default: /run/systemd/system)

添加参数 --no-systemd_enable_support    

docker run -d --net=host --privileged \
  -e MESOS_PORT=5051 \
  -e MESOS_MASTER=zk://192.168.58.144:2181/mesos \
  -e MESOS_SWITCH_USER=0 \
  -e MESOS_CONTAINERIZERS=docker,mesos \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log_slave/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp_slave/mesos:/var/tmp/mesos" \
  -v /run/docker.sock:/var/run/docker.sock \
  -v /cgroup:/cgroup \
  -v /sys:/sys \
  -v /usr/bin/docker:/usr/local/bin/docker \
  mesosphere/mesos-slave:1.5.2 --no-systemd_enable_support

在启动过程中 实际启动的slave中服务的容器都是使用宿主机的docker所以 which docker,结果就改了下

-v /usr/bin/docker:/usr/local/bin/docker \

最后发现/usr/local/bin下也有个docker实际启动的应该是这个 错误

E0125 14:26:55.503234     1 main.cpp:498] EXIT with status 1: Failed to create a containerizer: Could not create 

DockerContainerizer: Failed to create docker: Failed to get docker version: Failed to execute 'docker -H 

unix:///var/run/docker.sock --version': exited with status 2

修改为:

-v /usr/local/bin/docker:/usr/local/bin/docker \

修改后仍然报错

E0125 14:26:21.703552     1 main.cpp:498] EXIT with status 1: Failed to create a containerizer: Could not create 

MesosContainerizer: Failed to create launcher: Failed to create Linux launcher: Failed to determine the hierarchy where the 

subsystem freezer is attached: Failed to determine canonical path of /sys/fs/cgroup/cpuacct,cpu: No such file or directory

解决办法:

mount -o remount,rw '/sys/fs/cgroup'
ln -s /sys/fs/cgroup/cpu,cpuacct /sys/fs/cgroup/cpuacct,cpu

最终修改正确脚本
147启动slave

docker run -d --net=host --privileged  \
  --hostname 192.168.58.147 \
  -e MESOS_PORT=5051 \
  -e MESOS_MASTER=zk://192.168.58.144:2181/mesos \
  -e MESOS_SWITCH_USER=0 \
  -e MESOS_CONTAINERIZERS=docker,mesos \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log_slave/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp_slave/mesos:/var/tmp/mesos" \
  -v /run/docker.sock:/run/docker.sock  \
  -v /cgroup:/cgroup \
  -v /sys:/sys \
  -v /usr/local/bin/docker:/usr/local/bin/docker \
  mesosphere/mesos-slave:1.5.2 --no-systemd_enable_support

145启动slave

docker run -d --net=host --privileged  \
  --hostname 192.168.58.145 \
  -e MESOS_PORT=5051 \
  -e MESOS_MASTER=zk://192.168.58.144:2181/mesos \
  -e MESOS_SWITCH_USER=0 \
  -e MESOS_CONTAINERIZERS=docker,mesos \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log_slave/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp_slave/mesos:/var/tmp/mesos" \
  -v /run/docker.sock:/run/docker.sock  \
  -v /cgroup:/cgroup \
  -v /sys:/sys \
  -v /usr/local/bin/docker:/usr/local/bin/docker \
  mesosphere/mesos-slave:1.5.2 --no-systemd_enable_support

最后访问 http://masterip:5050/查看是否有两个agent启动

点击Agents

如果有些host是主机名可以在run方式 添加
--no-hostname_lookup

​docker run -d --net=host --privileged  \
  --hostname 192.168.58.145 \
  -e MESOS_PORT=5051 \
  -e MESOS_MASTER=zk://192.168.58.144:2181/mesos \
  -e MESOS_SWITCH_USER=0 \
  -e MESOS_CONTAINERIZERS=docker,mesos \
  -e MESOS_LOG_DIR=/var/log/mesos \
  -e MESOS_WORK_DIR=/var/tmp/mesos \
  -v "$(pwd)/log_slave/mesos:/var/log/mesos" \
  -v "$(pwd)/tmp_slave/mesos:/var/tmp/mesos" \
  -v /run/docker.sock:/run/docker.sock  \
  -v /cgroup:/cgroup \
  -v /sys:/sys \
  -v /usr/local/bin/docker:/usr/local/bin/docker \
  mesosphere/mesos-slave:1.5.2 --no-systemd_enable_support --no-hostname_lookup --ip=192.168.58.145

删除 log_slave和tmp_slave文件,重新创建后

 

三。Marason安装

前面安装的mesos主和从是核心模块,framwork才是真正提交应用的窗口,marason就是一个提交长时间运行服务的framwork
马拉松是一个经过生产验证的ApacheMesos容器编排框架。DC/OS是开始使用马拉松的最简单方法。马拉松提供了用于启动、停止和缩放应用程序的RESTAPI。马拉松是用Scala编写的,可以通过运行多个副本在高度可用的模式下运行。运行任务的状态存储在Mesos状态抽象中。马拉松是一种元框架:您可以使用它启动其他Mesos框架,比如Chronos或Storm,以确保它们在机器故障中存活下来。它可以启动任何可以在标准外壳中启动的内容。事实上,您甚至可以通过马拉松启动其他马拉松实例。

1。安装Marason

关于docker安装参考 https://hub.docker.com/r/mesosphere/marathon
官方文档:https://mesosphere.github.io/marathon/
使用docker容器启动(指定mesos的zk位置和自己存储元数据的zk位置)

docker run -d --hostname=192.168.58.144 --privileged --net=host mesosphere/marathon --master zk://192.168.58.144:2181/mesos --zk zk://192.168.58.144:2181/marathon --hostname=192.168.58.144

启动后访问 http://ip:8080端口

可以通过master的http://ip:5050端口查看framworks

点击界面create application新建一个命令任务
输入命令:
 

while [ true ];do sleep 5;echo 'hello jiaozi';done


发现任务变成unning状态 查看(点进去可以查看到位于哪台主机 145上)

查看master 5050 点击后面sandbox可以查看该任务的所有输出和错误等

2。安装Marason-LB

   Marathon-lb基于HAProxy,给基于TCP和HTTP协议的应用提供代理和负载均衡功能,此外还提供诸如SSL支持,HTTP压缩,健康检查,Lua脚本等。Marathon-lb订阅Marathon的事件总线,实时更新HAProxy的配置,并重载应用。

官方文档(过海):https://mesosphere.github.io/marathon/docs/service-discovery-load-balancing.html
                 
 https://docs.mesosphere.com/services/marathon-lb/
dockerhub:https://hub.docker.com/r/mesosphere/marathon-lb
docker安装命令

docker run -e PORTS=9090 --privileged  --hostname 192.168.58.144 --net=host -d mesosphere/marathon-lb:v1.12.3 sse --marathon http://192.168.58.144:8080 --group "*" 

其中--group "*" 表示所有在marathon上发布的服务定义的servicePort都进行服务发现,如果启动多个marthon-lb可以指定
服务发现哪些group 可以使用*通配符 ,比如 --group "logs_*" 表示服务发现所有logs_开头的组
marathon上可以定义加上HAPROXY_GROUP标签,指定对应应用组的值
运行完成访问 http://192.168.58.144:9090//haproxy?stats出现haproxy界面即部署成功

3。测试Marason新增服务和Marason-LB服务发现

在marasonui上添加一个应用

应用的镜像是 springcloud/eureka(springcloud的注册中心,默认开启8761端口)

添加容器端口(8761)和服务端口

点击Json mode映射一个服务端口,这个服务端口将来使用marathon-lb的ip:服务端口自动映射到容器端口8761
关于网络类型几种定义方式参考:https://mesosphere.github.io/marathon/docs/networking.html

保存后等待状态修改了running
访问 marathon-lb安装的主机的ip:10000端口

默认该注册中心状态显示是未知的

点击下面的Configuration右侧的Edit 添加一个Health Checks(最好在新建服务的时候就加 不知道为何后面加的有时不起效果)

具体上面的几个文本的意思是
 

protocol(可选,默认为HTTP):请求的协议有三种,分别是HTTP/TCP/COMMAND

HTTP/TCP健康检查被marathon执行,因此当前marathon leader必须是可以访问的。COMMAND健康检查是通过在代理服务上的mesos运行一个类似的任务在本地执行的。

下面的配置项适合所有协议: 
gracePeriodSeconds(可选,默认为300):健康检查失败在多少秒内被忽略,或者直到任务状态变成健康。 
intervalSeconds(可选,默认60):健康检查间隔时间 
maxConsecutiveFailures(可选,默认3):健康检查连续失败3次后,不健康的任务会被kill。如果这个值是0,即使健康检查失败,任务也不好被删除。 
timeoutSeconds(可选,默认20):健康检查请求没有会的响应的时限。

对TCP/HTTP健康检查,port和portIndex也许会使用到。如果没有提供,portIndex会被设定。如果提供了port,它会优先覆盖所有的portIndex选项。 
portIndex(可选,默认为0):这个应用的ports或portDefinitions数组的索引。所以应用可能会使用随机端口,例如[0,0,0],任务可能会使用$PORT1这个环境变量。 
port(可选,没有默认值):健康检查额端口号。

下面的配置只适用于HTTP健康检查: 
path(可选,默认为/):任务暴露一个终端点用于健康检查。例如:/path/to/health 
ignoreHttp1xx(可选,默认为false):忽略HTTP状态为100到199的信息。如果这个HTTP健康检查返回这个状态的信息,结果被丢弃和任务的健康状态保持不变。

注意:
   关于mesos的主从,marthon,marthon-lb的版本如果太新,有可能导致新加入的docker服务会无缘无故自动重启,每隔几分钟
就之前的docker容器创建一个新的,会累积无数个docker容器列表,我上面的内容的版本都是目前最新的所有有这个问题,后面
我将版本降到下面的版本搭配,就没有出现自动重启服务的情况了
   mesos-master:1.4.1+mesos-slave:1.4.1 +mesosphere/marathon:v1.5.2+mesosphere/marathon-lb:v1.11.1

如果需要使用mesos部署服务,所有的ip都应该指向marthon-lb的ip和服务端口

四。Marason服务部署

 这里就不举例去部署服务了,以下列出几种样例

  1.  如果是客户端服务调用发布方服务,就不再需要注册中心这样的机制了,mesos本身就是个注册中心,提供了服务发现功能,只需要制作镜像后,上传到harbor类似的私服, scale多个容器添加一个servicePort,客户端服务直接指定 marthon_lb的ip和serverPort就自动负载均衡发现了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值