nginx-proxy+docker swarm => 负载均衡器不工作
nginx-proxy+docker swarm => load balancer not working
我正在尝试在 Docker Swarm 模式下使用 nginx-proxy。我有一个用于 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
然后每个回复都来自不同的副本。
提前致谢
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" 部分。
{{ 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。
我正在尝试在 Docker Swarm 模式下使用 nginx-proxy。我有一个用于 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
然后每个回复都来自不同的副本。
提前致谢
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" 部分。
{{ 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。