Marathon

marathon

Posted by Dongyupu on October 22, 2017

将已有的程序迁移到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

  • 应用版本和滚动升级

  • 事件总线