【nginx】解决k8s中部署nginx转发不会自动更新域名解析启动失败的问题

文章目录

  • 1. 问题
  • 2.解决办法
  • 3.扩展说明
    • 3.1 DNS解析阶段划分
    • 3.2 问题说明
      • 3.2.1 先看/etc/resolv.conf说明
      • 3.2.2 针对第一个问题
      • 3.2.3 针对第二个问题

【后端】Nginx+lua+OpenResty高性能实践
参考: https://blog.csdn.net/u010837612/article/details/123275026

1. 问题

k8s中使用nginx作为后端接口反向代理,大概配置如下:

  location /api {proxy_set_header   X-Forwarded-Proto $scheme;proxy_set_header   Host              $http_host;proxy_set_header   X-Real-IP         $remote_addr;proxy_pass http://api-server-svc:8080/;}

其中api-server-svc是后端服务的serviceName
这个配置会有两个问题:

1.要求api-server-svc这个service要先创建,否则nginx启动时会因为无法解析api-server-svc而启动失败
2.·nginx·服役期间,如果后端服务重启(这里指的容器重新创建,并非更新镜像,因为更新镜像ip不会变动,还是原来容器),svc ip改变了,代理会失败,因为nginx缓存了旧ip

2.解决办法

修改nginx配置如下:

  # dns设置缓存时间5s,解决问题2resolver kube-dns.kube-system.svc.cluster.local valid=300s;# 使用变量方式,解决问题1set $apiserver api-server-svc.xxx.svc.cluster.local;location /api {proxy_set_header   X-Forwarded-Proto $scheme;proxy_set_header   Host              $http_host;proxy_set_header   X-Real-IP         $remote_addr;rewrite /api/(.*) /$1 break;proxy_pass http://$apiserver:8080;}

set $apiserver api-server-svc.xxx.svc.cluster.local; 中域名一定要写全域名,不能简写成api-server-svc
之前之所以可以简写,因为容器/etc/resolv.conf中有配置了search,在解析域名时会自动帮你补全域名。
但此处我们使用了resolver指定了域名服务器,在解析时是不会自动帮我们补全的

3.扩展说明

3.1 DNS解析阶段划分

一般来说,Nginx在配置解析阶段(即Nginx启动时读取配置文件并解析配置的阶段)和请求处理阶段(即Nginx接收并处理客户端请求的阶段)对域名的处理方式是不同的。
配置解析阶段:

  • 在这个阶段,如果Nginx配置文件中直接使用了域名(而不是通过变量引用),Nginx会在启动时尝试解析这些域名。这个解析过程通常是同步且阻塞的,Nginx会使用系统配置的DNS服务器(如/etc/resolv.conf中指定的DNS服务器)来解析域名。
  • 如果在配置文件中使用了变量来引用域名(例如,在set指令中设置了一个变量来存储域名),并且这个变量在请求处理阶段被用于反向代理或重定向等场景,那么域名的解析可能会推迟到请求处理阶段进行。

请求处理阶段:

  • 在请求处理阶段,如果Nginx需要根据变量中的域名进行动态解析(例如,在proxy_pass指令中使用了变量),Nginx可以使用其内置的动态DNS解析机制。这个机制允许Nginx在需要时根据配置的DNS服务器(通过resolver指令指定)来解析域名。
  • resolver指令可以在http块、server块或location块中设置,用于指定Nginx用于动态DNS解析的DNS服务器地址。Nginx会按照这些地址的顺序尝试解析域名,直到成功为止。
  • 如果在Nginx配置中使用了resolver指令,并且变量中的域名在请求处理阶段被用于需要DNS解析的场景,那么Nginx就会根据resolver指令中指定的DNS服务器来解析这个域名,而不会去读取/etc/resolv.conf文件。这是因为resolver指令已经明确告诉了Nginx应该使用哪些DNS服务器进行解析。
  • k8s中一般都是这个DNS解析服务器:kube-dns.kube-system.svc.cluster.local ;
  • 一般配置了set 域名,都要搭配使用resolver如果没有配置 resolver,Nginx可能会依赖于系统默认的DNS解析设置(如/etc/resolv.conf文件),但这并不是Nginx直接的行为,而是系统层面的行为。然而,需要注意的是,Nginx在处理域名解析时并不一定会直接读取/etc/resolv.conf文件,特别是在一些特定配置或环境下(配置set 要配置resolver,因为至少我在docker中测试时,如果不配置resovler,在请求处理阶段,并不会去根据/etc/resolv.f解析域名)
    • 必须配置resolver:如果Nginx配置中使用了变量来存储需要解析的域名,并且这个域名在请求处理阶段被使用,那么通常需要在Nginx配置中显式地配置resolver指令,以指定用于解析域名的DNS服务器。
    • 系统默认行为可能不适用:虽然Nginx可能会依赖于系统默认的DNS解析设置,但在Nginx配置中明确指定resolver是更可靠和可控的做法。

3.2 问题说明

3.2.1 先看/etc/resolv.conf说明

在这里插入图片描述

3.2.2 针对第一个问题

如果是proxy_pass: http://serviceName:port,那么启动时默认情况会去根据/etc/resolv.conf的search字段拼接成serviceName.namespace.svc.cluster.local,然后根据这个域名去nameserver指定的域名服务器解析,解析到serviceName的ip地址,会进行缓存,后续访问就会使用,如ip1是:10.96.3.33
但是如果这个服务不存在,ip1就会拿不到,从而导致启动nginx失败。
报错:host not found in upstream “aaa” in /etc/nginx/nginx.conf:63
在这里插入图片描述

如果使用set指定域名,那么这个域名会到请求阶段才会解析

3.2.3 针对第二个问题

需要用到set自定义变量,请求时才解析域名,这里按理说只配置serviceName解析即可,(按照理解,默认会去根据/etc/resolv.conf解析),但是请求时并没有去解析/etc/resolv.conf,从而无法根据search自动补全,所以这里需要配置完整的路径serviceName.namespace.svc.cluster.local; 同时也需要指定resolver,去明确指定DNS服务器,否则会报错(no resolver defined to resolve throwbill.zj-ywxt-ns.svc.cluster.local
resolver kube-dns.kube-system.svc.cluster.local valid=120s;
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394291.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【二分查找】3143. 正方形中的最多点数

本文涉及的基础知识点 C二分查找 LeetCode3143. 正方形中的最多点数 给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。 如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴&…

【数据结构入门 】栈

目录 前言 一、栈的概念及结构 二、栈的实现 1. 栈的声明 2.初始化栈 3. 栈的销毁 4.判断是否为空栈 5.入栈(只能插入栈顶元素) 6. 出栈(只能从栈顶删除) 7.栈的大小 8.获取栈顶元素 总结 前言 在计算机科学中&#xf…

【MySQL 01】在 Ubuntu 22.04 环境下安装 MySQL

文章目录 🌈 1. 说明🌈 2. 卸载不必要的环境🌈 3. 安装 MySQL🌈 4. 启动和关闭 MySQL 服务🌈 5. 临时登录 MySQL🌈 6. 设置 MySQL 密码🌈 7. 配置 MySQL 🌈 1. 说明 在安装与卸载中…

Python面试宝典第29题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量…

Maven实战(五)- Nexus 私服安装与使用

Maven实战(五)- Nexus 私服安装与使用 文章目录 Maven实战(五)- Nexus 私服安装与使用1.安装Nexus1.1.下载安装包1.2.Nexus启动命令1.3.登陆Nexus 2.仓库与仓库组2.1.内置仓库2.2.仓库分类2.3.创建宿主仓库2.4.创建代理仓库2.5.创…

CSS基础知识day4

目录 1. 浮动 1.1 传统网页布局的三种方式 1.2 标准流(普通流/文档流) 1.3 为什么需要浮动? 1.4 什么是浮动? 1.5 浮动特性(重难点) 1.6 浮动元素经常和标准流父级搭配使用 2.常见网页布局 2.1 常…

WEB应用(十四)---文件上传

什么是文件上传漏洞 文件上传是Web应用的常见功能,允许用户上传图片、视频及其他文件类型文件。如果用户上传的是木马文件,则服务器就会收到攻击。 对于这个漏洞的练习有一个专门的靶场,即upload-labs,这个的安装可以在windows中使…

顺序表的实现【数据结构】

文章目录 1.线性表2.顺序表2.1 概念及结构 3.模拟实现3.1 准备工作3.2 顺序表的初始化与销毁3.3 顺序表的尾插3.4 顺序表的尾删3.5顺序表的打印3.6 顺序表的头插3.7 顺序表的头删3.8 顺序表查找3.9 顺序表在pos位置插入x3.10 顺序表删除pos位置的值 4.代码整合 1.线性表 线性表…

【Linux学习】深入理解软硬链接

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🎈软硬链接🐧软链接🐬硬链接 🐸总结软硬链接的原理🐍软硬链接的应用场景&…

观成科技:海莲花活跃木马KSRAT加密通信分析

概述 自2023年8月至今,海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信,每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密,而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”组…

DC系列靶场---DC 7靶场的渗透测试

DC-7渗透测试 信息收集 地址探测 使用arpscan对目标地址进行探测 arp-scan -l I eth0 得到目标主机IP地址为172.30.1.132 扫描端口 使用nmap对目标主机做端口扫描 nmap -sS -sV -T4 -p- -O 172.30.1.132 扫描到目标主机开启了80端口、22端口。 -sS Nmap的SYN扫描&…

mapbox-gl 实现房间面生成墙(借助jsts)

文章目录 一、前言 一、前言 当我们从室外放大到室内展示室内图层时,我们可能只有房间面的数据,这时要展示房间墙数据,就需要借助工具对房间面进行缓冲,但是数据变动时,我们还要再次进行一下缓冲区生成操作。下面是借…

Copy as cURL 字段含义

当前端在开发过程中,遇到接口错误反馈给后端人员时,一般在此接口处右键复制为cURL。 格式如下: curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…

1.4 C 程序的编译过程与 CLion 调试技巧

目录 1 程序的编译过程 1.1 编写源代码 1.2 预处理(Preprocessing) 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linking) 1.6 执行 2 编译过程的输入输出文件概览 …

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类,我们可以类中定义成员变量和成员函数,实现模块化封装,从而构建更加抽象和复杂的工程。 &…

基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MSER 4.2 HOG特征提取 4.3 SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2017b 3.部分核心程序 (完整版代码包含中…

CMU15445 (Fall 2023) Project 1 - Buffer Pool 思路分享

文章目录 写在前面Task 1 - LRU-K Replacement PolicyTask 2 - Disk SchedulerTask 3 - Buffer Pool ManagerNewPageFetchPageUnpinPageDeletePageFlushPage 写在最后 写在前面 操作系统为应用程序提供了默认的缓存机制,DBMS作为应用程序,为什么不使用默…

LSLM论文

解决的问题 现在的语音模型(SLM)增强了语音对话的能力,但都局限于回合制对话,在实时对话的情境下与用户交互的能力有所欠缺,例如:当生成的对话不满意时被打断。所以,这篇论文在实时的的语音语言…

ShardingSphere自定义分布式主键生成策略、自定义分片规则

文章目录 主键生成策略源码KeyGenerateAlgorithm源码入口实现扩展 自定义分布式主键生成策略 分片算法ShardingAlgorithm实现扩展 自定义分片算法踩的坑 主键生成策略源码 开发者手册 KeyGenerateAlgorithm 全限定类名org.apache.shardingsphere.sharding.spi.KeyGenerateAl…