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

相关文章

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决