x
swarm集群滚动更新时出现一堆502怎么办
来源:云呐 2023-02-07 15:29:05

   现在我这边使用 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 ,可能这种模式更加适合容器模式,不过我没有测试过。

云呐专注于企业资产管理软件的研发、测试与维护等服务.面向国内外客户提供大数据资产管理系统、工单管理系统、运维管理系统、项目管理软件、ITSS管理工具等解决方案.公司时刻关注着企业管理软件市场的需求,本着对互联网行业的热忱,构建企业大数据智慧.打破企业系统数据的孤岛现象,利用多维度企业数据化分析,为企业发展提供数据化指导.





免费试用:点我开通试用

智能运维品牌

固定资产管理系统

申请体验,开启您的企业数字化

立即体验