相關理論請參考:https://www.cnblogs.com/Bourbon-tian/p/7155054.html,本文基於https://www.cnblogs.com/Bourbon-tian/p/7151840.html(文章是2017年寫的)進行了實踐,針對新版mesos部署會出現的問題提供瞭解決方案。
宿主作業系統:Win10
虛擬機器:VirtualBox-6.1.10-138449-Win.exe
系統映象:CentOS-7.5-x86_64-DVD-1804.iso
網路環境:橋接
機器資訊:
master1 172.16.40.186
master2 172.16.40.187
master3 172.16.40.188
slave1 172.16.40.189
slave2 172.16.40.190
slave3 172.16.40.191
這裡部屬的機器為3個Master控制節點,3個slave執行節點,其中:
zookeeper、Mesos-master、marathon執行在Master端;Mesos-slave和docker執行在Slave端;需要修改zk的內容來保證slave能夠被發現和管理
構建環境
首先搭建虛擬機器作業系統環境,安裝增強功能,讓windows和linux間的複製貼上好用。VirtualBox 安裝Centos7的方法請自行搜尋。
安裝增強功能時出現kernel headers not found for target kernel解決辦法
#update kernel yum update kernel -y #Install the kernel-headers, kernel-devel and other required packages yum install kernel-headers kernel-devel gcc make -y #Reboot the server to make sure it load to the new kernel init 6
切換阿里yum映象源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache
後續操作使用yum線上更新mesos時會很慢,沒有國內映象可用,建議先用阿里雲映象下載,後來速度無法忍受時,再用梯子(臨時配個代理,例如:export http_proxy="http://[ip]:[埠]",大家自行解決)。
下好包後再清除環境變數,在命令列輸入: unset http_proxy
配置mesos-master(3臺master節點都要操作)
# 關閉selinux [root@master-1 ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config [root@master-1 ~]# setenforce 0 # 關閉防火牆 [root@master-1 ~]# systemctl stop firewalld.servic [root@master-1 ~]# systemctl disable firewalld.service # 新增mesos的yum源 [root@master-1 ~]# rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-2.noarch.rpm # 安裝mesos、marathon、zookeeper #安裝依賴的JDK環境 [root@master-1 ~]# yum install -y java-1.8.0-openjdk-devel java-1.8.0-openjdk
#mesos相關的包大概180MB(有些沒有國內源) [root@master-1 ~]# yum -y install mesos marathon mesosphere-zookeeper # 配置zookeeper # 設定檔案/var/lib/zookeeper/myid為當前mesos-master節點的id,id必須為1-255中的整數 # master-1機器id為"1" [root@master-1 ~]# echo 1 > /var/lib/zookeeper/myid # master-2機器id為"2" [root@master-2 ~]# echo 2 > /var/lib/zookeeper/myid # master-3機器id為"3" [root@master-3 ~]# echo 3 > /var/lib/zookeeper/myid # 修改zookeeper配置檔案 [root@master-1 ~]# cp /etc/zookeeper/conf/zoo.cfg /etc/zookeeper/conf/zoo.cfg.bak [root@master-1 ~]# vim /etc/zookeeper/conf/zoo.cfg # 單個客戶端與單臺伺服器之間的連線數的限制,是ip級別的,預設是50,如果設定為0,那麼表明不作任何限制。請注意這個限制的使用範圍,僅僅是單臺客戶端機器與單臺ZK伺服器之間的連線數限制,不是針對指定客戶端IP,也不是ZK叢集的連線數限制,也不是單臺ZK對所有客戶端的連線數限制。 maxClientCnxns=50 # Zookeeper 伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會傳送一個心跳 tickTime=2000 # Zookeeper的Leader 接受客戶端(Follower)初始化連線時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是tickTime)長度後 Zookeeper 伺服器還沒有收到客戶端的返回資訊,那麼表明這個客戶端連線失敗。總的時間長度就是 5*2000=10 秒 initLimit=10 # 表示 Leader 與 Follower 之間傳送訊息時請求和應答時間長度,最長不能超過多少個tickTime 的時間長度,總的時間長度就是 2*2000=4 秒 syncLimit=5 # zookeeper資料檔案存放目錄 dataDir=/var/lib/zookeeper # 客戶端連線埠 clientPort=2181 # 數字1,2,3表示這個是第幾號伺服器(是上面myid檔案裡對應的數字);中間的是master主節點的ip地址 # 第一個埠2888(這個埠可以自己定義)表示的是這個伺服器與叢集中的 Leader 伺服器交換資訊的埠 # 第二個埠3888表示的是萬一叢集中的 Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。 server.1= 172.16.40.186:2888:3888 server.2= 172.16.40.187:2888:3888 server.3= 172.16.40.188:2888:3888 [root@master-1 ~]# vim /etc/mesos/zk zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/mesos # 設定檔案/etc/master-/quorum內容為一個大於(master節點數除以2)的整數。即採用四捨五入,比如這裡有3個master節點,那麼3/2=1.5,四捨五入為2 [root@master-1 ~]# echo 2 >/etc/mesos-master/quorum [root@master-1 ~]# cat /etc/mesos-master/quorum 2 # 配置mesos和marathon # 主機名和ip要在hosts中寫入,最好不要使用localhost,否則會出現slave不能識別,以及marathon任務下發不正常等現象。 # master-1機器 [root@master-1 ~]# mkdir -p /etc/marathon/conf [root@master-1 ~]# echo 172.16.40.186 > /etc/mesos-master/hostname [root@master-1 ~]# echo 172.16.40.186 > /etc/marathon/conf/hostname [root@master-1 ~]# hostnamectl --static set-hostname master-1.com [root@master-1 ~]# echo "172.16.40.186 master-1 master-1.com" >/etc/hosts [root@master-1 ~]# cat /etc/hosts 172.16.40.186 master-1 master-1.com # master-2機器 [root@master-2 ~]# mkdir -p /etc/marathon/conf [root@master-2 ~]# echo 172.16.40.187 > /etc/mesos-master/hostname [root@master-2 ~]# echo 172.16.40.187 > /etc/marathon/conf/hostname [root@master-2 ~]# hostnamectl --static set-hostname master-2.com [root@master-2 ~]# echo "172.16.40.187 master-2 master-2.com" >/etc/hosts [root@master-2 ~]# cat /etc/hosts 172.16.40.187 master-2 master-2.com # master-3機器 [root@master-3 ~]# mkdir -p /etc/marathon/conf [root@master-3 ~]# echo 172.16.40.188 > /etc/mesos-master/hostname [root@master-3 ~]# echo 172.16.40.188 > /etc/marathon/conf/hostname [root@master-3 ~]# hostnamectl --static set-hostname master-3.com [root@master-3 ~]# echo "172.16.40.188 master-3 master-3.com" >/etc/hosts [root@master-3 ~]# cat /etc/hosts 172.16.40.188 master-3 master-3.com [root@master-1 ~]# cp /etc/mesos/zk /etc/marathon/conf/master [root@master-1 ~]# cp /etc/mesos/zk /etc/marathon/conf/zk [root@master-1 ~]# sed -i 's|mesos|marathon|g' /etc/marathon/conf/zk #根據 https://www.cnblogs.com/zhangmingcheng/p/8795235.html 的說明marathon1.5以上不支援上面那麼配置了,要用新的方式: "/etc/marathon/conf " marathon1.5以後不支援了 發現是master配置找不到,嘗試著給marathon填加mesos的地址引數,在檔案/etc/default/marathon中增加如下內容: MARATHON_MASTER="zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/mesos" MARATHON_ZK="zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/marathon" # 啟動mesos,marathon,zookeeper [root@master-1 ~]# systemctl enable zookeeper && systemctl enable mesos-master && systemctl enable marathon [root@master-1 ~]# systemctl start zookeeper && systemctl start mesos-master && systemctl start marathon [root@master-1 ~]# systemctl disable mesos-slave # 檢視程式狀態 [root@master-1 ~]# systemctl status zookeeper [root@master-1 ~]# systemctl status mesos-master [root@master-1 ~]# systemctl status marathon [root@master-1 ~]# lsof -i:2181 [root@master-1 ~]# lsof -i:5050 [root@master-1 ~]# lsof -i:8080 # 檢查配置 #配置過程中出錯,為了方便檢查對比各master配置,直接執行如下命令。 [root@master-1 ~]# cat /var/lib/zookeeper/myid && grep -v "^#" /etc/zookeeper/conf/zoo.cfg && cat /etc/mesos/zk && cat /etc/mesos-master/quorum && cat /etc/mesos-master/hostname&& cat /etc/marathon/conf/hostname&& cat /etc/marathon/conf/master&&cat /etc/marathon/conf/zk 1 maxClientCnxns=50 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/var/lib/zookeeper clientPort=2181 server.1= 172.16.40.186:2888:3888 server.2= 172.16.40.187:2888:3888 server.3= 172.16.40.188:2888:3888 zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/mesos 2 192.168.93.133 192.168.93.133 zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/mesos zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/marathon # 以上操作後,master節點機不能ping通外網,是因為DNS解析檔案被改變了,執行下面命令即可: [root@master-1 local]# echo "nameserver 114.114.114.114" >> /etc/resolv.conf [root@master-1 ~]# ping www.baidu.com PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data. 64 bytes from 180.97.33.108 (180.97.33.108): icmp_seq=1 ttl=128 time=13.1 ms ...
配置slave節點(3臺slave節點都要操作)
# 關閉selinux [root@slave-1 ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config [root@slave-1 ~]# setenforce 0 # 關閉防火牆 [root@slave-1 ~]# systemctl stop firewalld.servic [root@slave-1 ~]# systemctl disable firewalld.service # 安裝並啟動docker [root@slave-1 ~]# yum install -y docker [root@slave-1 ~]# systemctl enable docker [root@slave-1 ~]# systemctl start docker #解決docker pull映象報錯或者超時的方案,將拉取地址改為國內映象倉庫 #解決方法修改 /etc/docker/daemon.json 檔案並新增上 registry-mirrors 鍵值。然後重啟docker就可以了(我配完了還是慢,原因不明) { "registry-mirrors":["https://cr.console.aliyun.com"] } #重啟docker [root@slave-1 ~]# systemctl daemon-reload [root@slave-1 ~]# systemctl restart docker # 拉取映象(三臺slave節點機都需要下載映象,因為在marathon介面裡建立docker容器,是隨機在slave節點機上讀取映象建立的) [root@slave-1 ~]# docker pull nginx [root@slave-1 ~]# docker pull tomcat [root@slave-1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx latest 2f7f7bce8929 6 days ago 107.5 MB docker.io/tomcat latest a2fbbcebd67e 11 days ago 333.9 MB # 新增mesos的yum源 [root@slave-1 ~]# rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-2.noarch.rpm # 安裝mesos(先正常用阿里映象下,再用梯子,完事再調回來) [root@slave-1 ~]# yum -y install mesos # 配置master資訊 # slave-1機器 [root@slave-1 ~]# echo 172.16.40.189 > /etc/mesos-slave/hostname [root@slave-1 ~]# hostnamectl --static set-hostname slave-1.com [root@slave-1 ~]# echo "172.16.40.189 slave-1 slave-1.com" >/etc/hosts [root@slave-1 ~]# cat /etc/hosts 172.16.40.189 slave-1 slave-1.com # slave-2機器 [root@slave-2 ~]# echo 172.16.40.190 > /etc/mesos-slave/hostname [root@slave-2 ~]# hostnamectl --static set-hostname slave-2.com [root@slave-2 ~]# echo "172.16.40.190 slave-2 slave-1.com" >/etc/hosts [root@slave-2 ~]# cat /etc/hosts 172.16.40.190 slave-2 slave-2.com # slave-3機器 [root@slave-3 ~]# echo 172.16.40.191 > /etc/mesos-slave/hostname [root@slave-3 ~]# hostnamectl --static set-hostname slave-3.com [root@slave-3 ~]# echo "172.16.40.191 slave-3 slave-1.com" >/etc/hosts [root@slave-3 ~]# cat /etc/hosts 172.16.40.191 slave-3 slave-3.com #把這個zk改了 [root@slave-1 ~]# cat /etc/mesos/zk zk://172.16.40.186:2181,172.16.40.187:2181,172.16.40.188:2181/mesos # 配置marathon呼叫mesos執行docker容器 [root@slave-1 ~]# echo 'docker,mesos' > /etc/mesos-slave/containerizers #啟動slave(要保證mesos-slave啟動後,讀取的zk資訊是那三個mesos-master的連線資訊,否則mesos訪問頁面裡就不會出現這個slave節點資訊。ps -ef|grep mesos-slave,如果沒有讀取到zk資訊,可以嘗試重啟伺服器再檢視) [root@slave-1 ~]# systemctl start mesos-slave && systemctl enable mesos-slave [root@slave-1 ~]# systemctl disable mesos-master # 以上操作後,slave節點機不能ping通外網,是因為DNS解析檔案被改變了,執行下面命令即可: [root@slave-1 ~]#echo "nameserver 114.114.114.114" >> /etc/resolv.conf [root@slave-1 ~]# ping www.baidu.com PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data. 64 bytes from 14.215.177.38: icmp_seq=1 ttl=53 time=38.3 ms ....... # 如果mesos-slave啟動失敗,可以如下檢查: [root@slave-1 ~]# journalctl -f -u mesos-slave