# CoreDNS域名解析插件
#### 插件简介
CoreDNS域名解析插件是一款通过链式插件的方式为Kubernetes提供域名解析服务的DNS服务器。
CoreDNS是由CNCF孵化的开源软件，用于Cloud-Native环境下的DNS服务器和服务发现解决方案。CoreDNS实现了插件链式架构，能够按需组合插件，运行效率高、配置灵活。在Kubernetes集群中使用CoreDNS能够自动发现集群内的服务，并为这些服务提供域名解析。同时，通过级联云上DNS服务器，还能够为集群内的工作负载提供外部域名的解析服务。
**该插件为系统资源插件，在创建集群时默认安装。**
目前CoreDNS已经成为社区Kubernetes集群推荐的DNS服务器解决方案。
CoreDNS官网：<https://coredns.io/>
开源社区地址：<https://github.com/coredns/coredns>
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
DNS详细使用方法请参见[DNS](https://support.huaweicloud.com/usermanual-cce/cce_10_0360.html)。
#### 约束与限制
CoreDNS域名解析插件正常运行或升级时，请确保所有实例都处于运行状态，否则将导致插件异常或升级失败。
#### 编辑插件
本插件为系统默认安装，若需自定义参数，可参照如下步骤进行编辑。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群，在左侧导航栏中选择"插件中心"，在右侧找到**CoreDNS域名解析**插件，单击"编辑"。
2. 在编辑插件页面，查看"规格配置"。 
   您可根据需求调整插件实例数和资源配额。CoreDNS所能提供的域名解析QPS与CPU消耗呈正相关，集群中的容器数量增加时，CoreDNS实例承受的压力也会同步增加。请根据集群的规模，合理调整插件实例数和容器CPU/内存配额。
   
   
3. 设置插件支持的"参数配置"。 
   表1CoreDNS插件参数配置 
   | 参数         | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   |:---|:---|
   | 存根域设置        | 对自定义的域名配置域名服务器，格式为一个键值对，键为DNS后缀域名，值为一个或一组DNS IP地址，如 'acme.local -- 1.2.3.4,6.7.8.9'。 详情请参见[为CoreDNS配置存根域](https://support.huaweicloud.com/usermanual-cce/cce_10_0361.html#cce_10_0361__section5202157467)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | 扩展参数配置（可选） | - parameterSyncStrategy：插件升级时是否配置一致性检查。 - ensureConsistent：表示启用配置一致性检查。如果下发的配置与当前生效配置不同，则覆盖当前生效配置；如果下发的配置与当前生效配置相同，则保留当前生效配置。使用ensureConsistent可以确保配置的一致性，如果存在手动修改configmap的场景，插件将无法升级，需要使用force或inherit策略进行插件升级。  - force：表示升级时忽略配置一致性检查。如果升级插件时下发的配置与升级前配置相同，则不会更新ConfigMap，生效配置保持不变。如果升级插件时更新了配置，将以升级插件时下发的配置为准，请您自行确保升级插件时下发的配置和当前生效配置一致。插件升级完毕后，需将parameterSyncStrategy参数值恢复为ensureConsistent，重新启用配置一致性检查。  - inherit：如果升级插件时下发的配置和当前生效配置不一致，将忽略升级插件时下发的配置，以当前生效配置为准。插件升级完毕后，parameterSyncStrategy的参数值将自动恢复为ensureConsistent，重新启用配置一致性检查。 注意： 设置自动参数继承策略（parameterSyncStrategy=inherit）时，"存根域设置"将被清空并合并到"扩展参数配置"中，渲染后效果与原"存根域设置"一致，您可以在"扩展参数配置" 中查看集群的存根域设置。     - stub_domains：存根域，您可对自定义的域名配置域名服务器，格式为一个键值对，键为DNS后缀域名，值为一个或一组DNS IP地址。  - upstream_nameservers：上游域名服务器地址。  - servers: CoreDNS 1.23.1插件版本开始开放servers配置，用户可对servers做定制化配置，详情请参见[dns-custom-nameservers](https://kubernetes.io/zh/docs/tasks/administer-cluster/dns-custom-nameservers)。 其中plugins为CoreDNS中各组件配置。一般场景建议保持默认配置，以免出现配置错误而导致CoreDNS整体不可用。每个plugin组件可包含"name"、"parameters"(可选)、"configBlock"(可选)配置，对应生成的Corefile配置文件中格式如下： ``` $name  $parameters { $configBlock } ``` 常用plugin的说明请参见[表2]。更多配置详情请参见[Plugins](https://coredns.io/plugins/)。 示例： ``` { "servers": [ { "plugins": [ { "name": "bind", "parameters": "{$POD_IP}" }, { "name": "cache", "configBlock": "servfail 5s", "parameters": 30 }, { "name": "errors" }, { "name": "health", "parameters": "{$POD_IP}:8080" }, { "name": "ready", "{$POD_IP}:8081" }, { "configBlock": "pods insecure\nfallthrough in-addr.arpa ip6.arpa", "name": "kubernetes", "parameters": "cluster.local in-addr.arpa ip6.arpa" }, { "name": "loadbalance", "parameters": "round_robin" }, { "name": "prometheus", "parameters": "{$POD_IP}:9153" }, { "configBlock": "policy random", "name": "forward", "parameters": ". /etc/resolv.conf" }, { "name": "reload" } ], "port": 5353, "zones": [ { "zone": "." } ] } ], "stub_domains": { "acme.local": [ "1.2.3.4", "6.7.8.9" ] }, "upstream_nameservers": ["8.8.8.8", "8.8.4.4"] } ```    |
      
    表2CoreDNS主zone默认plugin配置说明 
   | plugin名称     | 描述                                                                                                                                                                                                                                                                            |
   |:---|:---|
   | bind        | CoreDNS侦听的hostIP配置，建议保持当前默认值{$POD_IP}。详情请参见[bind](https://coredns.io/plugins/bind/)。                                                                                                                                                                                          |
   | cache          | 启用DNS缓存。详情请参见[cache](https://coredns.io/plugins/cache/)。 插件版本\>=1.25.10时，支持关闭servfail缓存。如需关闭servfail缓存，请将configBlock设置为"servfail 0"；否则servfail缓存的单位为s，不可省略。                                                        |
   | errors       | 错误信息到标准输出。详情请参见[errors](https://coredns.io/plugins/errors/)。                                                                                                                                                                                                                   |
   | health      | CoreDNS健康检查配置，当前侦听{$POD_IP}:8080，请保持此默认值，否则导致coredns健康检查失败而不断重启。详情请参见[health](https://coredns.io/plugins/health/)。                                                                                                                                                           |
   | ready        | 检查后端服务是否准备好接收流量，当前侦听{$POD_IP}:8081。如果后端服务没有准备好，CoreDNS将会暂停 DNS 解析服务，直到后端服务准备好为止。详情请参见[ready](https://coredns.io/plugins/ready/)。                                                                                                                                             |
   | kubernetes   | CoreDNS Kubernetes插件，提供集群内服务解析能力。详情请参见[kubernetes](https://coredns.io/plugins/kubernetes/)。                                                                                                                                                                                |
   | loadbalance   | 轮转式 DNS 负载均衡器，在应答中随机分配A、AAAA和MX记录的顺序。详情请参见[loadbalance](https://coredns.io/plugins/loadbalance/)。                                                                                                                                                                             |
   | prometheus | CoreDNS自身metrics数据接口，默认侦听{$POD_IP}:9153，请保持此默认值，否则普罗无法采集coredns metrics数据。详情请参见[prometheus](https://coredns.io/plugins/metrics/)。                                                                                                                                             |
   | forward      | 不在 Kubernetes 集群域内的任何查询都将转发到默认的解析器 (/etc/resolv.conf)。详情请参见[forward](https://coredns.io/plugins/forward/)。                                                                                                                                                                   |
   | reload       | 允许自动重新加载已更改的Corefile。编辑ConfigMap配置后，请等待两分钟，以使更改生效。详情请参见[reload](https://coredns.io/plugins/reload/)。                                                                                                                                                                          |
   | log         | 开启CoreDNS域名解析的日志。详情请参见[log](https://coredns.io/plugins/log/)。 示例如下： ``` { "name": "log" } ```                                                                                                                     |
   | template      | 设置快速应答模板，AAAA表示IPv6解析请求，rcode控制应答返回NXDOMAIN，即表示没有IPv6解析结果。详情请参见[template](https://coredns.io/plugins/template/)。 示例如下： ``` { "configBlock": "rcode NXDOMAIN", "name": "template", "parameters": "ANY AAAA" } ``` |
      
   
   
4. 完成以上配置后，单击"确定"。
 
#### 组件说明
表3coredns组件 
| 容器组件  | 说明                      | 资源类型      |
|:---|:---|:---|
| coredns | 该容器为提供集群域名解析服务的DNS服务器。 | Deployment |
   
#### Kubernetes中的域名解析逻辑
DNS策略可以在每个pod基础上进行设置，目前，Kubernetes支持**Default** **、** **ClusterFirst** **、** **ClusterFirstWithHostNet** **和** **None** 四种DNS策略，具体请参见[Service与Pod的DNS](https://kubernetes.io/zh-cn/docs/concepts/services-networking/dns-pod-service/)。这些策略在pod-specific的**dnsPolicy**字段中指定。
- **"Default"**：如果dnsPolicy被设置为"Default"，则名称解析配置将从pod所在的容器子网继承。 自定义上游域名服务器和存根域不能够与这个策略一起使用。
- **"ClusterFirst"：**如果dnsPolicy被设置为"ClusterFirst"，任何与配置的集群域后缀不匹配的DNS查询（例如，www.kubernetes.io）将转发到从该Pod所在的容器子网继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游DNS服务器。
- **"ClusterFirstWithHostNet"：**对于使用hostNetwork运行的Pod，您应该明确设置其DNS策略"ClusterFirstWithHostNet"。
- **"None"：**它允许Pod忽略Kubernetes环境中的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置 。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
- Kubernetes 1.10及以上版本，支持Default、ClusterFirst、ClusterFirstWithHostNet和None四种策略；低于Kubernetes 1.10版本，仅支持default、ClusterFirst和ClusterFirstWithHostNet三种。
- "Default"不是默认的DNS策略。如果dnsPolicy的Flag没有特别指明，则默认使用"**ClusterFirst**"。
 
**路由请求流程：**
未配置存根域：没有匹配上配置的集群域名后缀的任何请求，例如 "www.kubernetes.io"，将会被转发到继承自Pod的上游域名服务器。
已配置存根域：如果配置了存根域和上游DNS服务器，DNS查询将基于下面的流程对请求进行路由：
1. 查询首先被发送到coredns中的DNS缓存层。
2. 从缓存层，检查请求的后缀，并根据下面的情况转发到对应的DNS上：
   - 具有集群后缀的名字（例如".cluster.local"）：请求被发送到coredns。
   
   
   
   - 具有存根域后缀的名字（例如".acme.local"）：请求被发送到配置的自定义DNS解析器（例如：监听在 1.2.3.4）。
   
   - 未能匹配上后缀的名字（例如"widget.com"）：请求被转发到上游DNS。
    
图1路由请求流程   
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001760355501.png "点击放大")
#### 版本记录
表4CoreDNS域名解析插件版本记录 
| 插件版本     | 支持的集群版本                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | 更新特性                   | 社区版本                                                               |
|:---|:---|:---|:---|
| 1.32.4    | - v1.35  - v1.34  - v1.32  - v1.31   | 支持Autopilot 1.35集群   | [1.11.4](https://github.com/coredns/coredns/releases/tag/v1.11.4)  |
| 1.32.3  | - v1.34  - v1.32  - v1.31                                                                                                                                             | 支持Autopilot 1.34集群 | [1.11.4](https://github.com/coredns/coredns/releases/tag/v1.11.4) |
| 1.32.1   | - v1.32  - v1.31  - v1.28                                                                                                                                                      | 支持Autopilot 1.32集群     | [1.11.4](https://github.com/coredns/coredns/releases/tag/v1.11.4)   |
| 1.28.11  | - v1.31  - v1.28  - v1.27                                                                                                                                          | 支持Autopilot 1.31集群    | [1.11.4](https://github.com/coredns/coredns/releases/tag/v1.11.4)  |
| 1.28.10 | - v1.31  - v1.28  - v1.27                                                                                                                                                | 支持Autopilot 1.31集群    | [1.10.1](https://github.com/coredns/coredns/releases/tag/v1.10.1)  |
| 1.28.9  | - v1.28  - v1.27                                                                                                                                                                                                                                                                                        | 修复部分问题                | [1.10.1](https://github.com/coredns/coredns/releases/tag/v1.10.1)   |
| 1.28.8   | - v1.28  - v1.27                                                                                                                                                                                                                                                                                  | 插件依赖例行升级             | [1.10.1](https://github.com/coredns/coredns/releases/tag/v1.10.1)   |
| 1.28.7 | - v1.28  - v1.27                                                                                                                                                                                                                                                                                      | 插件依赖例行升级             | [1.10.1](https://github.com/coredns/coredns/releases/tag/v1.10.1)   |
| 1.28.6    | - v1.28  - v1.27                                                                                                                                                                                                                                                                                   | 修复部分问题                | [1.10.1](https://github.com/coredns/coredns/releases/tag/v1.10.1) |
   
