现在我这边使用 docker swarm 遇到了一个非常棘手的问题,
我们使用 docker swarm 搭建集群跑的 java 容器。
在做滚动更新的时候。总是有请求进来,结果 nginx 那边报了一堆 502。因为我们每台机器上面都跑了一个 nginx 然后在通过 nginx 的 upstream 来转发给本地机器的容器进程的。
upstream web {
server localhost:18081;
keepalive 300;
理论上 docker swarm 集群在做滚动更新的时候。会先把集群内部的负载均衡里面摘掉既然废弃的容器进程,切断流量。然后停止这个容器,进而拉起一个容器。接着通过健康检测判断这个容器是否启动完毕。启动完毕之后,就会把这个容器进程加入到负载均衡里面的。这么下来就完成了滚动更新,毕竟集群会先在负载均衡摘掉流量的,所以不可能还有有流量打入这个即将废弃的容器进程了。可是现在我们每次发布更新总会伴着 1000 多条 502 的记录。
通过 docker file 生成镜像的,而健康检测也是写到了 docker file 里面的。
健康检测设置如下:
HEALTHCHECK --interval=20s --timeout=10s --retries=10 CMD wget --quiet --tries=1 --spider http://localhost:$service_port/healthCheck || exit 1
我们尝试过优雅关闭,设置过了 --stop-signal 为 30s 甚至 60s 发现还是一样,发布过程中会出现 502,现在两个方向。不确定这些 502 是由于流量打到了旧容器而导致的,还是流量打到新容器而导致的,新容器这个是怀疑我们的健康检测设置不合理,也就是容器进程还没有能够对外提供服务,健康检测却通过了,认为这个新容器进程是启动完毕了,加入了负载均衡有部分流量打到了新容器进程去。
k8s 悄悄处理了这个问题,比如他们配置了 preStop 等这种策略。能够完美解决这个问题,但是 docker swarm 目前,不敢相信会有这种问题。毕竟按照 docker swarm 的滚动发布流程,是不可能有这种问题的。它是先摘除流量的。现在非常的头疼,不知道从何下手了。而一时之间我们也不能断然的上 k8s 集群。毕竟体量也很少,暂时不考虑。各位在使用 docker swarm 的时候是否遇见过这样的问题。
请教,万分感谢,提前祝大家新年快乐~~
补充一下:我们的nginx 部署的网络是host模式,而应用是专门创建了一个overlay网络在里面跑的
NETWORK ID NAME DRIVER SCOPE
wqpezy5g2pjl bobo-network overlay swarm (这是我们后端应用跑的网络命名空间)
b4f0b8c4ef4d bridge bridge local
59347c5dfa7a docker_gwbridge bridge local
4079bbadea8b host host local
2cw5xft9mtyj ingress overlay swarm
cadc70451b26 none null local
efmpcxfd7yv1 portainer-agent_portainer_agent overlay swarm
dockerdocker-swarmkubernetes集群运维
1 月 12 日遇到了一模一样的问题。
每次滚动更新的时候,都会出现几十上百条不等的502,基本上发生在停止的那一秒钟。也没啥好的解决办法,然后我选择了忽略它 :(
这个过程可能是在发送停止信号和完全停止之间。之前测试过,在这个停止的过程中,docker swarm仍然会把请求转发到这个容器里,实际上程序已经不能处理请求了,所以猜测可能是这个过程导致了502,但是后面没怎么验证。
也有点好奇这个情况应该怎么处理,我觉得这应该是个普遍的现象。用了一段时间docker swarm集群了,目前发现问题还不只是这一点,比如:
在高并发的情况下,会出现转发请求超时的问题,这个目前通过改配置可以解决。master节点的dockerd偶尔会出现内存泄漏的问题,发现有时候dockerd的内存会涨到4-5G,这个还只能通过重启解决。目前也是计划换到k8s上,现在纠结的也是规模不大,上k8s感觉有点不太合适。
2 月 3 日 四川我也遇到了这个问题,不过还有更重要的问题要解决,所以这个问题被搁置了。我倒是没考虑过使用host模式,主要是觉得这种模式隐患很大。路由的话,我部分固定组件用的nginx,频繁更新用的traefik 我感觉会好一些,不过还是有问题,不过我没有详细的debug,另外我也找到了一些组件比如nginx-proxy ,可能这种模式更加适合容器模式,不过我没有测试过。
免费试用:点我开通试用
资产管理系统免费试用
相关内容
申请体验,开启您的企业数字化
立即体验400-0589-976