当前位置: 首页 > news >正文

【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;
在这里插入图片描述

相关文章:

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

文章目录 1. 问题2.解决办法3.扩展说明3.1 DNS解析阶段划分3.2 问题说明3.2.1 先看/etc/resolv.conf说明3.2.2 针对第一个问题3.2.3 针对第二个问题 【后端】NginxluaOpenResty高性能实践 参考: https://blog.csdn.net/u010837612/article/details/123275026 1. 问…...

LeetCode637 二叉树的层平均值

前言 题目: 637. 二叉树的层平均值 文档: 代码随想录——二叉树的层平均值 编程语言: C 解题状态: 求取平均值的时候出现了点问题 思路 C中,浮点数的相加会产生精度误差,求取平均值时最好只在最后一步进行…...

王学岗ASM

服务发现 package com.example.testasm;import android.content.Context; import android.os.Bundle;import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat;…...

【数据结构】—— 队列

1、队列的概念2、队列的结构如何选择合适的数据结构实现队列(数组or链表) 3、队列的链式存储3.1 队列的链式存储结构3.2 队列的常见接口3.3 队列的接口实现初始化判空入队列出队列获取队头元素获取队尾元素获取节点个数销毁 3.4 源代码 4、队列的顺序存储…...

vue中openlayers过滤高亮显示某个图层

vue中openlayers过滤高亮显示某个图层 openlayers库没有直接支持这样设置,所以可以使用库:ol-ext,地址:https://viglino.github.io/ol-ext/examples/filter/map.filter.crop.html 效果: 关键代码: /**…...

WPF篇(11)-ToolTip控件(提示工具)+Popup弹出窗口

ToolTip控件 ToolTip控件继承于ContentControl,它不能有逻辑或视觉父级,意思是说它不能以控件的形式实例化,它必须依附于某个控件。因为它的功能被设计成提示信息,当鼠标移动到某个控件上方时,悬停一会儿,…...

【mysql 第一篇章】系统和数据库的交互方法

一、宏观的查看系统怎么和数据库交互 在我们刚刚接触系统和数据库的时候不明白其中的原理,只知道系统和数据库是需要交互的。所以我们会理解成上图的形式。 二、MYSQL 驱动 随着我们的学习时间的加长以及对程序的了解,发现链接数据库是需要有别的工具辅…...

数据结构-位运算总结

位运算总结: 1.求位1的个数 191. 位1的个数 - 力扣(LeetCode) 有两种写法: 1.是把该数不断的去与0x1相与,得到该数的最后一位的值,然后判断他是不是1,再把该数更新一下整体往后移动一位也就…...

java 异常堆栈的由来

编写的程序代码内部错误产生的异常,如调用对象为空(空指针异常)、数组越界异常、除0异常等。这种通常称为未检查的异常(Runtime异常子类),在虚拟机中执行时会集中处理这些异常。其他运行中异常,通过throw语句主动抛出的…...

【推荐系统】【多任务学习】Progressive Layered Extraction (PLE)

Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations 文章目录 Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations1 论文出处2 背景2.1 背景介…...

java -转win32/win64免安装jre环境运行

由于java 转为exe,只能在装有JDK环境的电脑运行, 发给其他人也不能运行,缺少环境,程序自己背着jre走 1.先打好jar 包 2.使用exe4j 把jar包转成exe 运行程序 3.使用inno stup ,把exe运行程序加上jre环境 以下是具体实现…...

算法板子:容斥原理——求出 1∼n 中能被质数 p1,p2,…,pm 中的至少一个数整除的整数有多少个

1. 题目要点 1. 设:求1~10中能被质数2和3中至少一个数整除的数有多少个。1~10中能被质数2整除的数的集合记为S1{2,4,6,8,10},能被质数3整除的数的集合记为S2{3,6,9},能同时被质数2和3整数的数的集合为S1∩S2{6} 2. 这道题的目的是求S1∪S2∪S…...

用gurobipy求解带不等式约束条件的优化问题

1. 引入 在当今的数据驱动世界中,优化问题无处不在,从工程设计到经济模型,再到机器学习算法的调参,优化都是实现效率最大化、成本最小化或性能最优化的关键工具。 这里有一个典型的数学优化问题,目标是在给定的约束条…...

漏洞复现-Adobe ColdFusion 远程代码执行漏洞(CVE-2023-38203)

1.漏洞描述 Adobe ColdFusion是一种服务器端的Web应用开发平台。它由Adobe Systems开发,用于创建动态的、交互式的Web应用程序和网站。 Adobe ColdFusion在2018u17及之前版本、2021u7及之前版本和2023u1及之前版本中存在任意代码执行漏洞。该漏洞是由于反序列化不…...

Spring-MyBatis整合:No qualifying bean of type ‘XXX‘ available: ...

1.看一下核心配置中有没有导入myBatis配置 2.看一下service和dao有没有相应注解 3.看一下MyBatisConfig中有没有对sqlSessionFactory和mapperScannerConfigurer注释成bean对象以及有没有配置映射文件路径...

gitea docker 快捷安装部署

前言 在前一篇博文(什么是 Gitea?)中,我们详细介绍了gitea的功能特性,以及其与其它git服务器之间的特性多维度对比。 在本文中,我们将详细介绍gitea的快捷安装部署,docker方式! 1…...

CLAMP-1

一、信息收集 1、主机发现 nmap 192.168.236.0/24 2、端口扫描 nmap 192.168.236.173 -p- -A 3、目录扫描 dirb http://192.168.236.173 二、漏洞探测 访问80端口 访问 /nt4stopc/ 下面有一些问题,提示必须收集答案 都是一些判断题,对与错对应1与0&…...

Blender的Python编程介绍

在Blender这个免费的开源3D设计软件中,最值得称道的一点是可以用Python程序来辅助进行3D设计,我们可以通过Python来调整物体的属性,生成新的物体,甚至生成新的动画等等。 在最近的一个项目中,我用Blender制作了一个动…...

树莓派4/5:运行Yolov5n模型(文末附镜像文件)

〇、前言 因国内网络问题,可直接烧录文末镜像文件,或者按照本教程进行手动操作。 一、实验目的 在树莓派4B运行Yolov5n模型。 二、实验条件 1、Windows 11计算机:安装了Mobaxterm 2、树莓派4B:64Bit Lite OS,安装了…...

【学习笔记】Day 9

一、进度概述 1、inversionnet_train 试运行——成功 二、详情 1、inversionnet_train 试运行 在经历了昨天的事故后,今天最终成功运行了 inversionnet_train,运行结果如下: 经观察,最开始 loss 值大概为 0.5 左右 随着训练量的增…...

Linux网络案例

网络配置基础 WIN10上安装虚拟机,虚拟机里安装CENTOS6.5。 1)网络配置的步骤 (1)CENTOS6.5C网络设置: su root //切换root用户 cd /etc/sysconfig/network-scripts //进入网卡配置文件所在目录 vi ifcfg-eth0 //修改网卡配置文件 …...

苹果离线打包机配置和打包

1、虚拟机安装 macOS虚拟机安装全过程(VMware)-腾讯云开发者社区-腾讯云 给 windows 虚拟机装个 mac 雪之梦 1、安装苹果镜像 去网上下载,打包机的镜像要和自己mac电脑上的保持一致。 同时打包机的用户名也需要和自己的mac保持一致。 2、…...

【C++ Primer Plus】学习笔记 5【指针 下】

文章目录 前言一、指针1.使用new创建动态结构例子:使用new和delete 2.自动存储、静态存储和动态存储1.自动存储2.静态存储3.动态存储 总结 前言 依旧是指针部分ヾ(◍∇◍)ノ゙ 一、指针 1.使用new创建动态结构 将new用于结构由两步组成:创建…...

Phpstorm实现本地SSH开发远程机器(或虚拟机)项目

适用场景: 1、windows系统想要运行仅支持linux、mac系统的项目,可将项目运行在本地虚拟机,但是在虚拟机里使用vim编辑很麻烦,如何实现在本地用Phpstorm来编辑虚拟机中的代码? 下面的说明都是以本地虚拟机为例&#xff…...

API 的多分支管理,让 Apifox 帮你轻松搞定!

在产品迭代的过程中,对 API 的更新和维护是必然的,也是至关重要的。当产品需要引入新功能或对现有功能进行调整时,相应的 API 往往也需要进行升级或修改,这种情况在快速迭代的产品中很是常见。 然而,API 的迭代更新并非…...

线上预约陪诊平台医院陪诊系统源码就医陪护小程序APP开发

项目分析 随着医疗行业的数字化转型和人们对健康需求的日益增长,线上预约陪诊系统作为一种新兴的医疗服务模式,正逐渐受到市场的关注和认可。本文将从市场前景、使用人群、盈利模式以及竞品分析等多个角度,全面探讨线上预约陪诊系统的技术性…...

240806-在Linux/RHEL开机中自动启动bash脚本

A. 常规方法 要在Red Hat Enterprise Linux (RHEL) 中设置开机启动的bash脚本,可以使用以下方法之一: 方法1:使用/etc/rc.d/rc.local 打开/etc/rc.d/rc.local文件: sudo vi /etc/rc.d/rc.local在文件末尾添加你想要执行的bash脚…...

【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁

文章目录 乐观锁和悲观锁重量级锁和轻量级锁挂起等待锁和自旋锁公平锁和非公平锁可重入锁和不可重入锁读写锁相关面试题 锁:非常广义的概念,不是指某个具体的锁,所有的锁都可以往这些策略中套 synchronized:只是市面上五花八门的锁…...

31_逻辑漏洞、水平垂直越权、垂直越权漏洞测试、水平越权

概述 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。 一般越权漏洞容易出现在权限页面(需要登录的页面&#xff0…...

css写一个按钮流光动画效果

规则说明 按钮实现一个简易的流光动画 streamer.css.pay_button{width: 281*2px;height: 104px;border-radius: 80px;color: rgba(255, 255, 255, 1);background: linear-gradient(90deg, #FFA023 0%, #FF2B87 100%);margin-bottom: 20px;font-size: 32px;position: relative;o…...