k8s core-dns 解析域名异常

本文档详细描述了在混合云环境中,K8s pod 无法解析内部DNS域名的问题及其解决步骤。问题分为两种情况:一是pod始终无法解析,解决方法是删除并重新创建coredns pod;二是域名偶尔无法解析,通过修改coredns的forward策略为sequential并调整resolv.conf顺序解决。此外,还提到了k8s内部service DNS解析失败的常见排查方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

我司使用的是混合云,云上环境k8s中处理数据的pod不能正常解析公司内部存储的dns域名,从而导致数据处理程序失败,但是core-dns所在的pod上市能解析该域名的。

分析

1. 域名完全不能解析

查看coredns的配置文件如下

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system

其中 forward . /etc/resolv.conf 配置表示使用当coredns内部不能解析的时候,向宿主机上的resolv.conf文件中配置的nameserver转发dns解析请求,当宿主机上namserver有多个时,默认采用的时random的方式随机转发,失败后就返回错误。

查看数据处理容器中的resolv.conf文件,确认对应的nameserver是指向core-dns对应的service的,对应的core-dns的日志显示正常,没有看到异常信息。由此可以推断coredns在该节点上启动的时候该节点上的resolv文件中还没有能解析指定存储域名的nameserver,应该是后续人为手动加上的,找相关的运维人员确认,确实是后续加上的,所以解决方式是删除coredns的pod,让其在该node上重建,测试dns的解析是正常的,但是多尝试几次发现会出现不能解析的情况。

2. 域名完全偶尔不能解析
在问题一中我们说了当宿主机上namserver有多个时,coredns内部默认采用的时random的方式随机转发,失败后就返回错误。由于是在云上的环境,我们添加上公司的nameserver后,云环境自己也有对于的nameserver在resolv.conf文件中配置,导致coredns在转发的时候,random方式选择到云环境自己的dns nameserver的时候,就解析不了我们内部使用的存储的域名,所以解决方式是修改resolv.conf文件,将我们自己的nameserver添加到宿主机resolv.conf第一个nameserver,然后修改coredns配置,将其forward的policy设置为sequential,然后重建coredns的pod,常见的coredns的forward插件的配置请参考coredns forward plugin,修改后的配置文件如下

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
           policy sequential
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system

至此,dns解析的问题解决,通常k8s使用dns的时候,还会出现k8s集群内部的service (DNS A或者AAAA记录)解析失败的问题,通常可以查看coredns的的kubernetes的插件是否配置正确,通常一些云环境默认的kubrenetes的插件配置可能不能正常work,可以参考core dns kubernetes plugin的文档进行相关配置的修改来解决相关问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值