问题影响
在 TKE 集群中,如果 CoreDNS 启动时间较早,集群升级到 1.26 后,CoreDNS 可能仍在监听已废弃的 v1beta1 版 EndpointSlice 资源。由于该资源在 Kubernetes 1.26 版本中被移除,导致无法获取到最新的 Service/Endpoint 变更事件,对业务造成以下影响:
Service 域名解析失败:使用 Service 进行服务发现的业务,新建的 Service 域名无法正常解析。
Headless Service 解析异常:使用 Headless Service 进行服务发现的业务,当工作负载发生变更后,Headless Service 域名不会解析到最新的 Pod IP 地址,影响现有业务的正常访问。
潜在问题场景
1. 从 1.20 版本集群升级到 1.26 版本:创建 1.20 版本的集群后,将集群控制面逐步升级到 1.26。
2. CoreDNS 在 1.20 版本集群中重启或扩容后升级:在集群处于 1.20 版本时,CoreDNS 发生重启或扩容,然后将集群控制面升级到 1.26。
问题原因
在 TKE 1.20 版本的集群中,CoreDNS 使用的是 1.8.4 版本,该版本监听的是 EndpointSlice (v1beta1) 资源。由于 Kubernetes 在 1.25 版本中移除了 EndpointSlice(v1beta1) API,当集群升级到 1.26 后,CoreDNS 仍继续监听已被移除的资源,导致无法获取 Service/Endpoint 的最新事件。
当集群运行在 1.22、1.24 版本时,CoreDNS 的日志中会出现以下警告,表明 CoreDNS 正在监听已废弃的 API:
W0703 06:28:15.718073 1 warnings.go:70] discovery.k8s.io/v1beta1 EndpointSlice is deprecated in v1.21+, unavailable in v1.25+; use discovery.k8s.io/v1 EndpointSlice
CoreDNS 滚动更新的注意事项
发布前,注意检查集群相关配置。
确保集群中可调度节点数量大于 CoreDNS 的实例数。默认情况下,CoreDNS 有两个实例,请确保在重启 CoreDNS 前,保证集群至少有三个调用资源充足的节点。
当集群 kubeproxy 处于 ipvs 模式下时,内核默认打开会话保持特性,这会导致在 CoreDNS 升级或重启期间,业务侧的 DNS 解析请求,在5分钟(300s)内概率性超时。如果业务自身没有 UDP 服务,可以降低 IPVS UDP 协议的会话保持超时时间,以此来减少解析超时的持续时间。详情请参见 配置 CoreDNS 平滑升级。
发布前,注意 corefile 配置。
health 插件配置。lameduck 时间配置不要大于30秒。
forward 插件配置。如果 forward 到 /etc/resolv.conf,要注意是否修改过集群节点的 /etc/resolv.conf 内容。如果集群内节点的 /etc/resolv.conf 不一致,在 CoreDNS 重启漂移到其他节点后,导致 CoreDNS 的 DNS 上游地址出现变化。
发布后,注意 CoreDNS 的 Pod 状态。
确认所有 CoreDNS 的 Pod 都滚动更新完成,状态都是 Ready 的,没有 PENDING 状态的 Pod。
如果 Pod 处于 PENDING 状态,检查 Event 信息,解决因资源不足或节点污点等各种原因,导致新的 CoreDNS 无法启动的问题。
修复方案
重建 CoreDNS,让 CoreDNS 监听
EndpointSlices (v1)
资源。针对 TKE 集群,当 kube-proxy 是 iptables 模式时,可以通过重新部署 CoreDNS,触发 CoreDNS 滚动更新修复问题。操作步骤如下:
1.1 选择集群 > 工作负载 > Deployment,在 kube-system ns 下选择 coredns,单击设置更新策略。如下图所示:
配置更新策略如下:
1.2 单击重新部署。如下图所示:
若希望 CoreDNS 实现平滑升级,避免域名解析超时或尽量减少服务不可用时间,可以参考以下步骤:
配置 CoreDNS 平滑升级:请参见 配置 CoreDNS 平滑升级 进行详细配置。
执行滚动更新:按照文档指引,完成配置后,对 CoreDNS 进行滚动更新。
CoreDNS 重启之后,可以观察 Pod 内的日志信息,日志中不会再出现使用废弃 API 的警告日志。
针对 TKE Serverless 集群,操作步骤如下:
1. 选择集群 > 工作负载 > Deployment,在 kube-system ns 下选择 coredns,单击设置更新策略。如下图所示:
配置更新策略如下:
2. 单击重新部署。如下图所示:
结语
通过上述步骤,可以有效解决 CoreDNS 使用废弃 API 导致的服务发现问题,确保业务的正常运行。如有任何疑问或需要协助,请及时联系腾讯云客服或技术支持。