nginx-proxy + docker swarm =>负载均衡器不起作用

时间:2020-05-14 13:14:25

标签: docker docker-swarm-mode jwilder-nginx-proxy

我正在尝试在Docker Swarm模式下使用nginx-proxy。我有一个用于nginx-proxy的堆栈和一个用于whoami容器的堆栈,该容器已被复制了3次。

问题是,当我查询群集时,我总是会收到来自同一whoami的响应。当我按下docker service scale whoami_whoami=1时,nginx会以503状态码进行回复,这意味着它一直在询问被删除的副本之一。

# proxy.yml
version: '3.8'

networks:
  proxy:
    driver: overlay
    name: proxy

services:
  nginx:
    image: jwilder/nginx-proxy:latest
    networks:
      - proxy
    environment:
      - HTTPS_METHOD=noredirect
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      # - ${CLU_ROOT}/proxy/certs:/etc/nginx/certs:ro
    ports:
      - 80:80
      # - 443:443
    deploy:
      placement:
        constraints:
          - node.role == manager
# whoami.yml
version: '3.8'

networks:
  proxy:
    external: true

services:
  whoami:
    image: jwilder/whoami:latest
    networks:
      - proxy
    environment:
      - VIRTUAL_HOST=whoami.dev.interne.eseo.fr
    deploy:
      replicas: 3

我当时认为nginx会将请求发送给“ whoami”,而Swarm的作用是在副本之间保持平衡。我错了吗?

另一方面,当我发布whoami服务的端口8000并单击:while sleep 1; do clear; curl whoami....:8000; done时,每个回复都来自不同的副本。

预先感谢

1 个答案:

答案 0 :(得分:0)

nginx-proxy提供的模板文件错误。 代替使用服务的DNS名称(在我的情况下为whoami_whoami),它使用服务的一个容器的IP(这就是为什么我总是得到相同的容器)的原因。

一旦模板文件被修复,nginx-proxy就会使用Swarm模式负载平衡器来连接副本。

要解决此问题,请完成2个任务:

1。更新堆栈文件以安装自定义nginx.tmpl:

# proxy.yml

...

services:
  nginx:
    image: jwilder/nginx-proxy:latest
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/app/nginx.tmpl:ro  # <=== Add this line to your service.
    ...

2。更新nginx.tmpl文件中的“定义上游”部分。

{{ define "upstream" }}
  server {{ index .Container.Labels "com.docker.swarm.service.name" }}:{{ .Address.Port }};
#   {{ if .Address }}
#       {{/* If we got the containers from swarm and this container's port is published to host, use host IP:PORT */}}
#       {{ if and .Container.Node.ID .Address.HostPort }}
#           # {{ .Container.Node.Name }}/{{ .Container.Name }}
#           server {{ .Container.Node.Address.IP }}:{{ .Address.HostPort }};
#       {{/* If there is no swarm node or the port is not published on host, use container's IP:PORT */}}
#       {{ else if .Network }}
#           # {{ .Container.Name }}
#           server {{ .Network.IP }}:{{ .Address.Port }};
#       {{ end }}
#   {{ else if .Network }}
#       # {{ .Container.Name }}
#       {{ if .Network.IP }}
#           #server {{ .Network.IP }} down;
#       {{ else }}
#           server 127.0.0.1 down;
#       {{ end }}
#   {{ end }}
{{ end }}

原始的nginx.tmpl文件可以从这里下载:https://raw.githubusercontent.com/nginx-proxy/nginx-proxy/master/nginx.tmpl

相关问题