我在Docker数据中心上部署了Java Spring Boot应用程序。每当我们为服务部署堆栈时,它就会按预期杀死所有现有容器并使用新映像启动新容器。但是问题是,当Spring应用程序在容器内启动时(通常是30-40秒),我们会收到504 Bad Gateway。我的直觉是,由于容器已启动并正在运行,负载平衡器向容器发送请求,但应用程序仍在启动,有没有办法解决这个问题?之所以会产生影响,是因为我们有5个用于服务的容器,并且每个容器发生相同的事情。因此,发生这种情况时,很大一部分用户会得到错误。
答案 0 :(得分:0)
您的撰写文件中有一个解决方案:update_config
version: '3.4'
services:
your-app:
image: your/image:old
deploy:
replicas: 5
update_config:
parallelism: 2
delay: <yourStartupTimeInSeconds+3>s
order: stop-first
因此,当您部署your/image
的更新版本时,swarm将关闭两个容器,部署两个新的容器,在几秒钟内等待<yourStartupTimeInSeconds+3>
,直到它部署具有新映像的其他两个副本,然后等待再次部署其余的。
您前面的负载均衡器(服务)仍然进行运行状况检查(节点可能会发生故障),对吗?
答案 1 :(得分:-1)
每个docker Orchestrator都有一个“运行状况检查”系统,该系统旨在消除此问题(运行状况检查或就绪或活跃度或...)。
如果您在应用程序上创建“ ping”端点(或类似的端点也可以检查所需资源的类似端点),则可以将运行状况检查设置为对此端点发出HTTP请求,并且只有在您的回复为200。
仅当健康检查正常时,才会将启动容器放在服务池中。在此之前,您的容器将不会收到任何请求。
此外,这种检查还用于确定是否存在问题(应用程序没有死机,但形状不好,使响应时间真正变长或发送错误)时是否需要重新启动容器(k8s中的Pod) )。
请注意,某些前端负载均衡器也可以使用这种运行状况检查。但是仅当您具有从此负载均衡器到Docker容器的直接连接时才需要使用它(这种直接链接实际上不是一个好习惯)。