使用 Mesos 管理 Docker 实践

Posted 点融黑帮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Mesos 管理 Docker 实践相关的知识,希望对你有一定的参考价值。


为什么选用Mesos


Mesos:


l 两级调度框架

l 适合各种场景应用:长期运行服务、大数据、定时任务

l 混合部署

l 专注调度,在其之上按需构建PaaS

l 黄金搭档Docker

l 与原生Swarm相比,Swarm尚不够成熟,且无法与global macvlan共存

l 与K8S对比,实验过发现 K8S 比较复杂,发展迅猛,版本更新迭代很快,需要投入的人力成本更多

l Mesos是一种底层级、久经沙场的调度器,在规模上,只有 Mesos已经证明了支持成百上千个节点的大型系统。


基于MESOS+MARATHON (MM) 

的平台实现


功能框架:



各组件描述:


l Mesos 仅负责分布式集群资源调配

l Marathon 做任务调度,资源转移

l Zookeeper 负责Mesos-Master的选举,Docker全局网络信息的存储

l Haproxy/nginx 进行服务的负载,引流

l Bamboo 负责服务的发现,通过与 Marathon Event事件对接,实时更新 Haproxy/Nginx 的配置并 reload。


组件版本:


l Mesos                                        1.0.0       

l Marathon                                   1.1.2

l Docker                                    1.12

l Zookeeper                              3.4.5

l Haproxy                                  1.5.14

l Bamboo                                  0.2.20

l Nginx                                          1.10.3


 基础镜像篇 


Docker 推崇一容器一服务,但是这对于大部分的企业并不适合,所以我们在镜像中加入了如下主要进程:


1.Crontab
2.ssh
3.listener (supervisor event listener, 自定义的脚本,用来监听 supervisor 发出的事件,如进程挂掉告警)

4.Scribe(轻量日志收集)


并统一由 supervisor 管理。


另外,由于容器内部使用 free 等命令看到的都是宿主机的信息。

所以采用了lxcfs 的方案,分为三步:


1.宿主机安装 lxcfs-2.0.3-1.1.el7.centos.x86_64.rpm,然后启动 lxcfs 服务

2.容器内安装 yum install procps

3.容器启动时挂载 --volumns /var/lib/lxcfs/proc/:/docker/proc/

这样使用 free 等命令就能看到容器本身CPU内存的使用情况了。


 网络篇 


网络一直是容器这块的一大痛点,主要是容器间的跨主机通信。要么架构复杂难以运维,要么是性能损耗过多,主要是通过 iptables转发、维护路由表、隧道(overlay)、大二层等方式实现。

市面上流行的方案有:


OpenVSwitch:实现简单,但配置较为麻烦

Calico:基于BGP协议,完全通过三层路由实现,依赖 iptables

Flannel:主机间通过udp或者vxlan实现跨主机间的通信。每个主机一个子网,灵活性不足

Weave:差评

Overlay原生:基于VXLAN 实现,性能表现不佳

Macvlan:性能最优方案,基于二层隔离,所以需要二层路由器支持。


本文将介绍的是 Macvlan 方案


Macvlan,性能方面仅次于 host 模式,容器网络和物理网络完全打通。

能排行:Host ≈ Macvlan > Calico > Flannel > Weave


附一张网络上的性能对比图


使用 Mesos 管理 Docker 实践


Docker 在 1.9 之后,支持定义远端 storage 用于全局网络信息的存储,而 docker 本身的macvlan 仅支持单台主机容器间通信,如 --driver macvlan 创建的网络 scope 是 “Local” 的,所以需要修改 docker 源码,让网络信息存入远端存储以便 IPAM。


修改完成后,重新编译打包安装 docker。

(宿主机上的 docker 启动命令如下:#/usr/bin/dockerd --insecure-registry 10.24.247.22:5000 --cluster-store=zk://10.43.1.194:2181 --cluster-advertise=eno2:2376 -H  unix:///var/run/docker.sock -H tcp://0.0.0.0:4243)

PS:cluster store 使用的 zookeeper


开始创建 Macvlan:


#docker network create -d macvlan --subnet=10.24.252.0/24 --gateway=10.24.252.254 -o parent=eth3.607 mac_net

10.24.252.0/24 网段需要提前在交换机上配置好规则,也就是前面所说的依赖二层交换机。

这个例子就是单独划分了 252 网段专门给容器使用,eth3是第四块物理网卡,607为vlan的tag,可针对不同情况做改变。这样你就会发现,创建出来的容器网络 mac_net 的 scope是 global 的。并且 mac_net 这个网络已经自动同步到了其他宿主机。


在不同主机上创建容器:


# docker run -itd --name test1 --net=mac_net centos7:base

# docker run -itd --name test2 --net=mac_net centos7:base

容器 test1 与 test2 均处于 10.24.252.0/24 网段中,并且能互通。

PS: 在使用 mesos + marathon 做调度时,是由上层的 marathon 来完成传递 docker run 任务


 Mesos + Marathon + ZK集群搭建篇 


Mesos分为 mesos-master(管理节点) 与 mesos-slave(计算节点), 官方建议是至少3台mesos-master,  Marathon能确保所有docker进程启动运行,如果某个进程崩溃,Marathon会重新启动同样的进程,以确保每个配置运行一个实例,并直接简单提供好的REST API用来管理容器。这里就不做安装步骤的复述了,具体可参见官方文档。


附 Mesos 结构图:


使用 Mesos 管理 Docker 实践


Ps:需要注意的是在 master 节点的 /etc/mesos-master/quorum 配置里的数字要大于安装的master节点的总数的0.5倍。



 服务发现自动注册篇

(Bamboo+Haproxy/Nginx) 


简而言之,Bamboo 是一个专门针对 Mesos + Marathon 自动动态生成 Haproxy 配置文件并执行 reload 的一个 web daemon。源码仅几千行(Golang)。


原理:


监听 Marathon 的事件接口,Marathon 的Event接口开启后,所有发生的事件都会从这个接口通知出来。Bamboo 通过监听这个接口,实现动态的更新 Haproxy 配置并 reload。

原生的机制是:只要接收到新的事件,就去获取 /v2/apps 接口下所有应用及应用内的容器IP,端口等信息,与当前的 haproxy.conf 比对,若有不同,就去更新配置并 reload。否则不动Haproxy。会有一种情况,在扩容应用时,marathon尚未完全启动所有容器,haproxy的配置就已经被更新。我做的改进是,分析事件内容,根据事件内容再去决定是否更新 haproxy。并且把 haproxy.conf 拆分开来,一个应用一个配置,如haproxy.app.conf。根据具体应用的改变去更新,以此保证在 reload 时不会影响到所有应用。


了解Bamboo 的源码后,再去做更多的改进就会变得很简单,所以加入了 bamboo 对nginx的支持。而nginx 是支持热更新 upstream 的,使用 consul + upsync 方案,我们只用让bamboo去动态更改 consul 里的配置就好啦!


使用 Mesos 管理 Docker 实践


(原生项目链接https://github.com/QubitProducts/bamboo)


还有日志收集、容器监控(cadvisor)这里就不做详细描述了。




使用 Mesos 管理 Docker 实践


点击回顾往期精彩内容















以上是关于使用 Mesos 管理 Docker 实践的主要内容,如果未能解决你的问题,请参考以下文章

Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践

比拼Mesos/Marathon?基于Docker 1.12 Swarm集群管理深度实践

基于Mesos和Docker的企业级移动应用实践分享

大规模Mesos&Docker在去哪儿网的最佳实践

使用Mesos管理Docker(Mesos+Marathon+Docker)

DCOS实践分享:基于Mesos 和 Docker 企业级移动应用实践分享