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

企业级容器集群构建(七)Mesos解决方案_

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

Mesos-DNS域名服务

Mesos-DNS,域名解析和基于应用名称的服务发现功能
https://github.com/mesosphere/mesos-dns
golang

Mesos-DNS的域名解析规则会根据Marathon或Aurora等框架部署的任务自动行成
Mesos-DNS将集群中运行的应用赋予域名,并通过DNS查询协议将域名解析成实际服务地址
Mesos-DNS不直接与服务框架通信,而是定期检索Mesos Master中所有运行的框架和正在运行的任务状态,生成A记录和SRV记录
Mesos-DNS自身没有状态、心跳检查、持久化存储和分布式一致性机制

部署:

wget https://github.com/mesosphere/mesos-dns/releases/download/v0.6.0/mesos-dns-v0.6.0-linux-amd64
curl -Lo mesos-dns https://github.com/mesosphere/mesos-dns/releases/download/v0.6.0/mesos-dns-v0.6.0-linux-amd64
chmod +x mesos-dns
mv mesos-dns /usr/local/bin/

配置文件/etc/mesos-dns.conf

# /etc/mesos-dns.conf
{
"zk":"zk://192.168.10.21:2181/mesos",
"listener":"192.168.10.21",
"port":53,
"domain":"mesos",
"resolvers":["114.114.114.114","114.114.115.115"],
"refreshSeconds":60,
"ttl":60,
"timeout":5,
"httpon":true,
"dnson":true,
"httpport":8123,
"externalon":true,
"SOAMname":"ns1.mesos",
"SOARname":"root.ns1.mesos",
"SOARefresh":60,
"SOARetry":600,
"SOAExpire":86400,
"SOAMinttl":60,
"IPSources":["netinfo","mesos","host"]
}

zk,指定Mesos Master的地址,可以使用ZK记录的地址和路径
listener,port,DNS服务运行的IP和端口
domain,生成的顶级域名,创建避开常见顶级域名,避免产生混淆
resolvers,上级DNS域名服务器

建立服务

# /etc/systemd/system/mesos-dns.service
[Unit]
Description=Mesos DNS Service

[Service]
ExecStart=/usr/local/bin/mesos-dns -config=/etc/mesos-dns.conf
Restart=always

[Install]
WantedBy=multi-user.target

systemctl enable mesos-dns
systemctl start mesos-dns
systemctl status mesos-dns

Mesos-DNS会自动生成必要的域名记录,要使用Mesos-DNS,需要在每个节点上修改/etc/resolv.conf文件
sed -i '1s/^/nameserver 192.168.10.21\n/' /etc/resolv.conf

Mesos-DNS注册的域名格式为:<服务名>.<框架名>.<配置文件中的domain值>
Docker默认采用主机resolv.conf创建容器内resolv.conf,所以Mesos-DNS生成的域名对Mesos容器和Docker容器都有效
yum install bind-utils
nslookup marathon-lb-demo.marathon.mesos
nslookup baidu.com   # 也支持集群外域名的解析
docker run --rm busybox ping -c 4 marathon-lb-demo.marathon.mesos

服务管理

服务依赖和编组

Group
应用组可以嵌套应用组,形成复杂的应用部署结构,依赖即可以在应用间,也可以在应用组间,依赖一个应用组
依赖关系只有在同一个应用描述文件中才有效

# demo区块是应用组,redis和webapp区块是两个应用,完整ID分别是:/demo/redis和/demo/webapp

dcos marathon group add marathon-group-demo.json
dcos marathon group remove demo

webapp中的"dependencies":["/demo/redis"]属性指定该应用依赖于/demo/redis应用
在创建应用组时,会按照依赖顺序进行创建
扩容时,先扩容被依赖应用,再扩容依赖应用,缩容相反;删除应用组时,先删除被依赖,再删除依赖应用

应用升级

应用升级包括更改执行的命令、Docker或Unified Container镜像、运行参数的修改等
可使用web界面、dcos、api、sdk方式修改

dcos marathon app update marathon-cmd-demo instances=4
dcos marathon app update marathon-cmd-demo cmd="whild [ true ];do echo 'HTTP/1.0 200 OK\r\nContent-Length: 7\r\nHello Marathon' | nc -l -p \$PORT0; done"
# 嵌套式属性,要提供完整的新版本内容
dcos marathon app update marathon-unified-demo container='{"type":"MESOS","docker":{"image":"python:3.5.3-alpine"}}'
# 借助json文件
dcos marathon app update marathon-docker-demo < docker-demo.json
cat docker-demo.json | dcos marathon app update marathon-docker-demo
注,上面方式只更新配置文件中修改或增加的属性,对删除的属性,无效

Marathon更新操作
先启动与原先应用相同个数的新版本副本,等到新版副本全部启动完成后,再删除原有应用副本,配置Marathon-LB的自动路由切换,可保证应用升级中不中断
新旧版本在一瞬间完成,两个版本几乎没有并存时间
这种方式在更新大规模应用时,更新中必须要有两倍资源,否则会卡在中间,无法升级,也无法回退
出现这种情况时,可先强行将应用副本数减少(这会打断正在进行的部署),升级后再扩大副本数

upgradeStrategy可配置升级过程
maximumOverCapacity,默认1,升级过程中最大超额副本数。在升级时,为避免服务中断,可临时增加额外副本,会影响增加新副本的数目
minimumHealthCapacity,默认1,升级过程中保持最小健康副本数,确保在应用升级时始终保留一部分对外提供服务的副本,会影响删除旧副本的速度
值均为0-1间小数

历史版本查看
dcos marathon app version list marathon-lb-demo
回滚
dcos marathon app update marathon-lb-demo version="2018-10-25T11:35:56.349Z"

调度约束

调度约束Constraints
使用节点标签,将任务指定分配到具有特定标签的节点上,或使用主机名进行资源标定和筛选
Mesos Agent启动参数中的--attributes参数,添加特殊键值标签

约束值
"constraints":[["<标签>","<操作>","<操作参数>"]]

操作
在指定标签值相同节点上
UNIQUE,最多只能运行一个应用副本
"constraints":[["hostname","UNIQUE"]]
MAX_PER,最多只能运行指定个数的应用副本
"constraints":[["zone_id","MAX_PER","2"]]
GROUP_BY,尽可能均匀地分散开
"constraints":[["zone_id","GROUP_BY"]]
"constraints":[["zone_id","GROUP_BY","3"]]
CLUSTER,将应用只部署在具有特定标签的节点
"constraints":[["disk_type","CLUSTER","SSD"]]
LIKE,将应用只部署在具有特定标签的节点,支持正则表达式
"constraints":[["zone_id","LIKE","zone-[1-3]"]]
UNLIKE,将应用部署到没有特定标签的节点上,并尽可能均匀分布,支持正则表达式
"constraints":[["zone_id","UNLIKE","zone-[7-9]"]]

健康检查

当应用副本不能通过健康检查时,会重启以尝试恢复
影响服务升级和Marathon-LB

HTTP方式的检查

HTTP,HTTPS,MESOS_HTTP,MESOS_HTTPS四种
HTTP和HTTPS访问请求从Marathon运行节点发出
MESOS_HTTP和MESOS_HTTPS访问请求从运行副本的Agent节点发出
返回http状态码在200-399间,即正常

"healthChecks":{
"protocol":"HTTP",
"portIndex":0,
"path":"/api/health",
"gracePeriodSeconds":300,
"intervalSeconds":60,
"timeoutSeconds":20,
"maxConsecutiveFailures":3
}

TCP方式的检查

TCP,MESOS_TCP,区别在访问副本的是Marathon节点还是Agent节点,检查指定端口是否有监听

"healthChecks":{
"protocol":"MESOS_TCP",
"portIndex":0,
"gracePeriodSeconds":300,
"intervalSeconds":60,
"timeoutSeconds":20,
"maxConsecutiveFailures":0
}

COMMAND方式的检查

运行特定命令,若命令正常结束,则认为副本健康
若命令中有双引号,需用三个反斜杠转义(读取时:前两个反斜杠转义为一个有效的反斜杠,第三个反斜杠用于转义双引号;执行时,转义过的反斜杠和双引号组合再次被转义,最后得到一个有效的双引号)

"healthChecks":{
"protocol":"COMMAND",
"command":{"value":"/bin/bash -c \\\"/bin/check.sh $PORT0\\\""},
"gracePeriodSeconds":300,
"intervalSeconds":60
}

其中:
portIndex,对HTTP和TCP检查,指定检查应用声明的第几个端口
gracePeriodSeconds,默认300,指定在应用启动多久后监控检查开始生效,单位秒
intervalSeconds,默认60,单位秒,两次检查的时间间隔
timeoutSeconds,默认20,单位秒,超时时间
maxConsecutiveFailures,默认3,重试次数

Chronos定时任务框架

依据资源选择节点、失败任务自动重试、任务资源配额限制、指定任务运行最长时长、允许任务之间相互依赖
Chronos支持使用Mesos容器或Docker容器运行任务,提供基于json的Restful API,用于创建、修改、删除和手动触发任务
Chronos支持集群式部署,使用ZK存储任务数据

部署Chronos

项目地址:https://github.com/mesos/chronos

Chronos使用Scala语言编写,依赖Mesos的libmesos.so文件,需要JDK

 

 

 

 

 

 

 

更多Mesos服务框架

服务框架本质
服务框架是能直接运行在Mesos内核之上的应用程序

Mesos和Yarn是分布式计算领域最广泛流行的资源调度平台

Spark-分布式计算框架

支持批量技术、流式计算、数据预测、海量数据查询等应用场景
Spark可在没有Mesos的情况下独占方式管理计算资源,基于Mesos运行Spark能有效与其他服务框架复用资源

Kafka-分布式消息队列服务

常用作多个计算框架之间进行数据缓冲和格式解耦的中间件
单机可以达到每秒十万条以上的消息传输能力,水平扩展后,对TB级以上的数据也能保证常数时间复杂度的访问性能

Aurora-通用任务运行框架

支持常驻后台任务和定时计划任务,支持Mesos和Docker容器的运行
大型组织的任务调度系统,学习曲线较陡峭

Swan-通用常驻任务调度框架

程序水平扩缩、滚动升级、版本回滚、健康检查、自动故障转移
内置服务发现和DNS模块

Metronome-定时任务框架

内置在DC/OS数据中心解决方案中,支持定时任务、支持手动触发单次任务

 

 

转载请注明:轻风博客 » 企业级容器集群构建(七)Mesos解决方案_

喜欢 (0)or分享 (0)