Centos7.x-安装mesos-zookeeper-marathon-docker实战

系统环境

查看系统版本:cat /etc/redhat-release

查看系统内核:uname -a

查看机器IP地址:ifconfig,如果没有yum install net-tools

关闭Selinux:vi /etc/selinux/config 修改SELINUX=disabled

关闭防火墙:systemctl stop firewalld.service

reboot机器

必要时:更新一下源,yum update,然后继续下面操作

安装jdk

JDK1.8以上

Oracle下载tar.gz,解压后,配置/etc/profile,

1
2
export JAVA_HOME=xxx
export PATH=$JAVA_HOME/bin:$PATH

最后source /etc/profile.

安装Mesosphere 源

  • rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm
  • rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-mesosphere
  • yum install mesos marathon mesosphere-zookeeper -y 可以选择安装其中部分

ZK配置

  • 先给每台机器zookeeper打标签:

    echo 1 | tee /etc/zookeeper/conf/myid 注意:myid中的每台机器不同,对应下面配置文件中的server.$NUM

  • 在/etc/zookeeper/conf/zoo.cfg配置文件中追加以下容:

    1
    2
    3
    server.1=172.18.2.94:2888:3888
    server.2=172.18.2.95:2888:3888
    server.3=172.18.2.96:2888:3888

    ​解释下这个后边的$IP,$PORT1,$PORT2

    ​IP不解释

    ​$PORT1 因为三台为高可用,肯定有个master,这个端口是master起的;

    ​$PORT2 为他们互相检查、看谁当master检查用的。

  • 然后就可以重启zookeeper服务了(端口为2181)

    systemctl start zookeeper

  • 每一台都查看进程

    ps -ef | grep zookeeper

Mesos 配置

  • 修改/etc/mesos/zk,添加上面配置的zk地址

    1
    zk://172.18.2.94:2181,172.18.2.95:2181,172.18.2.96:2181/mesos
  • 修改Quorum,Mesos选主使用,大于Mesos主机/2,如果3台Mesos主机,应配置2

    echo 2 | tee /etc/mesos-master/quorum

  • hostname 和 ip,hostname和ip可以都用ip,也可以在hosts中配置主机名,然后hostname写主机名。

    echo ip地址 | tee /etc/mesos-master/hostname

    echo ip地址 | tee /etc/mesos-master/ip

    同样slave也需要做相同处理。

  • 启动

    • systemctl start mesos-master 启动master
    • systemctl stop mesos-slave systemctl disable mesos-slave 停止slave并禁用开机启动
    • 根据情况,如果master和slave在同一台机器就不用禁用了,感觉像是废话
    • systemctl start mesos-slave
    • 查看进程
      • ps -ef | grep mesos
      • 是否master或者slave启动,并启动参数中有hostname、ip地址、zk地址等信息。

Marathon配置

  • 常见marathon配置目录((yum装的没给我们创建)

    mkdir -p /etc/marathon/conf

  • hostname(marathon不需要ip,不用管ip,不要复制)

    cp/etc/mesos-master/hostname /etc/marathon/conf

  • zk地址

    1
    2
    3
    4
    cp /etc/mesos/zk /etc/marathon/conf/master
    cp /etc/marathon/conf/master /etc/marathon/conf/zk
    vi /etc/marathon/conf/zk
    #内容:zk://172.18.2.94:2181,172.18.2.95:2181,172.18.2.96:2181/marathon
  • systemctl restart marathon

安装docker

  • yum install docker

  • 检查安装是否成功 docker version

  • 启动systemctl start docker

  • 如果想在marathon上运行Docker,则需要一些额外的配置

    1
    2
    3
    4
    5
    6
    #指定使用docker容器化
    echo 'docker,mesos' | tee /etc/mesos-slave/containerizers
    #考虑到拉取容器镜像等的操作,适当增加timeout的时间
    echo '5mins' | tee /etc/mesos-slave/executor_registration_timeout
    #重启mesos-slave以使上面配置生效
    systemctl restart mesos-slave

其他注意

  • 排查问题日志/var/log/message,启动访问都会有记录
  • mesos访问地址:172.18.2.94:5050
  • marathon访问地址:172.18.2.94:8080
  • 几个配置启动参数的目录:
    /etc/mesos-master/
    /etc/mesos-slave/
    /etc/marathon/conf/
    在这些目录分别用来配置mesos-master,mesos-slave,marathon的启动参数。以参数名为文件名,参数值为文件内容即可。

使用

然后,到mesos管理端,去查看slave的注册情况


Starting Services on Mesos and Marathon

这里不做复杂的演示,只做简单的。

WEB UI

ip:5050

Starting a Service through the API

首先准备一个json文件(hello2.json)

1
2
3
4
5
6
7
8
9
{
"id": "hello2",
"cmd": "echo hello; sleep 10",
"mem": 32,
"cpus": 0.1,
"instances": 1,
"disk": 0.0,
"ports": [0]
}

然后调用api

curl -i -H 'Content-Type: application/json' [email protected] master1:8080/v2/apps

执行Docker任务

  • 测试通过Marathon执行Docker任务

    启动Docker,抓取ubuntu镜像,date命令输出当前时间

    任务Deploying的时候,从docker.io抓取镜像,抓取下来后,开始Running。

    如果抓取镜像的时间过长,失败的时候,可以先用docker pull命令在节点上抓取镜像后,再执行任务。

  • 创建json文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # vi marathon-test.json
    {
    "container": {
    "type": "DOCKER",
    "docker": {
    "image": "libmesos/ubuntu"
    }
    },
    "id": "ubuntu-marathon",
    "instances": 2,
    "cpus": 0.5,
    "mem": 256,
    "uris": [],
    "cmd": "while sleep 10; do date -u +%T; done"
    }
  • 在Marathon上创建任务

    curl -X POST -H "Content-Type: application/json" http://test166:8080/v2/apps [email protected]

  • 在Marathon页面确认容器已经启动

  • 在Mesos页面确认任务正在执行中

  • 从stdout信息确认输出的时间

  • 在节点上确认容器已经启动docker ps

  • 查看容器的日志,确认输出的时间docker logs CONTAINER_ID

  • 测试通过Chronos执行Docker任务

    启动Docker,抓取nginx镜像,启动nginx容器

  • 创建json文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # vi chronos-test.json
    {
    "container": {
    "type": "DOCKER",
    "image": "nginx"
    "network": "BRIDGE"
    },
    "schedule": "R\/2015-12-20T07:30:00Z\/PT2M",
    "name": "chronos-nginx",
    "cpus": "0.5",
    "mem": "256",
    "uris": [],
    "command": "/usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf"
    }

    network”: “BRIDGE”,因为Docker默认的网络模式是桥接,不指定默认也是BRIDGE

  • 在Chronos上,创建任务

    curl -L -H "Content-Type: application/json" -X POST [email protected] http://test166:4400/scheduler/iso8601

  • 在Chronos页面确认任务已做成

    本次是测试,所以在Chronos的任务页面,点击「Force Run」强制执行

  • 在Mesos页面确认任务的详细信息

  • 在节点上确认容器启动docker ps

  • 确认nginx网页可以访问

  • 在docker中启用Container

Marathon作为一个还没有到1.0版本的项目来说,启动一个container还是最好用API来实现吧。要把一个Json post到http://10.239.21.100:5050/v2/apps 。我习惯上用Chrome的postman插件实现。

以下是我启动一个nginx的例子:

请注意,这是一个标准的RESTful API,一定要加上”Content-type: application/json”的Http header!

marathon-api-call

几个重要的filed解释:

  • id:其实是task name,字母开头,支持字母数字和‘-’。
  • docke.image:docker的镜像,默认会从dockerhub上去下载。
  • portMappings:对应的是一个container到主机port的mapping。但和传统的docker -p参数不太一样——只能制定开放哪几个端口的对外访问,但不能指定映射到local的什么端口。不过好在从API文档上来看,这只是现阶段没有完成而已,相信之后会完善的。

回到marathon主界面,如果看到对应的task已经启动,点击task名称,进入task描述。

你会看到下面的那个灰色的mesos-slaver-01:31345,点击它就会看到mapping之后的nginx首页。

后记

Mesos, Marathon 使得 Docker集群的管理变得简单方便,为在生产环境部署使用Docker集群提供了可能

参考

http://www.cnblogs.com/ee900222/p/docker_2.html

http://blog.csdn.net/felix_yujing/article/details/51813224

https://mesosphere.github.io/marathon/docs/native-docker.html

http://www.centoscn.com/image-text/install/2015/0614/5656.html

http://blog.csdn.net/felix_yujing/article/details/51813224

坚持技术分享,您的支持将鼓励我继续创作!