2

我有一个运行 Docker 版本 1.13.1 的 Docker 群。我定期将 Docker 服务堆栈(通过docker stack deploy)部署到这个 swarm,我有一个 nginx 代理服务,它位于端口 80 和 443,作为 swarm 中各种应用程序的反向代理。

我在使用 nginx 的upstream功能时遇到了一个问题,它缓存了我的服务名称的 DNS 查找。这在一段时间内运行良好,但随着更多堆栈被删除和部署,这些缓存的 IP 地址变得陈旧,nginx 将开始超时或向错误的容器提供请求。

我尝试使用以下技术解决此问题:

[in nginx.conf]
server {
  server_name myapp.domain.com;
  resolver 127.0.0.11 valid=10s ipv6=off;

  set $myapp http://stack_myapp:80; # stack_myapp is the DNS name of the service
  location / {
    proxy_pass $myapp;
  }
}

# other similar server blocks

127.0.0.11 似乎是 swarm 设置的内部 DNS 服务器的 IP 地址。这似乎在大多数情况下都有效 - 上游服务的 IP 地址不会被缓存很长时间,并且如果上游服务移动,代理就会恢复。但是,代理偶尔仍会为不正确地址的请求提供服务,例如,它会为请求提供服务http://10.0.0.12:80/...并超时或命中错误的容器。当我运行时docker exec proxycontainer ping stack_myapp,我得到了正确的 IP 地址。为什么 nginx 什么时候不能解析正确的 IP ping

4

0 回答 0