Marathon 不会启动 docker 个容器

Marathon won't launch docker container

我有一个 1/1 master/slave 设置,从机有 8gb ram 8 cpus。我正在尝试使用马拉松来部署一个 docker 容器,其中包含 1gb 内存和 1 cpu,但它只是挂在等待

我认为这通常是由于 marathon 没有获得任务所需的资源造成的 当我查看我的日志时,我看到

Sending 1 offers to framework 8bb1a298-cc23-426e-ad43-d440a2a560c4-0000 (marathon) at scheduler-d4a993b4-69ea-4ac3-9e98-b54afe1e790b@127.0.0.1:52016 I0127 23:07:37.396546 2471 master.cpp:3297] Processing DECLINE call for offers: [ 5271fcb3-4d77-4b12-af85-d94fd9172514-O127 ] for framework 8bb1a298-cc23-426e-ad43-d440a2a560c4-0000 (marathon) at scheduler-d4a993b4-69ea-4ac3-9e98-b54afe1e790b@127.0.0.1:52016 I0127 23:07:37.396917 2466 hierarchical.cpp:744] Recovered cpus(​):6; mem(​):5968; disk(​):156020; ports(​):[31000-31056, 31058-32000] (total: cpus(​):8; mem(​):6992; disk(​):156020; ports(​):[31000-32000], allocated: cpus(​):2; mem(​):1024; ports(*):[31057-31057]) on slave 8bb1a298-cc23-426e-ad43-d440a2a560c4-S0 from framework 8bb1a298-cc23-426e-ad43-d440a2a560c4-0000

所以马拉松似乎正在拒绝它收到的报价?日志中的下一行说 mesos 正在回收提供的资源以及它的回收看起来对我的任务来说足够了吗?

关于如何进一步解决这个问题有什么想法吗?

编辑:所以必须进一步深入研究并找到马拉松日志。

基本上,如果我们不在 marathon docker 部分中输入任何端口映射信息,部署就会成功。 docker 容器部署成功,我可以从它的主机成功 ping 它,但我无法从其他地方访问它。

如果我们将容器端口设置为 8081(docker 容器公开的是其应用程序侦听的端口)我们在部署过程中会更进一步,但容器内的应用程序无法构建并出现错误

Error: listen EADDRINUSE :::8081 at Object.exports._errnoException (util.js:856:11) at exports._exceptionWithHostPort (util.js:879:20) at Server._listen2 (net.js:1234:14) at listen (net.js:1270:10) at Server.listen (net.js:1366:5) at EventEmitter.listen (/usr/src/app/node_modules/express/lib/application.js:617:24) at Object. (/usr/src/app/index.js:16:18) at Module._compile (module.js:425:26) at Object.Module._extensions..js (module.js:432:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:313:12) at Function.Module.runMain (module.js:457:10) at startup (node.js:138:18) at node.js:974:3

所以我认为我们比以前走得更远了,但我们仍然遇到一些端口问题。我不知道为什么容器会自行构建成功,没有端口设置的马拉松,但没有端口设置的马拉松

要检查的东西很少:

  1. 关于你的奴隶:ps aux | grep sbin/mesos-slave 应该包含如下内容:

    --containerizers=docker,mesos --executor_registration_timeout=5mins

  2. 再次在 slave 上检查是否有 Docker 守护进程 运行:

    ps aux | grep "docker daemon"

  3. 确保您已将 Docker 网络(在 Marathon 中)配置为 BRIDGE。使用 HOST 模式,您可能会与主机上已使用的端口发生冲突。这将允许映射 slave:32001 -> docker:8080.

    ...
    "network": "BRIDGE",
    "portMappings": [
      {
        "containerPort": 8080,
        "hostPort": $PORT0,
        "protocol": "tcp"
      }
    ],
    ...
    
  4. 当任务在 Marathon 中启动时,您会看到类似 myapp.a72db5b0-ca16-11e5-ba5f-fea9945fabaf 的应用程序 ID。使用 Mesos CLI (pip install mesos.cli mesos.interface) 获取日志。有一个类似于 Unix 的 tail 的命令,用于获取 stdout 日志(-f follow logs):

    mesos tail -f -i myapp.a72db5b0-ca16-11e5-ba5f-fea9945fabaf
    

    stderr

    mesos tail -f -i myapp.a72db5b0-ca16-11e5-ba5f-fea9945fabaf stderr
    

    -i 允许您从非活动任务中获取日志(以防任务快速崩溃)。如果您在 Marathon 中没有抓到 ID,请使用 mesos ps -i.

  5. 如果任务没有启动,可能是资源不足或 Marathon 有问题。将浏览器导航到 http://{marathon URI:8080]/logging 并增加任务分配的详细程度。然后查看马拉松日志。