欢迎访问我的博客,你的支持,是我最大的动力!

企业级容器集群构建(六)Mesos解决方案_Mesos部署/Marathon

Docker 小马奔腾 3113℃ 评论
目录:
[显示]

Mesos是开源界集群任务调度和控制系统的鼻祖 DC/OS,基于mesos的商业数据中心操作系统解决方案

Mesos是一套健在式集群管理器,通过与不同任务间共享资源的方式改进资源使用率,提供一种统一化资源的视角,涵盖全部集群节点并能以无缝化方式利用类似单一计算机操作系统内核的方式实现资源访问。通过mesos构建的数据中心应用,就像是在无限量运算资源的巨型计算机上工作

Mesos的结构

主从结构的部署方式,并提供独有的两级调度机制
第一级调度是Mesos Master守护进程,管理集群中所有运行Mesos Agent守护进程的节点
第二级调度是服务框架,负责管理任务具体运行方式和状态的分布式系统。每个服务框架包括调度器(Scheduler)和执行器(Executor)两部分。
调度器需要单独部署,与Mesos Master保持通信,执行器在得到计算资源后,在每个需要的计算节点上自动运行
Mesos Master会与每个服务框架通信,并协调每个Agent节点,聚合计算各个节点的可用资源及所有可用资源的总量

Mesos容器运行的两种方式
A,使用Mesos的Docker容器执行组件Docker Containerizer,需要每个Agent节点安装Docker后台服务,由Mesos Ageng直接调用Docker API创建和管理容器
B,使用Unified Container特性,被Mesos容器赋予直接读取Docker和OCP(OCI标准)和Rkt(AppC标准)镜像的能力,不需要Docker后台服务支持,像运行普通程序那样运行使用镜像打包的服务

Mesos内部构成
核心使用C++编写,内部通信大量使用Protobuf协议,对外提供HTTP协议接口,原生支持高可用部署
Mesos Master职责
1、对服务框架的注册、心跳监控和异常状态的处理
2、对Agent节点的添加、心跳监控、任务分配和异常状态的处理
3、对资源的管理
Mesos Agent职责
1、负责管理任务的运行状态和服务框架执行器Executor,执行器二进制文件是由Master提供的
Framework服务框架
1、任务调度的组合

Mesos只关心集群中资源的量及把资源分配给谁,服务框架决定资源的使用
Mesos核心与服务框架之间的关联是通过Offer和Task来体现的
Offer,Mesos资源的抽象,表示CPU/GPU/内存/磁盘空间等的数量,打包给服务框架,服务框架决定如何使用这些资源
Task,运行的小任务,有两类:Long Running Task(长时间运行的进程)和Batch类型任务(如小任务或定是任务)

DC/OS数据中心操作系统
Mesos核心与周边服务及功能组件组成的数据中心操作系统
DC/OS在部署时对系统硬件有很多硬性限制和要求,许多组件用不同编程语言实现,但对使用者而言不需要知道太多细节

部署Mesos集群

部署ZooKeeper

Etcd使用的是Raft协议
ZooKeeper使用的是Paxos算法,相较于Raft古老

Mesos使用ZooKeeper记录Master节点地址,并实现高可用。在没有ZooKeeper情况下,能够部署只有单个Master节点的Mesos集群

ZooKeeper集群部署可参考(较详细):http://pdf.us/2018/08/31/1838.html

1、准备Java运行环境

jdk安装目录:/opt/java_maven_env/jdk1.8.0_161

在/etc/profile中末尾添加以下内容

JAVA_HOME=/opt/java_maven_env/jdk1.8.0_161
JRE_HOME=/opt/java_maven_env/jdk1.8.0_161/jre
CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

然后执行source命令,使配置生效
source /etc/profile

2、部署单节点ZooKeeper服务

yum install wget
cd /opt
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
tar zxf zookeeper-3.4.13.tar.gz
chown -R root:root zookeeper-3.4.13
cd zookeeper-3.4.13
# 添加环境变量 在/etc/profile文件末尾追加
echo "export ZOOKEEPER_HOME=/opt/zookeeper-3.4.13" >> /etc/profile
echo 'export PATH=$PATH:$ZOOKEEPER_HOME/bin' >> /etc/profile
然后执行source命令,使配置生效
source /etc/profile

cp $ZOOKEEPER_HOME/conf/zoo_sample.cfg $ZOOKEEPER_HOME/conf/zoo.cfg
#创建数据目录和日志目录
mkdir -p /opt/zookeeper-3.4.13/data
mkdir -p /opt/zookeeper-3.4.13/logs
##单机模式 修改/opt/zookeeper-3.4.13/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper-3.4.13/data
dataLogDir=/opt/zookeeper-3.4.13/logs
clientPort=2181

启动ZooKeeper
/opt/zookeeper-3.4.13/bin/zkServer.sh start
查看状态
/opt/zookeeper-3.4.13/bin/zkServer.sh status
停止服务
/opt/zookeeper-3.4.13/bin/zkServer.sh stop

部署Mesos
3、部署Mesos

可以从下面网址下载deb或rpm格式的安装包:
下载页面:https://open.mesosphere.com/downloads/mesos/
下载地址:http://repos.mesosphere.com/el/7/x86_64/RPMS/mesos-1.7.0-2.0.1.el7.x86_64.rpm

部署
wget http://repos.mesosphere.com/el/7/x86_64/RPMS/mesos-1.7.0-2.0.1.el7.x86_64.rpm
依赖:subversion cyrus-sasl-md5 libevent-devel
yum install mesos-1.7.0-2.0.1.el7.x86_64.rpm
# CentOS 7之后的版本中,推荐用dnf替代yum工具
# dnf install mesos-1.7.0-2.0.1.el7.x86_64.rpm

4、启动Master节点

mesos安装完成后在/usr/sbin目录下会生成可执行文件
ls /usr/sbin/mesos-*
/usr/sbin/mesos-agent
/usr/sbin/mesos-daemon.sh
/usr/sbin/mesos-master
/usr/sbin/mesos-slave
/usr/sbin/mesos-start-agents.sh
/usr/sbin/mesos-start-cluster.sh
/usr/sbin/mesos-start-masters.sh
/usr/sbin/mesos-start-slaves.sh
/usr/sbin/mesos-stop-agents.sh
/usr/sbin/mesos-stop-cluster.sh
/usr/sbin/mesos-stop-masters.sh
/usr/sbin/mesos-stop-slaves.sh
其中与slave相关的是为与1.0版本命名兼容,现在slave已被agent取代
提供的自动化部署脚本需要在各节点提前配置文件,并添加与执行部署节点的SSH信任,且隐藏了Mesos服务实际启动过程,不建议使用

手动部署

默认已经有:
/usr/lib/systemd/system/mesos-master.service
/usr/lib/systemd/system/mesos-slave.service

systemctl daemon-reload
systemctl start mesos-master
systemctl status mesos-master
systemctl enable mesos-master

--hostname=192.168.10.21,使用webui时,会出现频繁重连的现像,原因是部分请求是使用获取到的hostname做为域名的,可修改host文件或直接设置成ip
--ip,服务的监听地址,对其他的Mesos节点能访问的地址或域名
--zk,指定zookeeper实例地址,如为集群,用逗号分隔,zk://username:password@1.1.1.1:2181,2.2.2.2:2181,3.3.3.3:2181/mesos
--quorum,paxos协议中leader当选所需投票数,值应多于集群中master的一半的最小整数

访问http://192.168.10.21:5050,可打开集群管理界面

管理界面代码文件默认在/usr/share/mesos/webui/,可对界面进行定制,修改这个目录中相应文件内容

5、添加Agent节点
因为下面参数--containerizers=docker,mesos ,所以需要在agent节点安装docker,否则agent启动会失败
安装docker 18.06
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.1.ce-3.el7.x86_64.rpm
yum install docker-ce-18.06.1.ce-3.el7.x86_64.rpm
systemctl start docker
systemctl enable docker
注docker 18也需要使用国内加速,执行vi /etc/docker/daemon.json添加{"registry-mirrors": ["https://registry.docker-cn.com"]}
https://docs.docker.com/registry/recipes/mirror/#configure-the-cache
安装mesos
wget http://repos.mesosphere.com/el/7/x86_64/RPMS/mesos-1.7.0-2.0.1.el7.x86_64.rpm
yum install mesos-1.7.0-2.0.1.el7.x86_64.rpm
rm -f /usr/lib/systemd/system/mesos-master.service
rm -f /usr/lib/systemd/system/mesos-slave.service

systemctl daemon-reload
systemctl start mesos-agent
systemctl status mesos-agent
systemctl enable mesos-agent

--advertise_ip,指定agent节点对外ip地址,可使用--hostname参数代替
--no-switch_user,使用agent服务启动用户来执行所指定的任务内容,不需要切换为提交这个任务的用户
--containerizers,指定运行在集群中的框架能够使用的资源隔离方式,默认为mesos,可选为docker
--isolation,仅对mesos容器化的任务有效,指定当前节点上运行的任务用什么方法进行资源配额的限制和管理,包括CPU、内存、磁盘、文件系统、网络、数据卷等
--image_providers,仅对mesos容器化任务有效,指定Unitified Container功能需要支持的容器镜像各类列表,可选值:docker和appc,appc主要用在Rkt容器上
--executor_registration_timeout,任务启动时允许的最长耗时,超过这个时长,任务仍然没有启动完成,认为任务出错,对于使用docker镜像部署的任务,可能需要较长时间下载镜像,因此设置为5分钟或更长

Mesos服务启动参数

Mesos服务参数分为:通用项(Master/Agent都支持)、仅Master、仅Agent

1、常用通用项

若没有端口冲突,--port、--advertise_port可不指定
--ip在节点只有一个网卡时可不指定
若所有需访问web界面的用户都能直接访问mesos绑定的ip,--advertise_ip可不指定
--hostname通常不指定,仅在某些框架日志出现mesos master注册地址与收到offer来源地址不一致错误时,可指定

2、常用Master专属配置项

默认认证使用CRAM-MD5
CRAM-MD5使用principal和secret值对作为认证凭证,principal用于表示验证者身份

cat /mesos/master/credentials
{"credentials":[{"principal":"user01","secret":"password"},{"principal":"user02","secret":"password"}]}
Master启动:--credentials=file:///mesos/master/credentials
cat /mesos/agent/credential
{"principal":"user01","secret":"password"}
Agent启动:--credential=file:///mesos/agent/credential

服务框架的验证通常也是在框架启动时
如Marathon,需要--mesos_authentication开启认证功能,用--mesos_authentication_principal指定使用的principal名称,将secret内容存放到文件中,使用--mesos_authentication_secret_file指定

指定身份认证后,可以根据用户身份进行更详细的权限控制
默认采用ACL配置文件设定需要控制的内容,ACL是json格式的配置文件

--agent_removal_rate_limit,避免因偶发短时间网络故障使得大量Agent由于心跳包未送达,导致整个集群瞬间崩溃

3、常用Agent配置项

--attributes,赋予特定Agent的键值对,在向服务框架提供offer时,选择性进行资源过滤
Role是Mesos中实现租户隔离的方式,每个Role相当于一个独立租户,拥有全局唯一的名称和专用计算资源。对没有指定特定Role的资源,默认属于特殊的Role "*"
--default_role,用于将该agent所有未指定资源赋予某个特定的Role
同一个Role中所有服务框架所使用的资源总量不能超过此Role拥有的最大值

资源指定有三种方式:
静态指定,--resources参数,--resources="cpus(*):4;gpus(*):4;mem(*):2048;disk(*):409600"   *指默认Role
动态指定,API调用进行事后修改
Quota,API创建

使用Marathon管理服务

Marathon是Mesos后台任务管理框架,相当于init.d或supervisord,在任务异常退出时,自动重新启动任务实例以确保任务正常,如当一个节点故障时,会自动在另一个可用功点重新调度出现故障的任务或应用服务

Marathon包含调度器scheduler和执行器executor,部署时,实际部署的是它的调度器服务,执行器是在任务启动时,由agent节点自动运行

部署Marathon

项目地址:https://github.com/mesosphere/marathon
下载地址:http://downloads.mesosphere.com/marathon/v1.4.13/marathon-1.4.13.tgz

wget http://downloads.mesosphere.com/marathon/v1.4.13/marathon-1.4.13.tgz
tar xzf marathon-1.4.13.tgz
mv marathon-1.4.13 /opt

Marathon支持高可用部署,依赖ZK。需要有java环境。服务需要libmesos.so (/usr/lib/libmesos.so) ,可在这个节点上安装mesos或复制libmesos.so文件,放到/usr/lib或/usr/local/lib目录

注意:需要注入PATH环境变量,否则会因找不到java而不能启动
原因:java环境变量是写到/etc/profile文件中的,但仅对通过pam登录的用户生效,systemd不读取这些配置
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/java_maven_env/jdk1.8.0_161/bin:/opt/java_maven_env/jdk1.8.0_161/jre/bin

systemctl daemon-reload
systemctl start marathon
systemctl status marathon
systemctl enable marathon

访问:http://192.168.10.21:8080/ui/#/apps

--master,参数可以直接指定Mesos Master节点IP列表,或ZooKeeper地址和路径
其他参数示例:
--mesos_role marathon  #指定使用名为marathon的Role
--mesos_authentication \
--mesos_authentication_principal marathon \
--mesos_authentication_secret_file /mesos/marathon.secret #启用框架身份验证
--task_launch_timeout=300000 #启动应用超时时间,ms,默认5分钟

添加应用

应用Application/应用组Group
应用是一组相同任务的集合,每一个任务是应用的一个实例,可按需扩缩实例的个数,每个实例会被Mesos调度到不同的Agent上运行
应用组是多个相关联的不同应用的集合

Marathon支持Mesos容器和Docker容器

创建应用有简易模式和json模式,json模式功能更完整

Mesos默认采用的Mesos容器只提供CPU/GPU/内存/磁盘的隔离,文件系统是与节点共用的,未做隔离
uris可以让应用启动时通过HTTP/FTP/HDFS等协议,从外部获取运行所需的文件到应用运行目录,若是tar/gz/bz2/xz/zip还会在下载后自动解压,下载的文件不具有可执行权限,可以在cmd属性中添加 chmod +x操作。urls参数接收文件列表,支持批量下载多个外部文件

通过Restful API创建应用

使用nc命令监听节点$PROT0端口,并对所有访问它的HTTP请求返回字符串ABCD

posts的0表示使用一个随机端口,默认所有Agent节点只开放31000到32000之间的端口,可以在启动mesos agent时指定:--resources="ports(*):[7000-8000,31000-32000]"
ports属性是protDefinitions属性的简写
列表中的每个端口会在应用的运行环境中生成PORT0、PORT2...的环境变量,值为相应的端口值

# 创建应用
curl -X POST -H "Content-type: application/json" -Ls http://192.168.10.21:8080/v2/apps -d @cmd.json
# 获取应用信息
curl -s http://192.168.10.21:8080/v2/apps/marathon-x-demo
# 删除应用
curl -sX DELETE http://192.168.10.21:8080/v2/apps/marathon-x-demo

使用DC/OS命令行工具

dcos是DC/OS的命令行工具,可以操作和管理Marathon,比使用curl直观

# 安装
curl -O https://downloads.dcos.io/binaries/cli/linux/x86-64/dcos-1.11/dcos
chmod +x dcos
cp dcos /usr/local/bin/
# 设置
dcos config set marathon.url http://192.168.10.21:8080
# 使用
dcos marathon app add cmd.json  #创建应用
dcos marathon app list  #显示所有应用
dcos marathon app show marathon-xx-demo #显示应用详细信息
dcos marathon app update marathon-xx-demo instances=2 #将应用扩容
dcos marathon app remove marathon-xx-demo #删除应用

使用Docker容器

Mesos能利用Agent节点的Docker服务来提供任务运行环境,由于集群计算资源由Mesos内核封装提供,所有基于Mesos的服务框架都能直接获得运行Docker的能力

--containerizers=docker,mesos 表示同时开启Docker和Mesos两种容器化类型,要求集群中Agent节点预先安装Docker服务
container.type属性区分使用隔离容器的类型,值为docker时,使用Docker容器

# 使用python:3.5.1-alpine的Docker容器,在容器中执行python3 -m http.server 8080,并将容器的8080端口映射到运行主机的38080端口
注:默认所有Agent只开放31000-32000之间的tcp端口

注:python2.7 -> cd / && python -m SimpleHTTPServer 8080

dcos marathon app add marathon-docker.json
dcos marathon app show marathon-docker-demo | grep host
dcos marathon app remove marathon-docker-demo
查看日志
journalctl -u marathon.service -f

使用Unified Container

直接解析Docker、AppC格式镜像文件,并直接通过镜像创建应用
需要Mesos Agent启动时指定--isolation=docker//runtime参数,且使用--image_providers参数列出需开启的镜像格式支持

使用Mesos容器Unified Container特性运行Docker镜像不依赖于Docker服务,因此不需要在Agent节点预装Docker,mesos会自动下载镜像文件

Mesos Agent执行任务时,会自动为每个任务创建一个沙箱目录,作为执行环境和存放日志文件的目录
默认挂载目录是/mnt/mesos/sandbox 或者 /run/mesos/slaves 也可在Mesos Agent启动时用--sandbox_directory参数指定

Mesos容器不支持Docker的桥接网卡和端口映射,与网络相关的配置应使用标准的ports属性指定

其中"requirePorts": true,当所需端口被占用时,不使用随机重选的端口,若无满足条件的agent,则不调度

dcos marathon app add marathon-unified.json
dcos marathon app show marathon-unified-demo | grep host
dcos marathon app remove marathon-unified-demo

若是需要登录的私有仓库,那么

持久化卷存储

非容器化的Marathon任务中,仅存在CPU/内存的隔离,应用可以使用绝对路径直接访问所在Agent节点上任何(权限允许的)目录和文件
使用Docker容器或Unified Container特性后,镜像方式运行的应用副本在动态扩缩、应用升级等操作时,会丢掉存储的数据

Marathon为持久化存储,可以在容器中挂载Agent本地目录,并可通过Flock等第三方工具进行扩展

# 将Agent上/tmp目录挂载到容器中/data路径,并在该目录中创建hello文件

dcos marathon app add marathon-volume.json
dcos marathon app show marathon-volume-demo | grep host
dcos marathon app remove marathon-volume-demo
# Unified Container下载的镜像位于Agent的/tmp/mesos/store目录内

# 创建Docker镜像仓库

dcos marathon app add marathon-registry.json
dcos marathon app show docker-registry
dcos marathon app remove docker-registry

Marathon-LB负载均衡

Marathon-LB:https://github.com/mesosphere/marathon-lb
服务发现和负载均衡工具,基于haproxy提供负载均衡能力

Marathon-LB监听Marathon管理,利用python自动更新haproxy配置

docker run -d --name="marathon-lb" --privileged --net=host -e PORTS=9090 mesosphere/marathon-lb:v1.4.3 sse --marathon http://192.168.10.21:8080 --health-check --group external

内置haproxy的Marathon-LB免配置Docker镜像,建议将其部署在Mesos集群之外的节点上,以方便进行流量和访问策略的管理
--privileged和--net=host,容器中haproxy需要操作节点iptables规则,并直接在节点网卡上建立路由
PORTS环境变量指定haproxy的api服务监听的端口
实际上haproxy会占用主机80/443/9090/9091端口
其中80/443对外的http和https访问入口
9090用于提供api
9091在没有设置域名和服务端口的情况下,直接用应用名称访问应用
sse,使用监听Marathon事件api来获得应用状态变化的信息
# poll,定期查询的方式来获得应用变化,通常不再使用
--marathon,指定监听的Marathon服务地址
--health-check,只将流量负载到健康检查通过的后端实例
--group,在Mesos集群中有多个Marathon-LB实例时,区分应用要注册到哪个负载均衡器,推荐在一个集群中为内网和外网访问分别独立提供负载均衡实例

查看haproxy状态
http://192.168.10.21:9090/haproxy?stats

Marathon-LB可以将动态部署到Agent上未知端口的应用映射到固定节点的固定端口
后端若是多实例则会轮询

示例:
Docker方式

dcos marathon app add marathon-lb-demo.yaml

说明:
flin/whoami内置监听8000端口,会向请求者返回主机名
通常,使用Marathon-LB负载均衡的服务都应该加上健康检查,以使Marathon自动去除不正常的副本
servicePort:10080,在负载均衡器增加端口为10080的路由规则,即在负载结点监听10080端口
标签:
HAPROXY_GROUP,仅当存在该标签且标签值与自身--group值一致时,才会负载该应用
HAPPROXY_0_VHOST,为服务绑定域名,数字0代表与第一个服务端口的访问入口相关联访问:
1、直接访问Marathon-LB节点的10080端口
curl 192.168.10.21:10080
2、使用域名
curl demo.caas.com
curl -H "Host: demo.caas.com" http://192.168.10.21
3、使用9091端口
添加X-Marathon-App-Id请求头,值为应用名称
curl -H "X-Marathon-App-Id: /marathon-lb-demo" http://192.168.10.21:9091

MESOS方式

portMappings是Docker容器特有的,对Mesos容器,会使用ports或portDefinitions属性中指定的端口作为服务端口
需要将Mesos容器中服务监听的端口修改为与服务端口一致
对flin/whoami,可以使用WHOAMI_PORT环境变量,注意env属性中不能使用$PORT0这样的变量,要直接写实际的值

dcos marathon app add marathon-lb-mesos.yaml

curl 192.168.10.21:31085
curl mesos.caas.com
curl -H "Host: mesos.caas.com" http://192.168.10.21
curl -H "X-Marathon-App-Id: /marathon-lb-mesos" http://192.168.10.21:9091

 

转载请注明:轻风博客 » 企业级容器集群构建(六)Mesos解决方案_Mesos部署/Marathon

喜欢 (1)or分享 (0)