使用Mesos和Marathon管理Docker集群

2021-02-23 奇妙的Linux世界


題圖:By JJ Ying From Unsplash

Mesos簡介

Apache Mesos是一個分布式系統的管理軟體,對集群的資源進行分配和管理。具體的介紹可參考 「Apache Mesos入門」一文,這裡就不再重複介紹了。

項目地址:https://github.com/mesosphere

Marathon簡介

Marathon按照官方的說法是個基於Mesos的私有PaaS,它實現了Mesos的Framework。Marathon實現了服務發現和負載平衡、為部署提供提供REST API服務、授權和SSL、配置約束等功能。

Marathon支持通過Shell命令和Docker部署應用。提供Web界面、支持cpu/mem、實例數等參數設置,支持單應用的Scale,但不支持複雜的集群定義。Marathon本身是通過Scala實現的。

Marathon能夠支持運行長服務,比如Web應用等。Marathon能夠原樣運行任何Linux二進位發布版本,如Tomcat Play等等。

理解Mesos和Marathon之間的關係,如果將Mesos類比為作業系統的內核,負責資源調度。則Marathon可以類比為服務管理系統,比如是init,systemd或upstart等系統,用來管理應用的狀態信息。Marathon將應用程式部署為長時間運行的Mesos任務。




Marathon可以讓您指定每個應用程式實例需要的資源以及要運行此程序需要多少實例。它可以使用可用的集群資源對失敗的任務自動做出響應。

如果某個Mesos Slave當機或應用的某個實例退出、失敗,Marathon將會自動啟動一個新的實例,來替換掉失敗的實例。Marathon也允許用戶在部署時指定應用程式彼此間的依賴關係,這樣就可以保證某個應用程式實例不會在它依賴的資料庫實例啟動前啟動。

Marathon特性

高可用,支持多主節點(主備模式)自動切換。

支持多種容器環境。

支持有狀態服務,如資料庫。

使用Web管理界面用於配置操作和監控系統狀態。

約束規則,比如限制任務分布在特定節點。

服務發現、負載均衡。

支持健康檢查,實現容錯。

支持事件訂閱,用於集成到其它系統。

運行指標監控接口。

完善易用的REST API。

安裝Mesos和Marathon

系統環境

主機名IP位址軟體環境dev-master-01192.168.2.210Mesos Master、Zookeeper、Marathondev-node-01192.168.2.211Mesos Slave、Docker

我們使用mesosphere提供的安裝包進行安裝。

添加軟體安裝源

# 增加證書並設備環境變量$ apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF$ DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')$ CODENAME=$(lsb_release -cs)# 增加倉庫$ echo "deb http://repos.mesosphere.com/${DISTRO} ${CODENAME} main"|sudo tee /etc/apt/sources.list.d/mesosphere.list$ apt-get -y update

$ rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm$ yum -y update

註:所有安裝的機器都需要添加。

安裝Master

這裡需要在Master上安裝Mesos、Marathon、ZooKeeper。

$ apt-get -y install mesos marathon zookeeperd

$ yum install -y mesos marathon mesosphere-zookeeper

ZooKeeper設定

本次配置的ZooKeeper是單節點。生產環境建議配置ZooKeeper集群,有關ZooKeeper集群安裝後面會分享相關文檔。

$ vim /etc/mesos/zkzk://dev-master-01:2181/mesos

註:這裡使用的是主機名,記得在各主機的hosts配置下映射關係。

$ vim /etc/hosts192.168.2.210 dev-master-01192.168.2.211 dev-node-02

手動建立management.properties文件

$ mkdir -p /usr/lib/jvm/java-9-openjdk-amd64/conf/management/ && touch /usr/lib/jvm/java-9-openjdk-amd64/conf/management/management.properties

如果不建立,ZooKeeper不能正確啟動。會報以下錯誤:

$ Error: Config file not found: /usr/lib/jvm/java-9-openjdk-amd64/conf/management/management.properties

這是一個OpenJDK的巨坑,生產環境建議用Oracle JDK。

配置JAVA環境變量(可選)

$ vim /etc/profile.d/zookeeper.shexport JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64/export JER_HOME=$JAVA_HOME/jreexport CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

啟動相關服務

$ systemctl start zookeeper$ systemctl start mesos-master$ systemctl start marathon

驗證ZooKeeper是否啟動成功

$ systemctl status zookeeper● zookeeper.service - LSB: centralized coordination service  Loaded: loaded (/etc/init.d/zookeeper; bad; vendor preset: enabled)  Active: active (running) since Tue 2017-05-02 15:16:59 CST; 4min 34s ago    Docs: man:systemd-sysv-generator(8) Process: 15309 ExecStop=/etc/init.d/zookeeper stop (code=exited, status=0/SUCCESS) Process: 15324 ExecStart=/etc/init.d/zookeeper start (code=exited, status=0/SUCCESS)   Tasks: 26  Memory: 46.0M     CPU: 12.041s  CGroup: /system.slice/zookeeper.service          └─15336 /usr/bin/java -cp /etc/zookeeper/conf:/usr/share/java/jline.jar:/usr/share/java/log4j-1.2.jar:/usr/share/java/xercesImpl.jar:/usr/share/java/xmlParserAPIs.jar:/usr/share/java/netty.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/slf4j-log4j12.jar:/uMay 02 15:16:59 dev-master-01 systemd[1]: Starting LSB: centralized coordination service...May 02 15:16:59 dev-master-01 systemd[1]: Started LSB: centralized coordination service.

訪問Mesos的Web管理界面

Mesos安裝完畢後,Mesos Master會啟動一個Web服務,默認監聽在5050埠。通過使用http://ip:5050/來訪問。如下圖所示:



在這個界面裡,我們能看到整個集群的資源分配情況和框架的狀態。 現在所有資源還是空,也沒有任何進程。

訪問Marathon的Web管理界面

Marathon默認監聽在8080埠,通過使用http://ip:8080/來訪問。如下圖所示:

安裝Slave

Mesos Master集群要真正能夠分配資源並運行任務,還需要向Master註冊Slave。Slave的所有配置都在/etc/mesos-slave目錄中。

這裡我們需要Slave上安裝Mesos、Docker。

$ apt-get install -y mesos docker

$ yum install -y mesos docker

Docker相關設定

這裡主要需要設置containerizers、executor_registration_timeout參數。設置containerizers參數是為了讓Slave支持Docker,默認是用lxc來管理容器的。executor_registration_timeout參數主要是由於Docker任務啟動的時候,需要去遠程拉取鏡像。一般首次拉取時容易超時,這裡把超時時間設得長一些,避免超時。

$ echo 'docker,mesos' > /etc/mesos-slave/containerizers$ echo '5mins' > /etc/mesos-slave/executor_registration_timeout

ZooKeeper設定

$ vim /etc/mesos/zkzk://dev-master-01:2181/mesos

註:這裡使用的是主機名,記得在各主機的hosts配置下映射關係。

$ vim /etc/hosts192.168.2.210 dev-master-01192.168.2.211 dev-node-02

啟動相關服務

$ systemctl start docker$ systemctl start mesos-slave

使用Mesos

在MASTER上執行Frameworks測試框架

$ MASTER=$(mesos-resolve `cat /etc/mesos/zk`)$ mesos-execute --master=$MASTER --name="cluster-test" --command="sleep 60"

在Frameworks頁面刷新,可以查看任務的執行情況。

查看活動的框架


查看活動的任務



點擊結束的任務頁面,可以看到在哪個Slave上執行的。



使用Marathon調用Mesos運行Docker容器

下面通過Marathon調用Mesos來創建一個Nginx鏡像的Docker容器。Marathon啟動時會讀取/etc/mesos/zk配置文件,Marathon通過Zookeeper來找到Mesos Master。

創建應用

首先準備應用定義文件, 此文件為JSON格式。定義了應用的名稱(id)、命令、資源(cpu、內存等)和實例數量等信息。

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

在Web頁面上,點擊創建Create Application按鈕。 彈出操作窗中,切換為JSON模式。



將上一步準備的JSON內容複製到輸入框內,點擊輸入框旁的創建Create Application按鈕保存配置。 此時新建應用的信息,將出現在Web頁面的應用列表。



在dev-node-01上查看通過Marathon創建的容器

$ docker psCONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                   NAMES419fd7d23736        nginx                        "nginx -g 'daemon ..."   12 minutes ago      Up 12 minutes       0.0.0.0:31182->80/tcp   mesos-66734014-5647-47e2-9264-b5775128b01d-S0.cf1d01ec-0b7d-4f3f-a407-926794686490

現在你就可以通過http://ip:31182來訪問到nginx了。

Marathon有自己的REST API,為了方便批量化管理,我們通過API的方式來創建一個簡單應用。這裡我們使用其中的POST /v2/apps來創建應用。

創建JSON文件

$ vim busybox-demo.json{  "container": {    "type": "DOCKER",    "docker": {    "image": "busybox"    }  },  "id": "busybox-demo",  "instances": 2,  "cpus": 0.5,  "mem": 128,  "uris": [],  "cmd": "while sleep 10; do date -u +%T; done"}

其中的cmd欄位包含了應用將要執行的命令,instances是進程的數量。

通過API在Marathon上創建任務

# curl -X POST -H "Content-Type: application/json" http://192.168.2.210:8080/v2/apps -d@busybox-demo.json{"id":"/busybox-demo","cmd":"while sleep 10; do date -u +%T; done","args":null,"user":null,"env":{},"instances":2,"cpus":0.5,"mem":256,"disk":0,"gpus":0,"executor":"","constraints":[],"uris":[],"fetch":[],"storeUrls":[],"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":{"type":"DOCKER","volumes":[],"docker":{"image":"busybox","network":null,"portMappings":[],"privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[],"readinessChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"ipAddress":null,"version":"2017-05-03T03:29:46.941Z","residency":null,"secrets":{},"taskKillGracePeriodSeconds":null,"unreachableStrategy":{"inactiveAfterSeconds":300,"expungeAfterSeconds":600},"killSelection":"YOUNGEST_FIRST","ports":[0],"portDefinitions":[{"port":0,"protocol":"tcp","name":"default","labels":{}}],"requirePorts":false,"tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"2f25526a-7641-4326-bd63-26eb69364838"}],"tasks":[]}

在Marathon頁面確認容器已經啟動



在Mesos頁面確認任務正在執行中



在dev-node-01節點上確認容器已經啟動

$ docker psCONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                   NAMESdb72938c7628        busybox                      "/bin/sh -c 'while..."   2 minutes ago       Up 2 minutes                                mesos-66734014-5647-47e2-9264-b5775128b01d-S0.3e6e80a8-51b7-4f23-876b-6deb08671f46cbeb91ebfeca        busybox                      "/bin/sh -c 'while..."   2 minutes ago       Up 2 minutes                                mesos-66734014-5647-47e2-9264-b5775128b01d-S0.a8cad50d-c0b8-42ef-a986-fb99b6fe4f1b

查看容器的日誌,確認輸出的時間

$ docker logs  db72938c762803:35:2803:35:3803:35:4803:35:5803:36:08

如果你想創建同樣的容器,可以點擊上圖中的Scale Application來體驗一下。同樣的,你也可以通過Marathon的Web界面來進行容器的創建、擴展和銷毀。



通過上面的部署體驗,Mesos和Marathon使得Docker集群的管理變得簡單方便,為在生產環境部署使用Docker集群提供了可能。

參考文檔

http://www.google.com
https://github.com/arangodb/dcos-mini-cluster/blob/master/Dockerfile
http://www.cnblogs.com/ee900222/p/docker_2.html
http://www.xuliangwei.com/xubusi/422.html
http://biglittleant.cn/2016/12/18/mesos-marathon-docker/

更多精彩熱文:


相關焦點

  • Docker搭建Redis的cluster集群
    ,cluster集群能支持擴容,且無須額外的節點來監控狀態,所以使用這種模式集群的系統會用得更多些。3.4 使用docker inspect redisClusterMaster1等命令查看各個節點IP和埠節點名IP位址埠redisClusterMaster1172.17.0.26379redisClusterMaster2172.17.0.36380redisClusterMaster3172.17.0.46381redisClusterSlave1172.17.0.516379redisClusterSlave2172.17.0.616380redisClusterSlave3172.17.0.7163813.5
  • 基於Docker的Redis集群實踐
    具體地,如果該庫之前是一個主庫,則此時會變為從庫;如果該庫之前是一個其他主庫的從庫,則此時會停止與原來主庫的同步,轉而和新的主庫同步slaveof <新Redis主庫IP> <新Redis從庫埠>特別地,還可通過下述命令將一個從庫變為主庫
  • 使用kubeadm快速部署一套K8S集群
    K8S用於容器化應用程式的部署,擴展和管理。K8S提供了容器編排,資源調度,彈性伸縮,部署管理,服務發現等一系列功能。Kubernetes目標是讓部署容器化應用簡單高效。1.2 Kubernetes特性自我修復彈性伸縮自動部署和回滾服務發現和負載均衡機密和配置管理存儲編排
  • 使用GitLab CI部署Rancher集群
    同時建議執行這些步驟時限制訪問權限,因為安全的最佳實踐包括使用用戶資料庫,並為這些手動步驟的執行申請權限。此圖展示了此部署中使用的所有工具及其在本次部署中提供的功能:GitLab:代碼管理和CI/CDAWS:彈性計算機雲(EC2)、簡單存儲服務(S3)、Route 53(R53)、安全組、彈性負載均衡(ELB)。
  • Kubernetes 1.19.0集群部署 (多Master)+docker——二進位方式
    創建 admin 證書和私鑰kubectl 與 apiserver https 安全埠通信,apiserver 對提供的證書進行認證和授權。kubectl 作為集群的管理工具,需要被授予最高權限,所以這裡創建具有最高權限的 admin 證書。
  • Docker 1.13 管理命令
    (https://github.com/docker/docker/issues/8756)有些命令,例如docker inspect也沒有提供足夠的上下文來說明他們是作用於鏡像還是容器。這種鏡像和容器的命令混合會帶來困惑。(https://github.com/docker/docker/issues/13509)缺乏命令名稱的一致性。
  • Windows系統(離線)中安裝和使用Docker、Docker-compose
    本文將介紹如何在Windows系統(離線)中安裝和使用Docker、Docker-compose。該項目的Github地址為:https://github.com/percent4/windowns_install_docker。
  • 使用Docker-Compose搭建高可用redis哨兵集群
    它是如何做到的,它會定期檢查Redis實例的運行狀況和運行狀況,還會將新的主伺服器通知給客戶端和從伺服器。使用的是帶有領導者選舉算法的gossip協議。Sentinel還充當客戶端發現的中心授權來源,客戶端連接到Sentinel以獲取主節點的地址。
  • Docker可視化管理工具的應用
    目前來看,Windows和Mac系統下的docker,主流還是通過虛擬機+容器的技術,只有在Linux下是真正的容器,不需要進行硬體虛擬以及運行完整作業系統等額外開銷,對系統資源的利用率更高。所以本文主要圍繞如何針對Linux下的Docker容器進行可視化分析。由於Docker的特點和廣泛使用,我們在實際案件或各類取證比賽中都會遇到容器相關的場景。
  • Docker Api未授權訪問漏洞復現
    Docker Remote API未授權訪問漏洞,此API主要目的是取代命令行界面;    Dcoker swarm是docker下的分布化應用的本地集群
  • 利用 Kubeadm部署 Kubernetes 1.13.1 集群實踐錄
    Kubernetes集群的搭建方法其實有多種,比如我在之前的文章《利用K8S技術棧打造個人私有雲(連載之:K8S集群搭建)》中使用的就是二進位的安裝方法。雖然這種方法有利於我們理解 k8s集群,但卻過於繁瑣。
  • 手把手教你用 Flask,Docker 和 Kubernetes 部署Python機器學習模型(附代碼)
    delete service test-ml-score-api-lb如果在本地運行 Kubernetes 和 GCP 上運行一個集群,那麼可以將 Kubectl 上下文從一個集群切換到另一個集群,如下所示:kubectl config use-context docker-desktop其中上下文的列表可以使用
  • Docker 1.11+:Engine 已經建立在 runC 和 containerd 之上
    如果你了解 Docker Engine 的早期歷史,你就知道它曾經用 LXC 來啟動和管理容器;後來它演變為 「libcontainer」。「libcontainer」 是一段與 cgroup 和 namespace 這些 Linux 內核交互的代碼,這些內核是容器構建的基石。
  • 如何有效地對Docker的鏡像進行管理?
    本文書寫過程中,也參照了Docker和K8S社區的一些內容。容器的存儲空間如何提供?前段時間,筆者看到一篇文章,題目是「容器就是Linux」,寫的不錯。容器說簡單點就是容器級別的虛擬化,在一個Kernel Space上虛擬出多個User Space。那麼,容器如何使用存儲空間呢?
  • 使用 kube-vip 搭建高可用 Kubernetes 集群
    kube-vip 是一個為 Kubernetes 集群內部和外部提供高可用和負載均衡的開源項目,在 VMware 的 Tanzu 項目中已經使用 kube-vip 替換了用於 vSphere 部署的 HAProxy 負載均衡器,本文我們將先來了解 kube-vip 如何用於 Kubernetes 控制平面的高可用和負載均衡功能。
  • 使用Docker buildx構架多平臺鏡像
    ]鏡像的系統架構為arm64,而k8s集群為amd64。原因找到,修改鏡像架構為amd即可。前言大部分發行鏡像一個標籤下都會存在多個不同架構的鏡像版本, 比如openjdk,就同時存在amd與arm兩個版本鏡像。
  • 第一次玩docker的體驗:從0搭建docker應用tomcat,mysql,redis
    背景    想玩一些集群的東西,windows有諸多不便利,隨決定搭建虛擬機,玩
  • 使用kubeadm部署kubernetes集群
    /linux/ubuntu/gpg | apt-key add -# add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"# apt-get -y install docker-ce docker-ce-cli
  • 【Docker】命令使用大全
    比如,本地測試他人的軟體、持續集成的時候提供單元測試和構建的環境。提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。
  • Maven Docker鏡像使用技巧
    Maven是目前最流行的Java項目管理工具之一,提供了強大的包依賴管理和應用構建功能。