更新时间:2025-05-21 GMT+08:00
如何解决CoreDNS使用废弃API问题?
问题描述
在CCE集群中,如果CoreDNS在1.19集群版本中启动,集群升级到1.25版本或1.27版本时,CoreDNS可能仍在监听v1beta1版本的EndpointSlice资源。由于v1beta1版本的EndpointSlice资源在CCE 1.25集群版本中被废弃,导致CoreDNS无法获取到最新的Service/Endpoint变更事件,导致以下影响:
- Service域名解析失败:使用Service进行服务发现的业务,新建的Service域名无法正常解析。
- Headless Service解析异常:使用Headless Service进行服务发现的业务,当工作负载变更后,Pod重建,CoreDNS无法解析到新的Pod IP地址,返回缓存中旧的Pod IP地址,影响业务访问。
根因分析
在CCE 1.19集群中,CoreDNS使用的是社区1.8.4版本,该版本CoreDNS在启动时会优先选择v1版本的EndpointSlice资源,如果不存在v1版本则会使用v1beta1版本的EndpointSlice资源,由于Kubernetes1.19版本中只有v1beta1版本的EndpointSlice资源,所以CoreDNS通过访问v1beta1版本的EndpointSlice资源获取Service/Endpoint变更事件。Kubernetes在1.25版本中移除了v1beta1版本的EndpointSlice API,所以当集群版本升级到1.25后,CoreDNS继续监听被移除的v1beta1版本的EndpointSlice资源,导致无法获取Service/Endpoint事件。
您可以查看CoreDNS日志,操作方式请参见容器日志查看方法,如果日志中出现以下告警,表明CoreDNS正在监听已废弃的API:
[ERROR] plugin/kubernetes: k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: Failed to watch *v1beta1.EndpointSlice: failed to list *v1beta1.EndpointSlice: the server could not find the requested resource [INFO] plugin/kubernetes: k8s.io/client-go@v0.26.1/tools/cache/reflector.go:169: failed to list *v1beta1.EndpointSlice: the server could not find the requested resource