K3s pod 内部 resolv.conf 被覆盖导致 DNS 解析异常

发布时间 - 2026-01-18 00:00:00    点击率:
K3s覆盖/etc/resolv.conf是为启用CoreDNS+dnsmasq本地DNS代理,设nameserver 127.0.0.1,但基础镜像常无dnsmasq导致解析失败;需显式配置dnsPolicy或挂载自定义resolv.conf修复。

在 K3s 集群中,Pod 启动后 /etc/resolv.conf 被覆盖为仅含 nameserver 127.0.0.1(或指向 CoreDNS 的本地代理),但实际 CoreDNS 并未监听该地址,或 Pod 网络无法访问该地址,从而导致 DNS 解析失败。

为什么 K3s 会覆盖 resolv.conf?

K3s 默认使用 CoreDNS + dnsmasq 插件(通过 k3s-agent 内置的轻量 DNS 代理)提供集群 DNS 服务。它会自动将 Pod 的 resolv.conf 设置为:

  • nameserver 127.0.0.1(指向 Pod 内部的 dnsmasqcoredns 本地监听)
  • search .svc.cluster.local svc.cluster.local cluster.local
  • options ndots:5

但这个机制依赖两个前提:Pod 必须运行在支持 hostNetwork: false + dnsPolicy: ClusterFirst 的标准 CNI 网络下,且容器内需有 dnsmasq 或能响应 127.0.0.1:53 的 DNS 代理进程——而大多数基础镜像(如 Alpine、BusyBox、Distroless)并不自带,也**不会自动注入**。

常见触发场景

以下情况容易暴露该问题:

  • 使用 hostNetwork: true 的 Pod:K3s 不会注入 127.0.0.1,但可能仍覆盖原有 resolv.conf 为错误内容
  • 自定义镜像未安装 dnsmasqcoredns,却继承了 K3s 的默认 dnsPolicy
  • 使用 initContainer 或多阶段构建时,resolv.conf 被挂载覆盖或写入失败

  • K3s 版本升级后,dnsPolicy 行为变更(如 v1.25+ 对 hostNetwork Pod 的处理更严格)

快速修复方法

根据实际需求选择一种或组合使用:

  • 显式指定 DNS 配置:在 Pod spec 中设置 dnsPolicy: None 并手动提供 dnsConfig
  • 回退到集群 DNS:改用 dnsPolicy: ClusterFirstWithHostNet(仅限 hostNetwork: true 场景)
  • 跳过自动覆盖:挂载只读空文件覆盖 /etc/resolv.conf,例如:
    volumeMounts:
    - name: resolv-conf
      mountPath: /etc/resolv.conf
      readOnly: true
    volumes:
    - name: resolv-conf
      configMap:
        name: custom-resolv
    其中 custom-resolv 包含你期望的 nameserver 10.43.0.10(K3s CoreDNS ClusterIP)
  • 验证 CoreDNS 可达性:进入 Pod 执行 nslookup kubernetes.default.svc.cluster.local 10.43.0.10,确认 CoreDNS 是否正常响应

长期建议

避免“覆盖即生效”的隐式行为:

  • 所有生产 Pod 显式声明 dnsPolicy,不依赖默认值
  • 基础镜像中预装 dnsmasq(仅当需 127.0.0.1:53 代理)或统一使用 ClusterFirst + 10.43.0.10
  • 通过 kubectl get svc -n kube-system 确认 CoreDNS Service 的 ClusterIP(通常是 10.43.0.10),并在文档中标注为集群 DNS 地址
  • 若使用 hostNetwork,优先考虑 dnsPolicy: Default(复用宿主机 resolv.conf),并确保宿主机 DNS 可用


# ai  # dns  # kubernetes  # 为什么  # red  # 继承  # Namespace  # default  # 镜像  # 自定义  # 并在  # 自带  # 仅限  # 设置为  # 它会  # 跳过  # 退到  # 默认值 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 图册素材网站设计制作软件,图册的导出方式有几种?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  微信小程序 canvas开发实例及注意事项  中山网站推广排名,中山信息港登录入口?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何用VPS主机快速搭建个人网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  详解jQuery中的事件  如何构建满足综合性能需求的优质建站方案?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何在万网自助建站中设置域名及备案?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何快速生成高效建站系统源代码?  历史网站制作软件,华为如何找回被删除的网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  js实现获取鼠标当前的位置  如何在云虚拟主机上快速搭建个人网站?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在云指建站中生成FTP站点?  linux写shell需要注意的问题(必看)  如何在阿里云域名上完成建站全流程?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  昵图网官方站入口 昵图网素材图库官网入口  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  如何在新浪SAE免费搭建个人博客?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何快速搭建自助建站会员专属系统?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  如何在万网自助建站平台快速创建网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  实现点击下箭头变上箭头来回切换的两种方法【推荐】  香港服务器建站指南:免备案优势与SEO优化技巧全解析  java获取注册ip实例  如何在IIS中新建站点并解决端口绑定冲突?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Android 常见的图片加载框架详细介绍  iOS发送验证码倒计时应用  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程