DNS FAQ

本文介绍在ACK集群中DNS相关的常见问题及对应的解决方案。

为什么通过exec无法进入CoreDNS Pod?

问题现象

使用kubectl -n kube-system exec -it {coredns pod} bash及类似命令无法进入到CoreDNS Pod。

问题原因

CoreDNS所使用的容器镜像是基于Scratch构建,不具备Shell执行环境。

解决方案

可以使用nsenter的方式访问CoreDNS Pod所处的容器网络环境。具体操作,请参见检查CoreDNS Pod的网络连通性。如果您需要查看CoreDNS日志,可以启用CoreDNS日志分析与监控能力。具体操作,请参见分析和监控CoreDNS日志

为什么CoreDNS正在使用废弃的API?

问题现象

执行集群升级前置检查时,发现用户代理(UserAgent)为coredns的客户端正在访问已弃用的discovery.k8s.io/v1beta1Kubernetes API,其API路径为/apis/discovery.k8s.io/v1beta1

问题原因

CoreDNS使用discovery.k8s.io/v1beta1API连接到APIServer,但该API在您集群版本中即将弃用或已弃用。产生这种现象的原因有两种:

  • CoreDNS版本较低:当前集群安装的CoreDNS版本较低,不支持调用discovery.k8s.io/v1API,只能使用discovery.k8s.io/v1beta1API。

  • CoreDNS是在较早版本的Kubernetes中启动的:尽管Kubernetes和CoreDNS的版本都是最新的,但CoreDNS是在较早的Kubernetes版本(例如1.20版本)中启动,并在容器启动阶段选择了discovery.k8s.io/v1beta1API版本。然而,随着Kubernetes集群逐渐升级,discovery.k8s.io/v1beta1API被弃用,但CoreDNS仍然在使用它。

解决方案

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面对CoreDNS组件进行升级操作。

    如果页面提示不可升级,请执行下一步,否则执行步骤3。关于如何升级组件,请参见管理组件

  4. 使用kubectl执行如下命令,重启CoreDNS。

    kubectl -n kube-system rollout restart deployment coredns
    重要

    请注意重启过程中可能存在小概率解析异常的问题。更多信息,请参见避免IPVS缺陷导致的DNS概率性解析超时问题

  5. CoreDNS升级或重启成功后,使用kubectl执行如下命令,确认CoreDNS Pod的状态。

    kubectl -n kube-system get pod -l k8s-app=kube-dns

    如果CoreDNS Pod刚刚重建并处于Running状态,您可忽略集群升级前置检查页面中由CoreDNS产生的废弃API调用记录,继续对集群进行升级。

CoreDNS日志中报错,显示dns: buffer size too small

问题现象

使用kubectl -n kube-system logs {coredns pod} 命令查看CoreDNS Pod日志时,提示dns: buffer size too small

问题原因

由于CoreDNS的默认缓冲区大小(bufsize)为1232字节,所以Kubernetes Pod的DNS查询的UDP数据包最大只能为1232字节。如果某个DNS请求的响应超过了这个限制,DNS解析则会失败,无法获取该请求的结果。在Pod中进行某些DNS查询,尤其是当请求的响应数据较大时,可能会受到影响,详情请参见issue

解决方案

升级CoreDNS版本至v1.7.1及以上。对于CoreDNS版本低于v1.7.1,可使用kubectl edit cm -n kube-system coredns 配置CoreDNS的bufsize大小,该值取值范围为[512, 4096]之间。更多信息,请参见CoreDNS社区文档

. {
    bufsize 1220
    log
}