负载平衡docker群

我有一个Docker群模式与一个HAProxy容器,和3个Python Web应用程序。 带HAProxy的容器是公开端口80,并应负载平衡我的应用程序的3个容器(由leastconn )。

这是我docker-compose.yml文件:

 version: '3' services: scraper-node: image: scraper ports: - 5000 volumes: - /profiles:/profiles command: > bash -c " cd src; gunicorn src.interface:app \ --bind=0.0.0.0:5000 \ --workers=1 \ --threads=1 \ --timeout 500 \ --log-level=debug \ " environment: - SERVICE_PORTS=5000 deploy: replicas: 3 update_config: parallelism: 5 delay: 10s restart_policy: condition: on-failure max_attempts: 3 window: 120s networks: - web proxy: image: dockercloud/haproxy depends_on: - scraper-node environment: - BALANCE=leastconn volumes: - /var/run/docker.sock:/var/run/docker.sock ports: - 80:80 networks: - web networks: web: driver: overlay 

当我部署这个swarm( docker stack deploy --compose-file=docker-compose.yml scraper )时,我得到了所有的容器:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 245f4bfd1299 scraper:latest "/docker-entrypoin..." 21 hours ago Up 19 minutes 80/tcp, 5000/tcp, 8000/tcp scraper_scraper-node.3.iyi33hv9tikmf6m2wna0cypgp 995aefdb9346 scraper:latest "/docker-entrypoin..." 21 hours ago Up 19 minutes 80/tcp, 5000/tcp, 8000/tcp scraper_scraper-node.2.wem9v2nug8wqos7d97zknuvqb a51474322583 scraper:latest "/docker-entrypoin..." 21 hours ago Up 19 minutes 80/tcp, 5000/tcp, 8000/tcp scraper_scraper-node.1.0u8q4zn432n7p5gl93ohqio8e 3f97f34678d1 dockercloud/haproxy "/sbin/tini -- doc..." 21 hours ago Up 19 minutes 80/tcp, 443/tcp, 1936/tcp scraper_proxy.1.rng5ysn8v48cs4nxb1atkrz73 

而当我显示haproxy容器日志,看起来他认识到3个python容器:

 INFO:haproxy:dockercloud/haproxy 1.6.6 is running outside Docker Cloud INFO:haproxy:Haproxy is running in SwarmMode, loading HAProxy definition through docker api INFO:haproxy:dockercloud/haproxy PID: 6 INFO:haproxy:=> Add task: Initial start - Swarm Mode INFO:haproxy:=> Executing task: Initial start - Swarm Mode INFO:haproxy:==========BEGIN========== INFO:haproxy:Linked service: scraper_scraper-node INFO:haproxy:Linked container: scraper_scraper-node.1.0u8q4zn432n7p5gl93ohqio8e, scraper_scraper-node.2.wem9v2nug8wqos7d97zknuvqb, scraper_scraper-node.3.iyi33hv9tikmf6m2wna0cypgp INFO:haproxy:HAProxy configuration: global log 127.0.0.1 local0 log 127.0.0.1 local1 notice log-send-hostname maxconn 4096 pidfile /var/run/haproxy.pid user haproxy group haproxy daemon stats socket /var/run/haproxy.stats level admin ssl-default-bind-options no-sslv3 ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:DHE-DSS-AES128-SHA:DES-CBC3-SHA defaults balance leastconn log global mode http option redispatch option httplog option dontlognull option forwardfor timeout connect 5000 timeout client 50000 timeout server 50000 listen stats bind :1936 mode http stats enable timeout connect 10s timeout client 1m timeout server 1m stats hide-version stats realm Haproxy\ Statistics stats uri / stats auth stats:stats frontend default_port_80 bind :80 reqadd X-Forwarded-Proto:\ http maxconn 4096 default_backend default_service backend default_service server scraper_scraper-node.1.0u8q4zn432n7p5gl93ohqio8e 10.0.0.5:5000 check inter 2000 rise 2 fall 3 server scraper_scraper-node.2.wem9v2nug8wqos7d97zknuvqb 10.0.0.6:5000 check inter 2000 rise 2 fall 3 server scraper_scraper-node.3.iyi33hv9tikmf6m2wna0cypgp 10.0.0.7:5000 check inter 2000 rise 2 fall 3 INFO:haproxy:Launching HAProxy INFO:haproxy:HAProxy has been launched(PID: 12) INFO:haproxy:===========END=========== 

但是当我尝试GEThttp://localhost我收到一条错误消息:

 <html> <body> <h1>503 Service Unavailable</h1> No server is available to handle this request. </body> </html> 

有两个问题:

  1. docker-compose.yml文件中的command应该是一行。
  2. scraper图像应该暴露5000端口(在他的Dockerfile )。

一旦我解决了这些问题,我就用同样的方法(使用stack )部署这个群集, proxy容器识别python容器,并且能够在它们之间进行负载平衡。

503错误通常意味着对后端服务器的运行状况检查失败。

您的统计信息页面可能会对您有所帮助:如果将鼠标hover在您的某个后端服务器的LastChk列上,HAProxy会给出您为什么该服务器处于closures状态的模糊摘要: 在这里输入图像说明

它看起来不像你为你的default_service后端configuration健康检查( option httpchk ):你能直接到达任何后端服务器(例如curl --head 10.0.0.5:5000 )吗? 从HAProxy文档 :

响应2xx和3xx被认为是有效的,而所有其他的则表示服务器故障,包括没有任何响应。