【问题标题】:nginx-proxy+docker swarm => load balancer not workingnginx-proxy+docker swarm => 负载均衡器不工作
【发布时间】:2020-05-15 06:32:56
【问题描述】:

我正在尝试将 nginx-proxy 与 Docker Swarm 模式一起使用。我有一个用于 nginx-proxy 的堆栈和一个用于复制 3 次的 whoami 容器的堆栈。

问题是,当我查询集群时,我总是得到同一个 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 时,每个回复都来自不同的副本。

提前致谢

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

    • 这不会导致上游内重复/相同的服务器块吗?
    猜你喜欢
    • 2017-05-09
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多