文档首页/ 云容器引擎 CCE/ 常见问题/ 域名DNS/ 如何解决CoreDNS使用废弃API问题?
更新时间: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

解决方案

重启CoreDNS Pod,让CoreDNS监听v1版本的EndpointSlice资源。

重启CoreDNS Pod可能会对集群内的域名解析服务造成短暂的波动,建议您在业务低峰期操作。

您可以通过以下流程重建CoreDNS Pod:

  1. 登录CCE控制台,选择一个集群,在左侧导航栏中单击“工作负载”“命名空间”选择kube-system。
  2. 选择coredns负载,单击"重新部署"。

  3. 等待coredns负载重新运行即可。