我已经用docker swarm部署了硒网格。
docker-compose.yml
version: '3.7'
services:
hub:
image: selenium/hub:3.141.59-mercury
ports:
- "4444:4444"
volumes:
- /dev/shm:/dev/shm
privileged: true
environment:
HUB_HOST: hub
HUB_PORT: 4444
deploy:
resources:
limits:
memory: 5000M
restart_policy:
condition: on-failure
window: 240s
healthcheck:
test: ["CMD", "curl", "-I", "http://127.0.0.1:4444/wd/hub/status"]
interval: 1m
timeout: 60s
retries: 3
start_period: 300s
chrome:
image: selenium/node-chrome:latest
volumes:
- /dev/shm:/dev/shm
privileged: true
environment:
HUB_HOST: hub
HUB_PORT: 4444
NODE_MAX_INSTANCES: 5
NODE_MAX_SESSION: 5
deploy:
resources:
limits:
memory: 2800M
replicas: 10
entrypoint: bash -c 'SE_OPTS="-host $$HOSTNAME" /opt/bin/entry_point.sh'
问题在于,当hub
的状态为unhealthy
时,群集几乎永远不会重新启动它。仅仅几次,我注意到它已成功重启。据我了解,它应该一直重新启动,直到healthcheck
成功或永久消失,但是容器只是在unhealthy
状态下运行。
我尝试完全排除restart_policy
,以防它与群模式混乱,但没有效果。
另外:成功chrome
重新启动后,hub
容器(所有副本)似乎重新启动了。 docker-compose.yml
中未指定该关系,这是怎么发生的?
我的设置可能出什么问题了?
更新:
当我尝试检查容器(状态不正常并且不再进行重试 )时,例如docker container inspect $container_id --format '{{json .State.Health}}' | jq .
或容器上的几乎所有其他功能,均失败此输出:
docker container inspect 1abfa546cc26 --format '{{json .State.Health}}' | jq .
runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7fa114765fff m=0 sigcode=18446744073709551610
goroutine 0 [idle]:
runtime: unknown pc 0x7fa114765fff
stack: frame={sp:0x7ffe5e0f1a08, fp:0x0} stack=[0x7ffe5d8f2fc8,0x7ffe5e0f1ff0)
00007ffe5e0f1908: 73752f3a6e696273 732f3a6e69622f72
00007ffe5e0f1918: 6e69622f3a6e6962 2a3a36333b30303d
00007ffe5e0f1928: 3b30303d616b6d2e 33706d2e2a3a3633
00007ffe5e0f1938: 2a3a36333b30303d 3b30303d63706d2e
00007ffe5e0f1948: 67676f2e2a3a3633 2a3a36333b30303d
00007ffe5e0f1958: 333b30303d61722e 3d7661772e2a3a36
00007ffe5e0f1968: 2e2a3a36333b3030 333b30303d61676f
00007ffe5e0f1978: 7375706f2e2a3a36 2a3a36333b30303d
00007ffe5e0f1988: 3b30303d7870732e 0000000000000000
00007ffe5e0f1998: 3a36333b30303d66 2a3a36333b30303d
00007ffe5e0f19a8: 3b30303d616b6d2e 33706d2e2a3a3633
00007ffe5e0f19b8: 2a3a36333b30303d 3b30303d63706d2e
00007ffe5e0f19c8: 67676f2e2a3a3633 2a3a36333b30303d
00007ffe5e0f19d8: 333b30303d61722e 3d7661772e2a3a36
00007ffe5e0f19e8: 2e2a3a36333b3030 333b30303d61676f
00007ffe5e0f19f8: 7375706f2e2a3a36 0000000000000002
00007ffe5e0f1a08: <8000000000000006 fffffffe7fffffff
00007ffe5e0f1a18: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a28: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a38: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a48: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a58: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a68: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a78: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a88: ffffffffffffffff 00007fa114acd6e0
00007ffe5e0f1a98: 00007fa11476742a 0000000000000020
00007ffe5e0f1aa8: 0000000000000000 0000000000000000
00007ffe5e0f1ab8: 0000000000000000 0000000000000000
00007ffe5e0f1ac8: 0000000000000000 0000000000000000
00007ffe5e0f1ad8: 0000000000000000 0000000000000000
00007ffe5e0f1ae8: 0000000000000000 0000000000000000
00007ffe5e0f1af8: 0000000000000000 0000000000000000
runtime: unknown pc 0x7fa114765fff
stack: frame={sp:0x7ffe5e0f1a08, fp:0x0} stack=[0x7ffe5d8f2fc8,0x7ffe5e0f1ff0)
00007ffe5e0f1908: 73752f3a6e696273 732f3a6e69622f72
00007ffe5e0f1918: 6e69622f3a6e6962 2a3a36333b30303d
00007ffe5e0f1928: 3b30303d616b6d2e 33706d2e2a3a3633
00007ffe5e0f1938: 2a3a36333b30303d 3b30303d63706d2e
00007ffe5e0f1948: 67676f2e2a3a3633 2a3a36333b30303d
00007ffe5e0f1958: 333b30303d61722e 3d7661772e2a3a36
00007ffe5e0f1968: 2e2a3a36333b3030 333b30303d61676f
00007ffe5e0f1978: 7375706f2e2a3a36 2a3a36333b30303d
00007ffe5e0f1988: 3b30303d7870732e 0000000000000000
00007ffe5e0f1998: 3a36333b30303d66 2a3a36333b30303d
00007ffe5e0f19a8: 3b30303d616b6d2e 33706d2e2a3a3633
00007ffe5e0f19b8: 2a3a36333b30303d 3b30303d63706d2e
00007ffe5e0f19c8: 67676f2e2a3a3633 2a3a36333b30303d
00007ffe5e0f19d8: 333b30303d61722e 3d7661772e2a3a36
00007ffe5e0f19e8: 2e2a3a36333b3030 333b30303d61676f
00007ffe5e0f19f8: 7375706f2e2a3a36 0000000000000002
00007ffe5e0f1a08: <8000000000000006 fffffffe7fffffff
00007ffe5e0f1a18: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a28: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a38: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a48: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a58: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a68: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a78: ffffffffffffffff ffffffffffffffff
00007ffe5e0f1a88: ffffffffffffffff 00007fa114acd6e0
00007ffe5e0f1a98: 00007fa11476742a 0000000000000020
00007ffe5e0f1aa8: 0000000000000000 0000000000000000
00007ffe5e0f1ab8: 0000000000000000 0000000000000000
00007ffe5e0f1ac8: 0000000000000000 0000000000000000
00007ffe5e0f1ad8: 0000000000000000 0000000000000000
00007ffe5e0f1ae8: 0000000000000000 0000000000000000
00007ffe5e0f1af8: 0000000000000000 0000000000000000
goroutine 1 [running, locked to thread]:
runtime.systemstack_switch()
/usr/local/go/src/runtime/asm_amd64.s:311 fp=0xc00009c720 sp=0xc00009c718 pc=0x565171ddf910
runtime.newproc(0x565100000000, 0x56517409ab70)
/usr/local/go/src/runtime/proc.go:3243 +0x71 fp=0xc00009c768 sp=0xc00009c720 pc=0x565171dbdea1
runtime.init.5()
/usr/local/go/src/runtime/proc.go:239 +0x37 fp=0xc00009c788 sp=0xc00009c768 pc=0x565171db6447
runtime.init()
<autogenerated>:1 +0x6a fp=0xc00009c798 sp=0xc00009c788 pc=0x565171ddf5ba
runtime.main()
/usr/local/go/src/runtime/proc.go:147 +0xc2 fp=0xc00009c7e0 sp=0xc00009c798 pc=0x565171db6132
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:1337 +0x1 fp=0xc00009c7e8 sp=0xc00009c7e0 pc=0x565171de1a11
rax 0x0
rbx 0x6
rcx 0x7fa114765fff
rdx 0x0
rdi 0x2
rsi 0x7ffe5e0f1990
rbp 0x5651736b13d5
rsp 0x7ffe5e0f1a08
r8 0x0
r9 0x7ffe5e0f1990
r10 0x8
r11 0x246
r12 0x565175ae21a0
r13 0x11
r14 0x565173654be8
r15 0x0
rip 0x7fa114765fff
rflags 0x246
cs 0x33
fs 0x0
gs 0x0
为解决此问题,我确实尝试应用此解决方案: https://success.docker.com/article/how-to-reserve-resource-temporarily-unavailable-errors-due-to-tasksmax-setting
但是它什么都不会影响,因此,我想原因是不同的。
journalctl -u docker
仅包含此日志:
level=warning msg="Health check for container c427cfd49214d394cee8dd2c9019f6f319bc6637cfb53f0c14de70e1147b5fa6 error: context deadline exceeded"
答案 0 :(得分:3)
首先,我将省略restart_policy
。群集模式将为您恢复发生故障的容器,并且该策略在群集模式之外进行处理,并可能导致意外行为。接下来,要调试运行状况检查,因为已为它配置了多次重试,超时和开始时间,所以要检查容器。例如。您可以运行以下命令:
docker container inspect $container_id --format '{{json .State.Health}}' | jq .
该容器的输出将显示容器的当前状态,包括一段时间内所有运行状况检查结果的日志。如果显示该容器重试失败超过3次且运行不正常,请检查服务状态:
docker service inspect $service_name --format '{{json .UpdateStatus}}' | jq .
这应该显示当前是否正在进行更新,发布变更是否导致任何问题。
要查看的另一件事是内存限制。如果没有相应的内存预留,则调度程序可能会将限制用作预留(我需要对此进行测试),如果您没有其他容器尚未预留的10G可用内存,则调度程序可能会失败重新安排服务。一种简单的解决方案是指定一个较小的保留,您要确保在计划容器时该保留在节点上始终可用。例如
deploy:
resources:
limits:
memory: 5000M
reservations:
memory: 1000M
基于最新的调试输出:
docker container inspect 1abfa546cc26 --format '{{json .State.Health}}' | jq .
runtime/cgo: pthread_create failed: Resource temporarily unavailable
SIGABRT: abort
PC=0x7fa114765fff m=0 sigcode=18446744073709551610
这表明主机本身是导致问题的原因,或者是docker引擎,而不是容器的配置。如果您还没有,请确保您正在运行docker的最新稳定版本。最后检查的是19.03.9。我会检查/ var / log /中的其他操作系统日志,以查看主机上的其他任何错误。我会检查是否达到资源限制,内存等内容以及任何与进程/线程相关的sysctl设置(例如kernel.pid_max)。对于docker,我还建议您更新内核和systemd版本,并在之后重新启动并更新到这些版本以应用更改。
我还建议您检查this unix.se post是否存在相同的错误,并尝试其他一些操作。
如果这些方法都无济于事,则可以在以下位置提供详细信息以重现类似的未解决问题:
答案 1 :(得分:0)
对于第一个问题,每隔N次重试失败,Swarm将重新启动不正常的容器。如果要深入了解此内容,请使用以下命令监控docker事件
docker events --filter event=health_status
对于第二个问题:-每当集线器重新启动时,所有节点都将重新启动,这是可以预期的,因为集线器将与所有节点保持会话,并且当您重新启动集线器时,它将重置所有会话并设置新节点。