将已有的程序迁移到mesos上
- 大部分应用程序可以归为两大类:
响应请求的应用程序
以及在特定时间点完成操作的应用程序
。
搭建marathon
- mesosphere 网站上有为ubuntu、debian、redhat和centos预打包的marathon版本。marathon用scala编写,因此用户只需运行
sbt assembly
就可以完成构建。
-
Marathon是否作为高可用性应用程序运行并不重要。实际上,在高可用配置下运行marathon所需的所有事情仅仅是确保启动了两个或者三个marathon实例,并且这些实例共享
--zk
命令行参数。还必须确保其他参数也一致,比如--master、--framework-name
以及侦听HTTP请求的端口,否则就会看到令人困惑的行为。当以这样的模式运行marathon时,marathon的所有实例都可以正确地响应请求,并且它们会神奇地同步状态,因此用户完全不需要担心这些。通常通过给marathon实例指派一个轮询(round-robin)的DNS名称,或者将其放在负载均衡器之后,就可以完成搭建了。 -
表3-1 marathon的部分命令行参数
参数 | 功能 |
---|---|
–master |
mesos master的URL。通常格式为 zk://host1:port,host2:port,host3:prot/mesos |
–framework-name |
允许用户自定义mesos里的marathon的实例名称,在有多个marathon实例运行时这很有用 |
–zk |
保存了marathon状态的zookeeper的实例集合。通常格式为zk://host1:port,host2:port,host3:prot/marathon |
–http-port |
启用marathon的HTTPS访问 |
使用marathon
- 托管HTTP应用程序。
示例3-1 SimpleHTTPServer JSON描述文件
{
"cmd": "python -m SimpleHTTPServer 31500",
"cpus": 0.5,
"mem": 50,
"instances": 1,
"id": "my-firt-app",
"ports": [31500],
"requirePorts": true
}
- “cmd” 指定将要启动应用程序的命令行。
- “cpus” 指定应用程序容器应该占用的CPU数。该值可以是分数。
- “mem” 指定应用程序容器应该占用的内存MB数。
- “instances” 指定在集群里应该启动的应用程序拷贝数。本演示中,仅仅生成一个实例,但是典型的应用程序可以生成2到2000个实例。
- “id” 是将来通过API如何指代该应用程序。对于每个应用程序而言该值必须唯一。
- “prots” 是应用程序要求的端口数组。本例只需要一个端口。之后会讲解如何动态分配和绑定端口。
-
“requirePorts” 因为显示指定想要分配的端口,所以必须告诉marathon,否则它会某人使用自动端口分配。
- 现在假定上述数据已经存储在名为 my-fist-app.json 的文件里。为了启动应用程序,使用HTPP POST将数据发送给marathon服务器:
curl -X POST -H 'Content-Type:application/json' marathon-server-ip:8080/v2/apps --data @my-fist-app.json
- 通常,用户不想硬编码应用程序的端口:毕竟,如果这么做了,那么每个slave(agent)上就只能运行该应用程序的一个实例。marathon可以替用户指定端口:将应用程序所要求的端口简单设置为0,并且将分配的端口记录在环境变量$PORT0、$PORT1等里。利用这一功能改动之前的的配置,就会如实例3-2所示。
示例3-2 SimpleHTTPServer JSON描述文件,使用动态选择的端口
{
"cmd": "python -m SimpleHTTPServer $PORT0",
"cpus": 0.5,
"mem": 50,
"instances": 1,
"id": "my-firt-app",
"ports": [0],
"uris": [
"http://fethable/uri/with/python.tar.gz"
]
}
- 扩展应用程序
本节探讨如何将HTTP服务器扩展到五个实例。
curl -X PUT -H 'Content-Type:application/json' marathon-server-ip:8080/v2/apps --data '{"instances": 5}'
当然,没有人会真的需要将这个没有什么用的应用程序启动5个实例,因此为什么不缩小实例数呢?
curl -X PUT -H 'Content-Type:application/json' marathon-server-ip:8080/v2/apps --data '{"instances": 1}'
伸缩相当容易!
- 使用位置约束
- marathon可以约束在何处启动应用程序。这些约束可以是slave(agent)的主机名或者任意slave(agent)属性。约束放在数组里提供给应用程序,每个约束本身就是包含两个或三个元素的数组,取决于是否需要传入参数
- 运行容器化的应用程序
- marathon很好的支持了docker容器。如果应用程序已经容器化了,就很容易在marathon上运行。
- 为了支持docker,首先需要确保mesos集群已经启用了docker支持。
- 挂载主机卷
-
健康检查:基于命令、HTTP和TCP
-
应用版本和滚动升级
- 事件总线