文档中心>容器服务>故障处理>CoreDNS 升级常见错误和处理

CoreDNS 升级常见错误和处理

最近更新时间:2026-04-14 14:11:44

我的收藏
CoreDNS 组件升级前,平台会自动执行预检,检测可能影响升级的配置问题。预检结果分为两个级别:
Fatal:阻断升级,必须处理后才能继续。
Warning:不阻断升级,建议处理;如确认无影响,可在升级时勾选“跳过 Warning”。
以下按需要修改的对象分类,说明各预检项的含义和处理方法。

Corefile 配置相关

以下预检项需要修改 CoreDNS 的 Corefile 配置。操作方式:
kubectl edit configmap coredns -n kube-system

1. Corefile 不存在(Fatal)

预检项Coredns_Corefile_Not_Exist
说明:CoreDNS ConfigMap 中缺少 Corefile 配置项,升级无法继续。
解决方案:确认 kube-system 命名空间下存在名为 coredns 的 ConfigMap,且包含 Corefile 字段。如缺失,需手动补充标准 Corefile 配置。

2. Corefile 语法错误(Fatal)

预检项CoreDNS_Corefile_Format_Error
说明:Corefile 内容存在语法错误,无法被正确解析。
解决方案:检查 Corefile 语法,常见问题包括花括号不匹配、缩进错误、指令拼写错误等。

3. 缺少 health 插件(Fatal)

预检项Coredns_Plugin_Health_Not_Exist
说明:Corefile 中未配置 health 插件。CoreDNS 需要通过 health 插件提供健康检查端点,缺失会导致升级后 Pod 存活检查失败而被反复重启。
解决方案:在 Corefile 的 server block 中添加 health 插件:
.:53 {
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
...
}
forward . /etc/resolv.conf
...
}

4. proxy 和 forward 插件共存(Fatal)

预检项Coredns_Plugin_Proxy_Forward_Coexist
说明:同一个 server block 中同时配置了 proxyforward 插件。新版 CoreDNS 已移除 proxy 插件,两者不能共存。
解决方案:删除 proxy 配置,统一使用 forward
.:53 {
- proxy . /etc/resolv.conf
+ forward . /etc/resolv.conf
}

5. rewrite 插件兼容性问题(Fatal)

预检项Coredns_Plugin_Rewrite_Compatibility_Issues
说明:升级到 1.8.4 版本时,rewrite 插件的语法发生了不兼容变更,当前配置需要调整。
解决方案:根据 CoreDNS 1.8.4 版本的 rewrite 语法要求调整配置,主要变化涉及参数顺序和关键字,请参考 CoreDNS rewrite 插件文档

6. 上游 DNS 包含不可达地址(Fatal)

预检项Coredns_Plugin_Forward_Bad_Resolve_On_Node
说明:CoreDNS 的上游 DNS 地址中包含 127.0.0.53。该地址是部分 Ubuntu 系统的本地 DNS 代理地址,在容器环境中不可达,会导致 DNS 转发失败。该地址可能来自 Corefile 中直接配置的上游,也可能来自节点 /etc/resolv.conf(当 Corefile 配置 forward . /etc/resolv.conf 时)。
解决方案:在 Corefile 中将上游 DNS 改为显式指定可达的 DNS 服务器地址:
.:53 {
- forward . /etc/resolv.conf
+ forward . 183.60.83.19 183.60.82.98
}
其中 183.60.83.19183.60.82.98 为腾讯云公共 DNS 服务地址,也可替换为业务自有的 DNS 服务器。

7. 上游 DNS 不支持 EDNS(Fatal)

预检项Coredns_Plugin_Forward_Upstream_Error
说明:CoreDNS 配置的上游 DNS 服务器不支持 EDNS(DNS 扩展机制)。新版 CoreDNS 默认启用 EDNS,转发到不支持 EDNS 的上游会导致解析异常。
解决方案:在 Corefile 中将上游 DNS 改为支持 EDNS 的服务器:
.:53 {
- forward . /etc/resolv.conf
+ forward . 183.60.83.19 183.60.82.98
}

8. health 插件 lameduck 超时过长(Warning)

预检项Coredns_Plugin_Health_LameDuck_Error
说明health 插件的 lameduck 参数超过 30 秒,可能导致滚动更新时旧 Pod 退出缓慢,拖长升级耗时。
解决方案:将 lameduck 调整为 30 秒以内:
health {
lameduck 15s
}


Deployment 配置相关

以下预检项需要修改 CoreDNS 的 Deployment 配置。操作方式:
kubectl edit deployment coredns -n kube-system

1. 容器名称不标准(Fatal)

预检项Coredns_Container_Not_Standard
说明:CoreDNS Deployment 中不存在名为 coredns 的容器。平台通过该名称定位需要更新的容器,名称不匹配将无法执行升级。
解决方案:将 CoreDNS 容器的 name 字段修改为 coredns

2. 存活探针配置不一致(Fatal)

预检项Coredns_LivenessProbe_Inconsistent
说明:Deployment 中 LivenessProbe 的配置(端口、路径或协议)与 Corefile 中 health 插件的实际监听地址不匹配,会导致健康检查持续失败,Pod 被反复重启。
解决方案:修改 Deployment 的 LivenessProbe,确保与 Corefile 中 health 插件的端口一致(默认 8080):
livenessProbe:
httpGet:
path: /health
port: 8080
scheme: HTTP

3. 就绪探针配置不一致(Fatal)

预检项Coredns_ReadinessProbe_Inconsistent
说明:Deployment 中 ReadinessProbe 的配置与 Corefile 中 ready 插件的实际监听地址不匹配。
解决方案:修改 Deployment 的 ReadinessProbe,确保与 Corefile 中 ready 插件的端口一致(默认 8181):
readinessProbe:
httpGet:
path: /ready
port: 8181
scheme: HTTP


集群环境与组件相关

以下预检项涉及集群节点、Kubernetes 版本或 kube-proxy 组件等集群层面的配置。

1. 可调度节点不足(Fatal)

预检项CoreDNS_Insufficient_Cluster_Resources
说明:集群中可调度节点数量不足(少于 2 个),无法保证升级过程中 CoreDNS 服务的连续性。如果集群包含超级节点(弹性容器),此项自动通过。
解决方案
添加新节点到集群。
解除已有节点的调度封锁:kubectl uncordon <node-name>

2. 版本不兼容(Fatal)

预检项Coredns_Incompatible_Version
说明:目标 CoreDNS 版本与当前集群环境存在兼容性约束:
约束条件
说明
CoreDNS ≥ 1.10.1
要求 Kubernetes 版本 ≥ 1.22.4
CoreDNS ≥ 1.11.0
不支持 Docker 作为容器运行时,需使用 containerd
解决方案
Kubernetes 版本过低:先升级集群版本
容器运行时不兼容:将运行时从 Docker 切换为 containerd

3. 非标准版本(Fatal)

预检项Coredns_Non-standard_Version
说明:当前 CoreDNS 版本或目标版本不在平台支持的升级路径中。
平台支持的版本升级路径:
当前版本
可升级到
1.2.2
1.6.2
1.6.2
1.8.4、1.11.1、1.11.1-tke.1
1.7.0
1.8.4、1.11.1、1.11.1-tke.1
1.8.4
1.11.1、1.11.1-tke.1
1.8.5
1.11.1、1.11.1-tke.1
1.11.1
1.11.1-tke.1
跨多个版本时,平台会自动分步执行(例如 1.2.2 → 1.11.1 会依次经过 1.2.2 → 1.6.2 → 1.11.1)。
解决方案:如当前版本不在上述列表中,需先手动将 CoreDNS 镜像版本调整到支持的版本。

4. iptables 后端冲突(Fatal)

预检项Coredns_KubeProxy_Iptables_Backend_Warning
说明:集群节点上同时存在 iptables-nft 和 iptables-legacy 两种后端的规则,会导致 Service 流量异常,可能影响 DNS 解析。
解决方案:将 kube-proxy 升级到已修复此问题的版本:
Kubernetes 版本
最低修复版本
1.14.x
v1.14.3-tke.33-rc2
1.16.x
v1.16.3-tke.42-rc2
1.18.x
v1.18.4-tke.49-rc1
1.20.x
v1.20.6-tke.52
1.22.x
v1.22.5-tke.33
1.24.x
v1.24.4-tke.24
≥ 1.26
所有版本已修复

5. 节点 DNS 配置不一致(Warning)

预检项Coredns_Plugin_Forward_Upstream_Inconsistent_Each_Node
说明:集群各节点的 /etc/resolv.conf 中 nameserver 配置不一致。当 Corefile 配置 forward . /etc/resolv.conf 时,CoreDNS 在不同节点上的转发行为可能不同。
解决方案:统一各节点的 /etc/resolv.conf 配置,或在 Corefile 中显式指定 DNS 服务器地址。也可确认风险后选择跳过。

6. IPVS UDP 超时设置不合理(Warning)

预检项Coredns_KubeProxy_IPVS_Timeout_Warning
说明:kube-proxy 使用 IPVS 模式时,--ipvs-udp-timeout 未设置或超过 10 秒,可能导致 DNS 解析间歇性超时。
解决方案:为 kube-proxy 配置启动参数 --ipvs-udp-timeout=10s,或确认风险后选择跳过。

无需处理的预检项

以下预检项通常无需用户操作:
预检项
说明
Coredns_Cluster_Status
集群状态异常(非 Running),等待集群恢复后重试即可。
Coredns_Cluster_APIServer
平台无法连接集群 API Server,通常为平台侧问题,如持续出现请提交工单。
CoreDNS_Already_Update
当前版本与目标版本一致,无需升级。
Coredns_KubeProxy_Binary_Warning
kube-proxy 为二进制部署,平台无法自动检查其配置,建议人工确认(Warning,可跳过)。
Coredns_Plugin_Forward_Upstream_Not_Subset_Metrics
CoreDNS 监控指标中出现非预期的上游 DNS 地址,通常为历史残留,一般无影响(Warning,可跳过)。