docker 必备 — marathon 基础教程

筋斗云 岂安运维工程师

爱游泳、爱旅行、爱计算机。

前言

目前越来越多的互联网企业开始使用 docker,在这之前,虚拟机占据着大部分的企业市场,但是随着 docker 部署的增多,也发现了一些单纯使用 docker 的弊端。例如命令行操作比较繁琐,需要记的参数较多,在此介绍一个好用的解决这些弊端的工具—— Marathon。

基本概念

Mesos:Mesos 采用与 Linux Kernel 相同的机制,只是运行在不同的抽象层次上。Mesos Kernel 利用资源管理和调度的 API 在整个数据中心或云环境中运行和提供引用(例如, Hadoop、 Spark、Kafaka、Elastic Search)。

ZooKeeper:ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google的Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

Marathon:Marathon 是一个 Mesos 框架,能够支持运行长服务,比如 Web 应用等。它是集群的分布式 Init.d,能够原样运行任何 Linux 二进制发布版本,如 Tomcat、Play 等等。它也是一种私有的 PaSS,实现服务的发现,为部署提供提供 REST API 服务,有授权和 SSL、配置约束,通过 HAProxy 实现服务发现和负载平衡。

bigsec

部署

为了部署的方便 全部使用 docker 部署。

master搭建

三台 mesos master 服务器 ip地址分别是 10.100.0.21,10.100.0.22,10.100.0.23 需要在master上分别部署 mesos mater , zookeeper , marathon

需要在10.100.0.21 上执行下列命令 :

marathon

docker run -d -e MARATHON_HOSTNAME=10.100.0.21 -e MARATHON_HTTPS_ADDRESS=10.100.0.21 -e MARATHON_HTTP_ADDRESS=10.100.0.21 -e MARATHON_MASTER=zk://10.100.0.22:2181,10.100.0.23:2181,10.100.0.21:2
181/mesos -e MARATHON_ZK=zk://10.100.0.22:2181,10.100.0.23:2181,10.100.0.21:2181/marathon --name marathon --net host --restart=always mesoscloud/marathon

mesos-master

HOST_IP=10.100.0.21
 docker run -d --name mesos-master1 --net="host" -p 5050:5050    -e "MESOS_HOSTNAME=${HOST_IP}"   -e "MESOS_IP=${HOST_IP}"   -e "MESOS_ZK=zk://${HOST_IP}:2181/mesos"   -e "MESOS_PORT=5050"   -e
"MESOS_LOG_DIR=/var/log/mesos"   -e "MESOS_QUORUM=1"   -e "MESOS_REGISTRY=in_memory"   -e "MESOS_WORK_DIR=/var/lib/mesos"   mesoscloud/mesos-master

zookeeper

docker run -d -e MYID=1 -e SERVERS=10.100.0.21,10.100.0.22,10.100.0.23 --name zookeeper --restart=always --net=host  mesoscloud/zookeeper

需要在10.100.0.22 上执行下列命令

marathon

docker run -d -e MARATHON_HOSTNAME=10.100.0.22 -e MARATHON_HTTPS_ADDRESS=10.100.0.22 -e MARATHON_HTTP_ADDRESS=10.100.0.22 -e MARATHON_MASTER=zk://10.100.0.22:2181,10.100.0.23:2181,10.100.0.21:2
    181/mesos -e MARATHON_ZK=zk://10.100.0.22:2181,10.100.0.23:2181,10.100.0.21:2181/marathon --name marathon --net host --restart=always mesoscloud/marathon

mesos-master

HOST_IP=10.100.0.22
 docker run -d --name mesos-master1 --net="host" -p 5050:5050    -e "MESOS_HOSTNAME=${HOST_IP}"   -e "MESOS_IP=${HOST_IP}"   -e "MESOS_ZK=zk://${HOST_IP}:2181/mesos"   -e "MESOS_PORT=5050"   -e
"MESOS_LOG_DIR=/var/log/mesos"   -e "MESOS_QUORUM=1"   -e "MESOS_REGISTRY=in_memory"   -e "MESOS_WORK_DIR=/var/lib/mesos"   mesoscloud/mesos-master

zookeeper

 docker run -d -e MYID=2 -e SERVERS=10.100.0.21,10.100.0.22,10.100.0.23 --name zookeeper --restart=always --net=host  mesoscloud/zookeeper

需要在10.100.0.23 上执行下列命令

marathon

docker run -d -e MARATHON_HOSTNAME=10.100.0.23 -e MARATHON_HTTPS_ADDRESS=10.100.0.23 -e MARATHON_HTTP_ADDRESS=10.100.0.23 -e MARATHON_MASTER=zk://10.100.0.22:2181,10.100.0.23:2181,10.100.0.21:2
181/mesos -e MARATHON_ZK=zk://10.100.0.22:2181,10.100.0.23:2181,10.100.0.21:2181/marathon --name marathon --net host --restart=always mesoscloud/marathon

mesos-master

HOST_IP=10.100.0.23
 docker run -d --name mesos-master1 --net="host" -p 5050:5050    -e "MESOS_HOSTNAME=${HOST_IP}"   -e "MESOS_IP=${HOST_IP}"   -e "MESOS_ZK=zk://${HOST_IP}:2181/mesos"   -e "MESOS_PORT=5050"   -e
"MESOS_LOG_DIR=/var/log/mesos"   -e "MESOS_QUORUM=1"   -e "MESOS_REGISTRY=in_memory"   -e "MESOS_WORK_DIR=/var/lib/mesos"   mesoscloud/mesos-master

zookeeper

docker run -d -e MYID=3 -e SERVERS=10.100.0.21,10.100.0.22,10.100.0.23 --name zookeeper --restart=always --net=host  mesoscloud/zookeeper

这样 mesos 的 master 就搭建完成。

slave服务器搭建

下面是 mesos 的 slave 服务器 模拟4台 ip 地址是10.100.0.24 10.100.0.25 10.100.0.26 10.100.0.28

在10.100.0.24上运行下面的命令

docker run -d     --net=host     --pid=host     --privileged=true     --name=ms1     -v /usr/bin/docker:/usr/bin/docker     -v /dev:/dev     -v /var/run/docker.sock:/var/run/docker.sock     -v
/var/log/mesos:/var/log/mesos     -v /tmp/mesos:/tmp/mesos     -e MESOS_HOSTNAME=10.100.0.24     -e MESOS_IP=10.100.0.24     -e MESOS_MASTER=zk://10.100.0.21:2181,10.100.0.22:2181,10.100.0.23:2181/mes
os     -e MESOS_CONTAINERIZERS=docker,mesos     mesoscloud/mesos-slave

在10.100.0.25上运行下面的命令

docker run -d     --net=host     --pid=host     --privileged=true     --name=ms1     -v /usr/bin/docker:/usr/bin/docker     -v /dev:/dev     -v /var/run/docker.sock:/var/run/docker.sock     -v
/var/log/mesos:/var/log/mesos     -v /tmp/mesos:/tmp/mesos     -e MESOS_HOSTNAME=10.100.0.25     -e MESOS_IP=10.100.0.25     -e MESOS_MASTER=zk://10.100.0.21:2181,10.100.0.22:2181,10.100.0.23:2181/mes
os     -e MESOS_CONTAINERIZERS=docker,mesos     mesoscloud/mesos-slave

在10.100.0.26上运行下面的命令

docker run -d     --net=host     --pid=host     --privileged=true     --name=ms1     -v /usr/bin/docker:/usr/bin/docker     -v /dev:/dev     -v /var/run/docker.sock:/var/run/docker.sock     -v
/var/log/mesos:/var/log/mesos     -v /tmp/mesos:/tmp/mesos     -e MESOS_HOSTNAME=10.100.0.26     -e MESOS_IP=10.100.0.26     -e MESOS_MASTER=zk://10.100.0.21:2181,10.100.0.22:2181,10.100.0.23:2181/mes
os     -e MESOS_CONTAINERIZERS=docker,mesos     mesoscloud/mesos-slave

在10.100.0.28上运行下面的命令

docker run -d     --net=host     --pid=host     --privileged=true     --name=ms1     -v /usr/bin/docker:/usr/bin/docker     -v /dev:/dev     -v /var/run/docker.sock:/var/run/docker.sock     -v
/var/log/mesos:/var/log/mesos     -v /tmp/mesos:/tmp/mesos     -e MESOS_HOSTNAME=10.100.0.28     -e MESOS_IP=10.100.0.28     -e MESOS_MASTER=zk://10.100.0.21:2181,10.100.0.22:2181,10.100.0.23:2181/mes
os     -e MESOS_CONTAINERIZERS=docker,mesos     mesoscloud/mesos-slave

以上,搭建完成

查看

可以通过 http://${HOST_IP}:5050 查看 mesos 的服务器的状态:

bigsec

使用 http://{HOST}:8080/ 来访问 marathon:

bigsec

需要在 Docker Container 中输入对应的 images:

bigsec

还需要配置一下端口:

bigsec

docker 很快就能启动好。目前就启动了一个实例:

bigsec

如果现在需要多个,可以选择 scale Application 数值调整到5:

bigsec

可以瞬间运行多个容器:

bigsec

关于扩容

scale Application 数值调整虽然能快速扩容,但是运行服务器的端口都是随机的,如果需要手工添加就会比较麻烦,好在我们有一个新的工具来帮助我们,一个定制化的 haproxy—— marathon-lb。

我们还是使用容器的方式来部署:

docker run -d --privileged -e PORTS=9090 --net=host mesosphere/marathon-lb sse -m http://10.100.0.21:8080 -m http://10.100.0.22:8080 -m http://10.100.0.23:8080  --group external

这样我们就能通过 9090 端口访问: http://${HOST_IP}:9090/haproxy?stats

需要在配置 Environment Variables 变量的时候,添加2个变量: ➣HAPROXY0PORT=80 ➣HAPROXY_GROUP=external

不管 scale 多少个容器, 都会通过 haproxy 的80端口代理 ,水平扩容非常的方便。