Mesos+Marathon docker 集群管理

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

前面我们了解了docker常见的操作和部署方法,在企业中,如果要大规模使用docker就不能通过纯手工的方式去维护和部署了。目前比较流行的有两种解决方案,一种是使用 Mesos+Marathon+docker的方式对集群中的容器进行管理,另一种方式是使用Kubernetes,就目前Kubernetes有引领行业的趋势,但是对于小型的集群管理,mesos符合传统主从架构,更加简单。


Mesos介绍

Mesos容器管理的理念个人觉得类似于OpenStack, 通过master将整个集群的资源搜集起来,当需要创建容器,或执行某个task时,会根据当前集群中的资源情况进行调度,对集群中运行的应用进行统一的资源管理。创建的容器在节点上是随机分配的(前提是资源足够的情况下),当某个容器或任务因故障终止后,在其它节点会自动创建一个新的容器来实现高可用。

在 Mesos 上运行的 framework 由两部分组成:一个是 scheduler ,通过注册到 master 来获取集群资源。另一个是在 slave 节点上运行的 executor 进程,它可以执行 framework 的 task 。 Master 决定为每个 framework 提供多少资源, framework 的 scheduler 来选择其中提供的资源。当 framework 同意了提供的资源,它通过 master 将 task发送到提供资源的 slaves 上运行。


配置mesos集群

本次示例使用6台CentOS7.2主机,3台作为mesos-master集群,另外3台作为mesos-slave。slave上运行容器执行task.

1、系统初始化:

对这六台机器配置hosts解析,并添加yum源:

1
2
3
4
5
6
7
8
cat  >> /etc/hosts  <<EOF
192.168.20.41 mesos1        # master
192.168.20.42 mesos2        # master
192.168.20.43 mesos3        # master
192.168.20.44 mesos4        # slave
192.168.20.45 mesos5        # slave
192.168.20.46 mesos6        # slave
EOF
1
2
3
4
setenforce 0
sed  -i  's#SELINUX=enforcing#SELINUX=disabled#g'  /etc/sysconfig/selinux
systemctl stop firewalld
systemctl disable firewalld
1
rpm -Uvh http: //repos .mesosphere.io /el/7/noarch/RPMS/mesosphere-el-repo-7-2 .noarch.rpm


2、配置mesos-master

在mesos1,mesos2和mesos3上配置zookeeper集群:

1
2
yum  install  -y java-1.8.0-openjdk-devel java-1.8.0-openjdk
yum -y  install  mesos marathon mesosphere-zookeeper

配置zookeeper集群ID

mesos1: 

1
echo  1 >  /var/lib/zookeeper/myid

mesos2: 

1
echo  2 >  /var/lib/zookeeper/myid

mesos3: 

1
echo  3 >  /var/lib/zookeeper/myid

在3台master上, 配置zookeeper集群信息:

1
vim  /etc/zookeeper/conf/zoo .cfg
1
2
3
4
5
6
7
8
9
maxClientCnxns=50                      #单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是50,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
tickTime=2000                          #Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳
initLimit=10                           #Zookeeper的Leader 接受客户端(Follower)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit=5                            #表示 Leader 与 Follower 之间发送消息时请求和应答时间长度,最长不能超过多少个tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
dataDir= /var/lib/zookeeper             #zookeeper数据文件存放目录
clientPort=2181                        #客户端连接端口
server.1=192.168.20.41:3181:4181       #数字1,2,3表示这个是第几号服务器(是上面myid文件里对应的数字);中间的是master主节点的ip地址
server.2=192.168.20.42:3181:4181       #第一个端口2888(这个端口可以自己定义)表示的是这个服务器与集群中的 Leader 服务器交换信息的端口
server.3=192.168.20.43:3181:4181       #第二个端口3888表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

配置集群端口:

1
2
3
vim  /etc/mesos/zk 
 
zk: //192 .168.20.41:2181,192.168.20.42:2181,192.168.20.43:2181 /mesos

配置仲裁,此处使用的是3个节点,所以配置仲裁数目为2 (集群节点数目/2,四舍五入):

1
2
cat  /etc/mesos-master/quorum
2

mesos集群是通过zookeeper来交互的,所以只需要配置zookeeper即可, 配置完成之后,启动mesos-master集群:

1
2
3
systemctl  enable  zookeeper && systemctl  enable  mesos-master && systemctl  enable  marathon
systemctl start zookeeper && systemctl start mesos-master && systemctl start marathon
systemctl disable mesos-slave

查看zookeeper的状态:

1
/opt/mesosphere/zookeeper/bin/zkServer .sh status  /etc/zookeeper/conf/zoo .cfg

确认mesos-master 和marathon启动,并开放端口:

1
2
systemctl status mesos-master 
systemctl status marathon


3.  配置各slave节点

安装docker 和mesos :

1
2
yum  install  docker -y
yum  install  mesos -y

配置slave的master信息以及运行方式:

1
2
echo  "zk://192.168.20.41:2181,192.168.20.42:2181,192.168.20.43:2181/mesos"  /etc/mesos/zk
echo  'docker,mesos'  /etc/mesos-slave/containerizers

启动服务:

1
2
systemctl start docker && systemctl  enable  docker
systemctl start mesos-slave && systemctl  enable  mesos-slave

下载docker 镜像(可参考配置国内镜像源的方式):

1
2
docker pull nginx
docker pull tomcat

4. 登录master上的任意一台机器, 分别进入 mesos和marathon的管理界面:

http://192.168.20.41:5050

http://192.168.20.41:8080 


在端口为5050的mesos 界面,angent栏中可以看到三台slave已经被添加进来:

wKioL1mKadDB80-oAAGke7PhkmI864.jpg

使用8080端口访问的Marathon,由于还没有添加任务,所以显示的是“No Application”:

wKioL1mKataCrBsjAAESE9FyFpk285.jpg


测试容器应用


1、marathon可以使用REST API的方式来处理任务需求,我们先测试通过API的方式来创建一个nginx的docker容器

在master上编辑nginx.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
   "id" : "nginx" ,
   "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"  }
       ]
     }
   }
}

使用POST 方法执行:

1
curl -X POST http: //192 .168.20.41:8080 /v2/apps  -d @nginx.json -H  "Content-type: application/json"

执行此命令后,会返回一串json的详细配置信息,在mesos界面可以看到已经有一个任务在运行:

wKiom1mKcMHT0KdvAAIorY3iK3U321.jpg

在marathon界面,可以看到此容器对外开放的端口:

wKiom1mKcZ7jbFKZAAFWDLQgbBI202.jpg

直接对此端口进行访问,就可以访问到我们熟悉的nginx初始界面。


我们可以查看在mesos5这台机器上的容器状态:

1
2
3
[root@mesos5 ~] # docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                   NAMES
ee6639983450        nginx                "nginx -g 'daemon off"    11 minutes ago      Up 11 minutes                 0.0.0.0:31495->80 /tcp    mesos-398a0a16-fe13-48e6-9a9c-6932c6c58014-S1.525f7318-9bb7-486c-9c3a-13d5294f37ff

查看端口:

1
2
[root@mesos5 ~] # docker port ee6639983450 
80 /tcp  -> 0.0.0.0:31495

mesos上创建的容器映射的对外端口,默认会使用31000-32000之间的随机端口。


使用Marathon管理容器

在日常的操作中,为了更加方便快捷的使用docker,可以通过使用Marathon来管理容器。

在Marathon的创建应用界面,我们可以看到对应的配置选项:

wKiom1mKd0Gz5p87AAEHySJl-8c245.jpg

在此界面,我们也可以直接使用json配置的方式,直接编写我们需要的配置:

wKioL1mKeynBADYfAAEGp3tZsMs781.jpg

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{  
"id" : "tomcat" ,  
"cpus" :1,  
"mem" :128,  
"instances" : 1,  
"constraints" : [[ "hostname" "UNIQUE" , "" ]],  
"container" : {  
"type" : "DOCKER" ,  
"docker" : {  
"image" "tomcat" ,                                              
"network" "BRIDGE"
"portMappings" : [  
{ "containerPort" : 8080,  "hostPort" : 31001, "servicePort" : 31002,  "protocol" "tcp"  }  
]  
   }  
     }  
       }

这里指定了容器端口和对外映射的端口,hostPort为主机上映射的端口,可指定的范围是31000到32000,如果设置为0 表示随机分配端口。当containerPort和hostPort都设置为0时,将随机分配一个相同的端口。


点击“Create Application”即可创建出一个tomcat容器:

wKiom1mKe8ayPI0AAAEdLhgGuBA769.jpg


这里在配置json的时候,我们指定了默认的端口为31001:

wKioL1mKfMyTEKGJAAFFEmYndEs641.jpgwKiom1mKfYKSK8pqAAGItmL94h0435.jpg

如果当某个节点出现故障,或者docker 服务意外退出,mesos会自动掉度容器到其他可用的主机上,如果是指定了容器的对外端口,端口不会改变:

停止mesos6上的docker 服务,tomcat 容器将会漂移到其他slave节点

1
[root@mesos6 ~] # systemctl stop docker

查看Marathon上容器状态:

wKiom1mKf2Hgp-XVAAD7uUTr1Uc086.jpg

容器从mesos6 漂移到了mesos4, 对外端口不变:

1
2
3
4
5
[root@mesos4 ~] # docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
03b70cad8ad9        tomcat               "catalina.sh run"    4 minutes ago       Up 3 minutes        0.0.0.0:31001->8080 /tcp    mesos-398a0a16-fe13-48e6-9a9c-6932c6c58014-S0.6b97951a-336e-47ab-84c9-38229e9ba132
[root@mesos4 ~] # docker port 03b70cad8ad9
8080 /tcp  -> 0.0.0.0:31001


mesos创建容器流程

目前,Docker Containerizer 作为任务启动时,需要执行以下操作:

将所有在 CommandInfo 中指定的文件放入一个隔离的沙盒中

从远程仓库拉取 docker 镜像

使用 Docker executor 来运行 docker 镜像,同时将沙盒目录映射到容器中环境变量 MESOS_SANDBOX 所指定的目录。 executor 也将容器的日志流重新定向到外部的 stdout/stderr 文件。

当退出容器或者销毁 containerizer 时,停止并移除 docker 容器实例。

Docker Containerizer 启动的容器的 ID 由 前缀" mesos- " 加上 slave ID( 如,mesos-slave1-abcdefghji )组成,并且假设所有以 " mesos- "为前缀的容器都由 slave 管理,slave 可以任意停止和销毁容器。


在创建容器的时候会出现容器创建不成功的情况,一般有如下几种原因:

1、环境资源不足。在mesos资源管理界面,可以看到当前资源的使用情况,如果容器的cpu,内存,磁盘等资源超出当前环境可以提供的范围,容器创建会失败。

2、当前环境中无可用的镜像。创建容器时,如果本地没有对应的镜像,docker默认会从官方下载,但是下载不一定会成功,可以查看系统进程,如果长时间卡在 docker pull等命令上,就是无法获取镜像。建议先在本地创建好镜像资源。

3、端口指定超出范围。在指定hostPort时,也需要指定servicePort, 且端口范围必须在31000-32000之间,否则创建容器的时候会出错。这个端口范围可以通过配置修改,在实际应用中一般使用marathon-lb来解决随机端口的问题。



参考资料:

https://mesos-cn.gitbooks.io/mesos-cn/content/OverView/Mesos-Architecture.html 

http://www.cnblogs.com/kevingrace/p/5685313.html 

https://mesosphere.github.io/marathon/docs/ports.html 



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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
8月前
|
存储 关系型数据库 应用服务中间件
容器集群管理工具 Docker Swarm
[《了解和使用Docker》](https://wangbinguang.blog.csdn.net/article/details/130851283)中有提到容器编排工具 docker compose ,不过只限于单机。如果现在需要搭建一个集群环境,提供了10台服务器用来部署应用以及其依赖的组件,比如5个 Tomcat 应用容器、3个Redis、5个 Mysql、3个 Nginx ,你会如何部署?
185 0
|
4月前
|
NoSQL 网络安全 Redis
|
6月前
|
Kubernetes 调度 Apache
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
191 0
|
9月前
|
分布式计算 Ubuntu Hadoop
Hadoop生态系统中的云计算与容器化技术:Apache Mesos和Docker的应用
Hadoop生态系统中的云计算与容器化技术:Apache Mesos和Docker的应用
|
9月前
|
人工智能 网络协议 调度
Docker Swarm集群管理
Docker Swarm集群管理
101 0
|
存储 负载均衡 网络协议
Docker Swarm 集群管理
Docker Swarm 集群管理
750 0
Docker Swarm 集群管理
|
监控 Kubernetes Cloud Native
分享Docker监控体系(Kubernetes Mesos监控)
常不释放资源,造成高CPU占用;比如进程结束异常,不停的重启相同的进程;比如日志级别设置过低,大量日志输出,影响进程性能和占用大量磁盘空间。所以做监控时一定要遵循有自我安全控制的能力。监控工具在拿到生产环境中运行前,一定要先在测试环境中进行一段时间的试运行 。
1722 0
|
Kubernetes API Docker
Kubernetes与docker集群管理常见问题解析
很荣幸受邀参加开源中国社区的高手问答,我是时速云团队的后端工程师,负责主机管理功能开发。在互动过程中,发现大家在使用/调研kubernetes(简称k8s)过程中遇到了很多问题,这里我总结为几点: l 如何搭建 l 性能(包括网络性能) l 如何管理容器 l 容器如何对外提供服务 l K8s 与docker swarm对比 下面我们对这几个方面分别说明。
2064 0
|
Kubernetes Shell Docker
Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)
0、前言  整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录   1、部署master组件 master 服务器的组件有:kube-apiserver、kube-controller-manager、kube-scheduler 因此需要下载k8s master,下载地址:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md ,当然大家可以下载更高版本的。
1294 0
|
Kubernetes Linux 网络安全
Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)
0、前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一、服务器设置   1、把每一个服务器的selinux 设置为 disabled 设置方式: vi  /etc/selinux/config 将 SELINUX=disabled,然后保存,然后 执行命令: setenforce 0,使之生效。
1220 0