这是今天我们在开发环境下 docker swarm 集群上遇到的问题,在这篇博文中记录一下排查过程。

先登录到应用容器内检查一下其中运行的站点是否能正常访问:

# docker exec -it 024be860ad79 /bin/bash
# curl -s -D - -o /dev/null http://127.0.0.1
HTTP/1.1 200 OK

可以正常访问。

然后登录到 docker flow proxy 的 proxy_proxy 服务的容器内,检查一下是否可以正常访问应用容器中的站点:

# docker exec -it $(docker ps --filter name=proxy_proxy -q | head -1) /bin/sh

# apk add --update curl
# curl -s -D - -o /dev/null http://q_web
HTTP/1.1 200 OK

也可以正常访问。

接着查看该容器内 HAProxy 的配置文件:

cat /cfg/haproxy.cfg

发现很多根据主机名进行路由转发的 acl 配置丢失,原本有很多下面这样的路由配置:

acl url_q_web80_0 path_beg /
acl domain_q_web80_0 hdr(host) -i q.cnblogs.com
use_backend q_web-be80_0 if url_q_web80_0 domain_q_web80_0

而 backend 的配置正常。

于是强制更新 proxy_proxy 服务:

$ docker service update -d=false --force proxy_proxy
proxy_proxy
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Waiting 1 seconds to verify that tasks are stable...

更新后,HAProxy 的路由配置数据恢复正常。

但过了会,HAProxy 的路由配置数据又丢失了。

用下面的命令查看 swarm-listener 的路由配置,路由都是正常的,/cfg/haproxy.cfg 的路由配置问题并没有影响到实际的路由配置。

curl http://swarm-listener:8080/v1/docker-flow-swarm-listener/get-services

查看 swarm-listener 的日志

docker service logs proxy_swarm-listener

发现下面的错误:

ERROR: Request http://proxy:8080/v1/docker-flow-proxy/reconfigure?distribute=true&port=80&serviceDomain=q.cnblogs.com&serviceName=q_web returned status code 500

折腾半天没解决,只能重建集群。

在重建集群部署应用时,特地观察了一下 /cfg/haproxy.cfg 中的配置是如何被更新的。

当使用 docker stack deploy 命令部署时,proxy_swarm-listener 日志中会有这样的记录:

Sending service created notification to http://proxy:8080/v1/docker-flow-proxy/reconfigure?distribute=true&port=80&serviceDomain=q.cnblogs.com&serviceName=q_web

然后 proxy_proxy 容器中的 /cfg/haproxy.cfg 文件被添加这样的配置:

acl domain_q_web80_0 hdr(host) -i q.cnblogs.com dev-q.cnblogs.com
use_backend q_web-be80_0 if url_q_web80_0 domain_q_web80_0 backend q_web-be80_0
mode http
server q_web q_web:80

2017年8月8日更新:

昨天又到了这个问题,今天排查下来怀疑是多个容器无法启动引起的,当容器启动失败时,swarm会不停地重新启动容器,而每次启动容器都会更新 docker flow proxy 的路由配置,可能就是这个频繁更新让 docker flow proxy 的路由出现问题。

相关博问:

奇怪的"Docker Flow Proxy: 503 Service Unavailable"问题

排查 docker flow proxy 的 503 问题的更多相关文章

  1. Docker hv-sock proxy (vsudd) is not reachable

    Docker hv-sock proxy (vsudd) is not reachable Docker hv-sock proxy (vsudd) is not reachable at Docke ...

  2. docker设置proxy

    该方法是持久化的,修改后会一直生效.该方法覆盖了默认的docker.service文件. 1. 为docker服务创建一个内嵌的systemd目录 mkdir -p /etc/systemd/syst ...

  3. Docker 小记 — Compose & Swarm

    前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...

  4. docker swarm和compose 的使用(阿里)

    基本的docker使用参考:Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点) 昨天去阿里面试 问我如果给你5台服务器 如何部署docker,我说一个个拷贝,面试官听了 ...

  5. 自建docker swarm体验简单之美

    之前用的阿里云容器服务,但由于acsrouting的路由错乱问题,被逼上自建docker swarm的梁山.今天尝试自己搭建docker swarm,竟然轻松搞定,简单的超乎想象. 以下是实际搭建操作 ...

  6. docker learning

    Docker 配置文件位置 Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致 在 ubuntu 中的位置是:/etc/default/docker 在 cento ...

  7. docker部署archery

    一.centos7部署docker 1 通过 uname -r 命令查看你当前的内核版本 uname -r 2  确保 yum 包更新到最新. yum update 3 卸载旧版本 yum remov ...

  8. docker swarm 英文参考资料阅读列表

    将自己在使用 docker swarm 过程中阅读的英文参考资料收集在这篇博文中,便于以后查阅与温习,顺带分享. 2017年8月5日之前阅读 My experience with Docker Swa ...

  9. nexus3使用docker运行/创建docker私有仓库/maven私有仓库

    version: '3.2' services: nexus3: container_name: nexus3 hostname: nexus3 image: sonatype/nexus3:3.14 ...

随机推荐

  1. 打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  2. C#访问MySQL数据库的方法

    C#访问MySQL数据库的方法 (1)首先需要下载C#访问MySQL数据库的ADO.NET驱动程序 下载地址为: http://dev.mysql.com/downloads/connector/ne ...

  3. [转]三步完成Source Insight 4.0 破解安装

    下载地址有更新,之前有朋友因潜在的版权问题封禁没下到,现在更新后可正常使用了. 文末有完全清除上次安装残留的方法,需要的人可以参考. —— 更新于 2018.1.21 第一步:安装    安装sour ...

  4. C#-MVC开发微信应用(7)--在管理系统中同步微信用户分组信息

    在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码.希望从一个更高的层次介绍微信的开发. 在 ...

  5. Centos下Yum安装PHP 5.5、5.6、7.0

    Centos系统自带的php版本很低,如果我们需要使用高版本的php,可以不用编译安装,直接用yum安装会非常省时省力. 1.检查当前安装的PHP包yum list installed | grep ...

  6. Shell脚本编程(二):shell变量

    定义变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程 ...

  7. nginx配置http为1.0到1.1

    转载自:https://blog.csdn.net/u014558668/article/details/79237020 需求:接口通过nginx转发服务器,接收不到数据,但是测试环境是好的: 环境 ...

  8. Centos7 中lvs DR配置

    服务器主机: 10.200.3.100       DirectServer 10.200.3.99         RealServer1 10.200.3.101 RealServer2 10.2 ...

  9. .Net MVC Cache 缓存技术总结

    一.细说 ASP.NET Cache 及其高级用法 二..Net环境下的缓存技术介绍 (转) 三.asp.net中缓存的使用介绍一 四.HttpContext.Current.Cache 过期时间

  10. SpringSecurity兑现多登录成功页面和登录成功返回被拦截界面

    SpringSecurity实现多登录成功页面和登录成功返回被拦截界面 使用SrpingSceurity作为认证和授权的安全框架可以省下很多基础工作. 具体可以参考SpringSecurity,这里不 ...