前面我们了解了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源:

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
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
systemctl stop firewalld
systemctl disable firewalld
rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-2.noarch.rpm

2、配置mesos-master

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

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

配置zookeeper集群ID

mesos1:

echo 1 > /var/lib/zookeeper/myid

mesos2:

echo 2 > /var/lib/zookeeper/myid

mesos3:

echo 3 > /var/lib/zookeeper/myid

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

vim /etc/zookeeper/conf/zoo.cfg
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,而这个端口就是用来执行选举时服务器相互通信的端口。

配置集群端口:

vim /etc/mesos/zk zk://192.168.20.41:2181,192.168.20.42:2181,192.168.20.43:2181/mesos

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

cat /etc/mesos-master/quorum
2

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

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的状态:

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

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

systemctl status mesos-master
systemctl status marathon

3.  配置各slave节点

安装docker 和mesos :

yum install docker -y
yum install mesos -y

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

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

启动服务:

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

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

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已经被添加进来:

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

测试容器应用


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

在master上编辑nginx.json:

{"id":"nginx","cpus":0.2,"mem":20.0,"instances": 1,"constraints": [["hostname", "UNIQUE",""]],"container": {"type":"DOCKER","docker": {"p_w_picpath": "nginx","network": "BRIDGE","portMappings": [{"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" }]}}
}

使用POST 方法执行:

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

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

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

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

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

[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

查看端口:

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

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

使用Marathon管理容器

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

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

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

输入以下内容:

{
"id":"tomcat",
"cpus":1,
"mem":128,
"instances": 1,
"constraints": [["hostname", "UNIQUE",""]],
"container": {
"type":"DOCKER",
"docker": {
"p_w_picpath": "tomcat",
"network": "BRIDGE",
"portMappings": [
{"containerPort": 8080, "hostPort": 31001,"servicePort": 31002, "protocol": "tcp" }
]  }  }  }

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

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

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

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

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

[root@mesos6 ~]# systemctl stop docker

查看Marathon上容器状态:

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

[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

转载于:https://blog.51cto.com/tryingstuff/1954726

Mesos+Marathon docker 集群管理相关推荐

  1. Docker集群管理之Swarm介绍

    [摘要] Docker自诞生以来,其容器特性以及镜像特性给DevOps爱好者带来了诸多方便.然而在很长的一段时间内,Docker只能在单host上运行,其跨host的部署.运行与管理能力颇受外界诟病. ...

  2. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

  3. Kubernetes与docker集群管理常见问题解析

    很荣幸受邀参加开源中国社区的高手问答,我是时速云团队的后端工程师,负责主机管理功能开发.在互动过程中,发现大家在使用/调研kubernetes(简称k8s)过程中遇到了很多问题,这里我总结为几点: l ...

  4. docker集群管理

    docker集群管理 ps:docker machine     docker swarm       docker compose  在Docker Machine发布之前,你可能会遇到以下问题: ...

  5. docker集群管理工具_太多选择:如何选择正确的工具来管理Docker集群

    docker集群管理工具 There are all kinds of ways to play the Docker game and, obviously, no one of them is g ...

  6. 基于 Swarm 的 Docker 集群管理

    文章目录 基于 Swarm 的 Docker 集群管理 一.Swarm简介 1.Swarm 模式简介 2.Swarm 特性 3.Swarm 主要概念 (1)开始使用Swarm模式 (2)安装环境要求 ...

  7. Docker集群管理(DockerHub Harbor 打包-Jib 任务编排工具- docker-compose和Swarm)

    Docker 集群管理 Docker 集群管理 镜像仓库管理 DockerHUb仓库管理 什么是DockerHUb 账号注册和登陆 Docker客户端登录 管理镜像 推送镜像 仓库镜像测试 regis ...

  8. Docker集群管理之Kubernetes

    一.概念简介 Kubernetes是Google开源的容器集群管理系统.它构建Ddocker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于容器技术的 ...

  9. docker集群管理之swarm mode

    序言 当有多台物理机的时候,就要考虑使用集群的模式了,那么docker如何来使用集群来进行管理呢?在这里主要使用的是docker自带的swarm mode,也就是docker集群的管理和编排.所谓的编 ...

  10. Docker集群管理之Docker Machine

    http://www.csdn.net/article/2015-08-11/2825438 摘要:做为Docker容器集群管理三剑客之一的Docker Machine 大大简化了Docker主机部署 ...

最新文章

  1. openssl不是内部或外部命令_OpenSSL新架构蓝图
  2. session过期后登陆页面跳出iframe页面问题
  3. 电脑显示无法连接sql服务器,他人的电脑为什么无法连接我电脑上的sql sever服务器...
  4. 富文本编辑器 CKeditor
  5. HGAT-用于半监督短文本分类的异构图注意力网络
  6. Android 学习
  7. AnyLogic建模笔记
  8. RestTemplate源码解读
  9. 利用RTFtemplate生成rtf报表
  10. CSS盒子模型居中方法,附超全教程文档
  11. html - <thead>标签
  12. 【转】如何使用visual studio将你的程序打包成安装包
  13. TESS NG微观交通仿真软件二次开发接口如何规划
  14. 新版华为P30,这5个新功能C位出道,3988值得拥有
  15. 【Excel VBA】神操作之命名单元格或区域(一)——为单元格或区域命名
  16. 用毛毛狗的耳朵擦眼泪
  17. 解决 邮件推送ImportError: No module named aliyunsdkdm.request.v20151123.SingleSendMailRequest
  18. 用python画图需要什么插件_PIL(Python Imaging Library)-用Python画图
  19. C语言小游戏第二弹~1-100猜数字(无聊时候摸鱼必备)
  20. 数据猿专访农信互联魏春:如何在养猪场实现“普惠金融”?

热门文章

  1. 2021-09-03101. 对称二叉树
  2. 589. N叉树的前序遍历
  3. Adam自适应矩估计
  4. 删除单链表中指针q指向的结点
  5. 内联函数与宏定义的区别
  6. JavaWeb:tomcat知识以及遇到的一些小问题
  7. android studio | openGL es 3.0增强现实(AR)开发 (5) GLSurfaceView浅解
  8. HDU 2144(最长公共子序列+并查集)
  9. iotop监视磁盘I/O
  10. Raki的读paper小记:NATURAL LANGUAGE INFERENCE OVER INTERACTION SPACE