就在周四新项目发版,容器化是微服务的最佳载体,第一次部署由于后端项目端口号在DevOps平台端口配置错误,前端项目也启动了,前端通过代理调用后端服务,部署了很多容器服务,前端服务使用nginx,后端服务通过Service地址提供给前端服务调用。这里不是通过域名,毕竟容器内容一个应用,使用服务名调用是最合适的,你的服务又不往外面暴露。当重新删除后端服务后,前端服务访问接口返回502。
location ^~/xxxApi/ {
proxy_pass http://xxx-prod:8021/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
检查了一圈儿,服务名端口号,后端服务终端curl,都是可以通的,就是在前端的容器上通过服务名不通。
由于Bridge模式下容器重新部署后会重新分配ip,导致前后ip发生变化,但Nginx的dns域名解析肯定缓存了对应的ip。Bridge方式适用于服务器主机的虚拟化。
通过Google搜索nginx dns cache,会发现Nginx的确是这么干的,而且干得很坑爹。我截取其中的内容(参考文档DNS for Service Discovery with NGINX)如下:
If the domain name can’t be resolved, NGINX fails to start or reload its configuration.
NGINX caches the DNS records until the next restart or configuration reload, ignoring the records’ TTL values.
We can’t specify another load‑balancing algorithm, nor can we configure passive health checks or other features defined by parameters to the server directive, which we’ll describe in the next section.
看到没有,在nginx启动的时候他就会去解析IP地址。解析完后就缓存起来,并且对解析结果的TTL不管不顾。坑了个大爹啊!
最终是怎么解决的呢?执行:nginx -s reload 重新加载生效。这尼玛真实日了狗。有没有合适的解决方式呢?
默认情况下,容器会继承配置文件中定义的 DNS 设置 /etc/resolv.conf。连接到默认bridge网络的容器会收到此文件的副本。但是docker overlay网络里,这个DNS服务器必须是docker内置的才行,并且没有对外提供服务。
好在Docker可能早就意识到这个问题了,把所有容器内的DNS服务器地址固定为127.0.0.11。所以,对应到我们这里,就可以把原来的nginx配置文件改为下面的格式:
server {
listen 80 default_server;
location / {
resolver 127.0.0.11;
set $backend http://backend1:3000;
proxy_pass $backend;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
Nginx DNS缓存导致的Docker集群混乱及异常 https://zhuanlan.zhihu.com/p/28136665
Using DNS for Service Discovery with NGINX and NGINX Plus https://www.f5.com/company/blog/nginx/dns-service-discovery-nginx-plus
Networking overview https://docs.docker.com/engine/network/
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有