前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次生产发版502

记一次生产发版502

作者头像
只喝牛奶的杀手
发布于 2025-05-20 11:09:16
发布于 2025-05-20 11:09:16
5900
代码可运行
举报
运行总次数:0
代码可运行

就在周四新项目发版,容器化是微服务的最佳载体,第一次部署由于后端项目端口号在DevOps平台端口配置错误,前端项目也启动了,前端通过代理调用后端服务,部署了很多容器服务,前端服务使用nginx,后端服务通过Service地址提供给前端服务调用。这里不是通过域名,毕竟容器内容一个应用,使用服务名调用是最合适的,你的服务又不往外面暴露。当重新删除后端服务后,前端服务访问接口返回502。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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)如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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配置文件改为下面的格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 只喝牛奶的杀手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档