zoukankan      html  css  js  c++  java
  • 排查 docker flow proxy 的 503 问题

    这是今天我们在开发环境下 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"问题

  • 相关阅读:
    MongoDB基础之五:游标
    SQLSERVER 中实现类似Mysql的 INSERT ON DUPLICATE KEY UPDATE
    统计C语言程序行数
    作业(一)
    无法获取有关Windows NT 组用户‘组用户’的信息,错误代码0x5(Microsoft SQL Server,错误:15404)
    DELETE与TRUNCATE的区别
    SQL Server显式事务与隐式事务
    SQL Server去掉字段内的双引号
    AlwaysOn与数据库镜像端点问题
    AlwaysOn数据同步暂停及回退技术
  • 原文地址:https://www.cnblogs.com/dudu/p/7262859.html
Copyright © 2011-2022 走看看