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
所以我认为我们比以前走得更远了,但我们仍然遇到一些端口问题。我不知道为什么容器会自行构建成功,没有端口设置的马拉松,但没有端口设置的马拉松
要检查的东西很少:
关于你的奴隶:ps aux | grep sbin/mesos-slave
应该包含如下内容:
--containerizers=docker,mesos --executor_registration_timeout=5mins
再次在 slave 上检查是否有 Docker 守护进程 运行:
ps aux | grep "docker daemon"
确保您已将 Docker 网络(在 Marathon 中)配置为 BRIDGE
。使用 HOST
模式,您可能会与主机上已使用的端口发生冲突。这将允许映射 slave:32001 -> docker:8080
.
...
"network": "BRIDGE",
"portMappings": [
{
"containerPort": 8080,
"hostPort": $PORT0,
"protocol": "tcp"
}
],
...
当任务在 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
.
如果任务没有启动,可能是资源不足或 Marathon 有问题。将浏览器导航到 http://{marathon URI:8080]/logging
并增加任务分配的详细程度。然后查看马拉松日志。
我有一个 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
所以我认为我们比以前走得更远了,但我们仍然遇到一些端口问题。我不知道为什么容器会自行构建成功,没有端口设置的马拉松,但没有端口设置的马拉松
要检查的东西很少:
关于你的奴隶:
ps aux | grep sbin/mesos-slave
应该包含如下内容:--containerizers=docker,mesos --executor_registration_timeout=5mins
再次在 slave 上检查是否有 Docker 守护进程 运行:
ps aux | grep "docker daemon"
确保您已将 Docker 网络(在 Marathon 中)配置为
BRIDGE
。使用HOST
模式,您可能会与主机上已使用的端口发生冲突。这将允许映射slave:32001 -> docker:8080
.... "network": "BRIDGE", "portMappings": [ { "containerPort": 8080, "hostPort": $PORT0, "protocol": "tcp" } ], ...
当任务在 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
.如果任务没有启动,可能是资源不足或 Marathon 有问题。将浏览器导航到
http://{marathon URI:8080]/logging
并增加任务分配的详细程度。然后查看马拉松日志。