
# 如何解决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日志，操作方式请参见[查看容器日志](https://support.huaweicloud.com/cce_faq/cce_faq_00134.html#cce_faq_00134__section08362088490)，如果日志中出现以下告警，表明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资源。
![](https://support.huaweicloud.com/cce_faq/public_sys-resources/caution_3.0-zh-cn.png)
重启CoreDNS Pod可能会对集群内的域名解析服务造成短暂的波动，建议您在业务低峰期操作。
您可以通过以下流程重建CoreDNS Pod：
1. 登录CCE控制台，选择一个集群，在左侧导航栏中单击"工作负载"，"命名空间"选择kube-system。
2. 选择coredns负载，单击"重新部署"。 ![](https://support.huaweicloud.com/cce_faq/zh-cn_image_0000002211248834.png "点击放大")
   
3. 等待coredns负载重新运行即可。
 
