參考文檔:
- mesos:http://mesos.apache.org/
- mesosphere社區版:https://github.com/mesosphere/open-docs
- mesosphere倉庫:https://github.com/mesosphere/open-docs/blob/master/downloads/mesos.md
- docker-ce安裝:https://docs.docker.com/engine/installation/linux/docker-ce/centos/
- 原理&安裝參考1:http://www.cnblogs.com/kevingrace/p/5685313.html
- 原理&安裝參考2:http://www.xuliangwei.com/xubusi/422.html
本文主要涉及基於zookeeper+mesos+marathon的docker集群管理平台的配置操作,原理可見上面參考文檔。
一.環境
1. 拓撲
2. 拓撲說明
主機名 |
IP |
OS |
安裝服務 |
master-node1 |
10.11.4.156 |
CentOS-7-x86_64-1511 |
zookeeper, mesos-master, marathon |
master-node2 |
10.11.4.157 |
CentOS-7-x86_64-1511 |
zookeeper, mesos-master, marathon |
master-node3 |
10.11.4.158 |
CentOS-7-x86_64-1511 |
zookeeper, mesos-master, marathon |
slave-node1 |
10.11.4.146 |
CentOS-7-x86_64-1511 |
mesos-slave, docker |
slave-node2 |
10.11.4.147 |
CentOS-7-x86_64-1511 |
mesos-slave, docker |
slave-node3 |
10.11.4.148 |
CentOS-7-x86_64-1511 |
mesos-slave, docker |
3. 軟件版本
服務 |
版本 |
作用 |
zookeeper |
3.4.10 |
保持各master之間的通信,選舉leader |
mesos-master |
1.3.0 |
管理接入mesos的各個framework & slave,並將slave上的資源按照相應策略分配給framework |
mesos-slave |
1.3.0 |
任務執行節點 |
marathon |
1.4.7 |
調度器,用於下發任務,可保持長應用 |
docker |
17.06.1.ce |
具體執行docker下發任務 |
二.環境Master節點
以master-node1為例,master-node2/node3配置根據環境微調。
1. zookeeper安裝
請參考:http://www.cnblogs.com/netonline/p/7695034.html
ps:zookeeper需要java支持,這里安裝的是jdk-8u131-linux-x64。
2. mesos-master&marathon安裝配置
1)安裝mesos-master&marathon
# 添加mesosphere repository,根據github mesosphere社區版獲取最新repository [root@master-node1 ~]# cd /usr/local/src/ [root@master-node1 src]# wget http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm [root@master-node1 src]# rpm -ivh mesosphere-el-repo-7-3.noarch.rpm [root@master-node1 src]# yum install mesos marathon -y
2)mesos-master&marathon關聯zookeeper
[root@master-node1 src]# cd ~ #mesos-master選主; #完全替換默認配置 [root@master-node1 ~]# vim /etc/mesos/zk zk://10.11.4.156:2181,10.11.4.157:2181,10.11.4.158:2181/mesos #marathon選主; #默認marathon無相關配置目錄/文件 [root@master-node1 ~]# mkdir -p /etc/marathon/conf/ [root@master-node1 ~]# vim /etc/marathon/conf/zk zk://10.11.4.156:2181,10.11.4.157:2181,10.11.4.158:2181/marathon
3)marathon連接mesos-master
#默認marathon無相關配置master文件 [root@master-node1 ~]# vim /etc/marathon/conf/master zk://10.11.4.156:2181,10.11.4.157:2181,10.11.4.158:2181/mesos
4)mesos-master配置quorum&work_dir
#quorum設置為整數,且大於master節點數的1/2 [root@master-node1 ~]# echo "2" > /etc/mesos-master/quorum #work_dir也在/etc/mesos-master/目錄下,保持默認值即可 [root@master-node1 ~]# cat /etc/mesos-master/work_dir /var/lib/mesos
5)mesos-master&marathon配置ip&hostname
#hostname直接配置的本機ip,是為了防止出現dns無法解析的問題; #其余兩個節點也配置本機地址即可 [root@master-node1 ~]# echo "10.11.4.156" > /etc/mesos-master/ip [root@master-node1 ~]# echo "10.11.4.156" > /etc/mesos-master/hostname #marathon配置hostname; #其余兩個節點也配置本機地址即可 [root@master-node1 ~]# echo "10.11.4.156" > /etc/marathon/conf/hostname #修改hosts [root@master-node1 ~]# echo "10.11.4.156 master-node1" >> /etc/hosts
6)開機啟動
[root@master-node1 ~]# systemctl enable mesos-master marathon [root@master-node1 ~]# systemctl disable mesos-slave [root@master-node1 ~]# systemctl start mesos-master marathon
3. 設置iptables
# tcp2181,2888,3888與zookeeper相關; # tcp5050是mesos-master的訪問端口;tcp5051是mesos-slave的訪問端口; # tcp8080是marathon的訪問端口。 [root@master-node1 ~]# vim /etc/sysconfig/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 2888 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 3888 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 5050 -j ACCEPT #-A INPUT -p tcp -m state --state NEW -m tcp --dport 5051 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT [root@master-node1 ~]# service iptables restart
三.Slave節點
以slave-node1為例,slave-node2/node3配置根據環境微調。
1. docker安裝配置
[root@slave-node1 ~]# yum remove docker docker-common docker-selinux docker-engine #鏡像驅動使用device-mapper [root@slave-node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 #添加repository [root@slave-node1 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo [root@slave-node1 ~]# yum makecache fast [root@slave-node1 ~]# yum install docker-ce -y #配置mirror [root@slave-node1 ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://xxxxxxxx.m.daocloud.io #安裝brctl,方便查看bridge [root@slave-node1 ~]# yum install bridge-utils-1.5-9.el7.x86_64 -y #開機啟動 [root@slave-node1 ~]# systemctl enable docker [root@slave-node1 ~]# systemctl start docker
2. mesos-slave安裝配置
1)安裝mesos-slave
[root@slave-node1 ~]# cd /usr/local/src/ [root@slave-node1 src]# wget http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm [root@slave-node1 src]# rpm -ivh mesosphere-el-repo-7-3.noarch.rpm [root@slave-node1 src]# yum install mesos -y
2)mesos-slave關聯zookeeper
[root@slave-node1 src]# cd ~ #完全替換默認配置 [root@slave-node1 ~]# vim /etc/mesos/zk zk://10.11.4.156:2181,10.11.4.157:2181,10.11.4.158:2181/mesos
3)配置marathon調用mesos運行docker
[root@slave-node1 src]# cd ~ [root@slave-node1 ~]# echo "docker,mesos" > /etc/mesos-slave/containerizers
4)mesos-slave配置ip&hostname
#其余兩個節點也配置本機地址即可 [root@slave-node1 ~]# echo "10.11.4.146" > /etc/mesos-slave/ip [root@slave-node1 ~]# echo "10.11.4.146" > /etc/mesos-slave/hostname #修改hosts [root@master-node1 ~]# echo "10.11.4.146 slave-node1" >> /etc/hosts
5)開機啟動
[root@slave-node1 ~]# systemctl enable mesos-slave [root@slave-node1 ~]# systemctl disable mesos-master [root@slave-node1 ~]# systemctl start mesos-slave
3. 設置iptables
# tcp5051是mesos-slave的訪問端口。 [root@slave-node1 ~]# vim /etc/sysconfig/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5051 -j ACCEPT [root@slave-node1 ~]# service iptables restart # iptabes重啟后重新加載配置文件中的配置,默認配置中沒有docker0網橋的nat表規則; #重啟docker將相關規則加載到iptables中,再保存規則到配置文件中; #如果iptables中沒有docker0網橋的nat表規則,在創建帶有端口映射的容器時,會報錯:"ExitCode": 128,iptables相關規則不能創建 [root@slave-node1 ~]# systemctl restart docker [root@slave-node1 ~]# service iptables save
四.驗證
1. mesos
登陸mesos web:http://10.11.4.156:5050
#登陸10.11.4.157/158都可以,通過zookeeper選主,登陸任一地址都會跳轉到leader頁面。
1)mesos-homepage
-
(1). 從首頁可以看到mesos-master的leader是:10.11.4.157;
-
(2). mesos-agent:activated狀態的agent有3個;
-
(3). mesos-master管理的3個agent的資源已匯總。
2)mesos-Frameworks
-
(1). 在mesos框架中,marathon框架已經被識別,marathon的leader是:10.11.4.157;
-
(2). 雖然mesos-master與marathon的leader相同,但兩者的leader是zookeeper獨立選舉的,並沒有直接關系,是可以不同的。
3)mesos-Agents
-
(1). 在Agnets中能看到3個agent;
-
(2). 同時能看到每個agent的資源;
-
(3). 點擊任一agent id,能看到更詳細的agent信息。
4)mesos state
瀏覽器訪問:http://10.11.4.158:5050/master/state
2. marathon
登陸marathon web:http://10.11.4.156:8080
#或者點擊mesos-frameworks頁面中,已經選舉出的marathon leader;
#登陸10.11.4.157/158都可以,通過zookeeper選主,登陸任一地址都會跳轉到leader頁面。
1)marathon-homepage
-
(1). 在首頁中點擊右上角問號,選擇"About";
-
(2). marathon-leader:10.11.4.157:8080;
-
(3). marathon連接到mesos leader:10.11.4.157:5050。
3. marathon下發應用
1)API方式
#marathon是有api接口的,通過api的方式可調用marathon執行相關應用調度的請求 #在marathon服務所在節點創建json文件; #以下json文件中的注釋需去掉。 [root@master-node1 ~]# vim nginx.json { "id":"nginx1", #容器名,只在marathon生效 "cpus":0.2, #cpu用量 "mem":20.0, #mem用量 "instances": 1, #容器數量 "constraints": [["hostname", "UNIQUE",""]], #限制 "container": { "type":"DOCKER", #應用類型 "docker": { #docker具體配置 "image": "nginx", #采用的image "network": "BRIDGE", #網絡模式 "portMappings": [ {"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" } ] #端口映射,”0”表示任意端口,"servicePort"服務端口 } } } #調用json文件 [root@master-node1 ~]# curl -X POST http://10.11.4.156:8080/v2/apps -d @/root/nginx.json -H "Content-type: application/json"
-
(1). 登陸marathon,查看應用已下發成功,處於"Running"狀態;容器的資源配置遵從json文件中的設置;針對應用,點擊最右側的"…"按鈕,可進行相關操作;
-
(2). 點擊應用名或狀態,查看應用具體信息,可查到此應用下發到slave節點:10.11.4.147,且映射主機的31896端口;同時可查看"stderr"與"stdout"日志等(也可到mesos任務的"Sandbox"中查看下載);
- (3). Configuration標簽下,列出了生成的容器的相關配置,除json文件預設置的參數外,還有json文件中定義的"任意值"也有了明確的配置;同時可以"Edit";
-
(4). 在slave節點:10.11.4.147下查看容器;
[root@slave-node2 ~]# docker ps
- (5). web訪問:http://10.11.4.147:31896
- (6). 登陸mesos,"Active Tasks"有處於運行狀態的任務。
2)通過marathon web頁面手工創建
-
(1). 點擊marathon首頁右上角的"Create Application",選擇"JSON Mode",粘帖相關json配置,實質上這也是在調用marathon的api接口,只是入口變為web頁面;
- (2). 取消"JSON Mode",可以看到粘帖的json配置已經被記錄下來;也可以直接在非"JSON Mode"填寫相關配置。