Kubernetes CoreDNS 无法解析外网域名的问题

2024-09-04 19:28

本文主要是介绍Kubernetes CoreDNS 无法解析外网域名的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

k8s master机器环境
  • 宿主机resolv.conf
# cat /etc/resolv.conf
nameserver 172.16.100.1
  • pod中的resolv.conf文件如下
$ cat /etc/resolv.conf    
# Generated by NetworkManager
nameserver 10.96.0.10        # 此ip为coredns的IP地址 
排查过程

当pod需要解析一个域名时,如果域名是k8s集群内部的pod,那么coredns就会返回ip信息,至此解析结束,那如果是公网的域名呢?

比如说是www.baidu.com,那么此时coredns根据它自己的配置是无法解析的,怎么办呢?在coredns容器启动时,它会将宿主机的/etc/resolv.conf文件挂载到自己内部使用,也就是说coredns的/etc/resolv.conf文件和宿主机的是一致的,然后通过此文件指定的nameserver进行解析外网域名。

# kubectl get pod -n kube-system     # 获取到coredns-name
# kubectl edit coredns-name -n kube-system   # 查看coredns的yaml文件内容

我在coredns的yml文件中,看到了它的volumes挂载了一个名为coredns的configmap,然后使用下面的指令去查看了下这个configmap,如下:

[root@k8s-master-001 sysctl.d]# kubectl describe configmap/coredns -n kube-system
Name:         coredns  
Namespace:    kube-system  
Labels:       <none>  
Annotations:  <none>Data  
====
Corefile:  
----
.:53 {errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpattl 30}prometheus :9153forward . /etc/resolv.conf {max_concurrent 1000}cache 30loopreloadloadbalance
}

关于上面configmap的解释如下:

  • errors: 输出错误信息到控制台。
  • health:CoreDNS 进行监控检测,检测地址为 http://localhost:8080/health 如果状态为不健康则让 Pod 进行重启。
  • ready: 全部插件已经加载完成时,将通过 endpoints 在 8081 端口返回 HTTP 状态 200。
  • kubernetes:CoreDNS 将根据 Kubernetes 服务和 pod 的 IP 回复 DNS 查询。
  • prometheus:是否开启 CoreDNS Metrics 信息接口,如果配置则开启,接口地址为 http://localhost:9153/metrics
  • forward:任何不在Kubernetes 集群内的域名查询将被转发到预定义的解析器 (/etc/resolv.conf)。
  • cache:启用缓存,30 秒 TTL。
  • loop:检测简单的转发循环,如果找到循环则停止 CoreDNS 进程。
  • reload:监听 CoreDNS 配置,如果配置发生变化则重新加载配置。
  • loadbalance:DNS 负载均衡器,默认 round_robin。

好,我的注意点落在了loadbalance这个配置上,然后在宿主机上,使用dig指令,/etc/resolv.conf文件中的三个nameserver分别解析我们的公网域名。发现后面两个nameserver是无法解析我们的公网域名的,然后啥也不说了,把宿主机上的/etc/resolv.conf文件中指定的两个内网dns服务器干掉,就剩下一个114.114.114.114,然后删除coredns这个pod的(然后它会自动重启新的pod,相当于重启coredns了),再次进入应用pod中多次解析验证,问题解决,ok。

问题总结

宿主机本地的/etc/resolv.conf文件中有两个nameserver是指定的内网的dns,这两个dns解析不到公网域名,coredns又是以轮询的方式去找那几个nameserver的,解析记录的缓存是30s(也就是说,如果你解析到了,那么未来30s的解析都是成功的),30s后再解析,解析请求就会落到那两个内网dns服务器上,所以就出现了我这种情况

-------------------------------------------------------------------------------------------------------------------------------- 

经过上面的 ping 测试和 nslookup 测试,分析发现 k8s 集群内部 pod 解析外部域名,先走 coredns 内部域名解析,再走局域网 dns 解析。而无法解析的时候问题原因是:coredns 解析就返回报错了,定位问题为 coredns 解析外部域名存在问题。

网上查看问题,发现可能是 coredns 解析问题导致

  • 查看 coredns 的配置文件如下
apiVersion: v1
data:Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpa}prometheus :9153forward . /etc/resolv.conf cache 30reloadloadbalance}
kind: ConfigMap
metadata:name: corednsnamespace: kube-system
其中 forward . /etc/resolv.conf 配置表示使用当coredns内部不能解析的时候,向宿主机上的resolv.conf文件中配置的nameserver转发dns解析请求,当宿主机上namserver有多个时,默认采用的时random的方式随机转发,失败后就返回错误。
  • 宿主机 /etc/resolv.conf
$ cat /etc/resolv.conf# Generated by NetworkManager
nameserver 172.16.0.50
nameserver 114.114.114.114
  • 将其 forward 的 policy 设置为 sequential
        forward . /etc/resolv.conf {max_concurrent 1000   # 新增配置policy sequential     # 新增配置}

解决方案

  • 编辑 coredns 配置文件,修改配置,并重启 POD
$ kubectl -n kube-system edit cm corednsapiVersion: v1
data:Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpa}prometheus :9153forward . /etc/resolv.conf {max_concurrent 1000   # 新增配置policy sequential     # 新增配置}cache 30reloadloadbalance}
kind: ConfigMap
metadata:name: corednsnamespace: kube-system$ kubectl -n kube-system delete pods coredns-xxxxxx

----------------------------------------------------------------------------------------------------------------------

自己排查如下:

[root@k8s-pre-m01 ~]# kubectl logs coredns-7f8ff9c97-6tlln  -n kube-system -f
.:53
[INFO] plugin/reload: Running configuration SHA512 = 676a3d7c6fa16eff8b618d85b13f15775f15fabfbb23dbec6f9beecc102ad51e0663f9f30fd8b93736d0e9564d8e452bd51d530094547764b7e5fab04763519d
CoreDNS-1.9.3
linux/amd64, go1.18.2, 45b0a11
[ERROR] plugin/errors: 2 jmenv.tbsite.net. AAAA: read udp 10.196.129.208:42449->10.196.17.210:53: i/o timeout
failed to create fsnotify watcher: too many open files[root@k8s-pre-m01 ~]# kubectl logs coredns-7f8ff9c97-wqmw8     -n kube-system -f
.:53
[INFO] plugin/reload: Running configuration SHA512 = 676a3d7c6fa16eff8b618d85b13f15775f15fabfbb23dbec6f9beecc102ad51e0663f9f30fd8b93736d0e9564d8e452bd51d530094547764b7e5fab04763519d
CoreDNS-1.9.3
linux/amd64, go1.18.2, 45b0a11master节点和node节点对dns的访问权限是不一样的,master和node在不同网段,对10.196.17.210访问结果不一样,如果coredns调度在master上面,那么coredns就报错,如果是node节点正常。[root@k8s-pre-m01 ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.196.17.210[root@k8s-pre-n02 ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.196.17.210

这篇关于Kubernetes CoreDNS 无法解析外网域名的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136815

相关文章

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤