容器服务 CoreDNS 升级常见错误和处理

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 中同时配置了 proxy 和 forward 插件。新版 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.19、183.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 服务器地址。也可确认风险后选择跳过。

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

预检项:Coredns_KubeProxy_IPVS_Timeout_Warning

说明:kube-proxy 使用 IPVS 模式时,–ipvs-udp-timeout 未设置或超过 10 秒,可能导致 DNS 解析间歇性超时。

解决方案:为 kube-proxy 配置启动参数 –ipvs-udp-timeout=10s,或确认风险后选择跳过。

21、无需处理的预检项

以下预检项通常无需用户操作:

预检项 说明
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,可跳过)。
赞 (0)
上一篇 4天前
下一篇 4天前