Docker Swarm更新服务后旧任务IP未从Ingress网络移除故障排查求助
Docker Swarm服务DNS解析异常排查与解决方案建议
问题场景
使用Docker Swarm与docker service管理应用,近期更新一个含2个任务的服务后,约半小时内有50%概率无法通过服务名及VIP访问该服务:
- 执行
nslookup tasks.myservice查询到4个IP,其中2个为当前运行容器IP,另外2个属于已停止容器; - 在运行容器内执行同一命令仅查到3个IP,同主机的已停止容器IP未出现在列表中;
- dockerd日志存在异常信息:
msg="rmServiceBinding d0283c4f3f93e348e91b5239d30d1af0921e0f606ced2f057e85d8997ec7e8c9 possible transient state ok:false entries:0 set:false "; - 临时解决方式为让节点退出Swarm集群后重新加入。
系统信息
uname -a Linux dongni-nginx2 5.10.134-15.an8.x86_64 #1 SMP Thu Jul 20 00:35:47 CST 2023 x86_64 x86_64 x86_64 GNU/Linux docker info Client: Docker Engine - Community Version: 24.0.7 Context: default
根因排查方向
- Swarm DNS服务状态异常:日志中
rmServiceBinding的ok:false提示服务绑定移除失败,说明Swarm清理已停止任务的DNS记录时出现异常,大概率是集群节点间raft状态同步延迟、一致性冲突导致旧记录未被清理。 - 节点网络栈未同步更新:已停止容器的IP在主机层面已释放,但节点的DNS缓存或iptables规则未及时更新,导致集群DNS仍返回无效IP。
- Docker版本BUG:当前使用的Docker 24.0.7可能存在Swarm DNS记录清理的已知问题,需核对官方版本日志确认是否有对应修复。
规避与解决建议
- 升级Docker版本:优先升级至最新稳定版(如25.x系列),官方后续版本通常会修复Swarm组件的已知同步问题。
- 强制刷新服务与DNS状态:出现异常时无需退出集群,可执行
docker service update --force myservice强制刷新服务状态,触发DNS记录同步;或在所有节点重启dockerd服务,强制刷新网络规则与缓存。 - 监控集群节点健康:定期执行
docker node ls检查节点状态,确保所有节点处于Ready状态,避免集群脑裂或状态不一致引发的同步问题。 - 优化服务更新策略:更新服务时使用
--update-parallelism 1限制并行更新数量,搭配--update-delay设置新旧任务切换间隔,确保旧任务完全清理后再启动新任务,减少状态冲突概率。
内容的提问来源于stack exchange,提问作者刘思凡
相关产品推荐
相关产品推荐

