一。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服务部署
这里就不举例去部署服务了,以下列出几种样例
- 如果是客户端服务调用发布方服务,就不再需要注册中心这样的机制了,mesos本身就是个注册中心,提供了服务发现功能,只需要制作镜像后,上传到harbor类似的私服, scale多个容器添加一个servicePort,客户端服务直接指定 marthon_lb的ip和serverPort就自动负载均衡发现了