
# 合理配置CoreDNS
CoreDNS在插件界面仅支持按预设规格配置，通常情况下，这满足绝大多数使用场景。但在一些少数对CoreDNS资源用量有要求的场景下，不能根据需要灵活配置。
CoreDNS官方文档：<https://coredns.io/plugins/>
#### 合理配置CoreDNS规格
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，进入集群。
2. 在左侧导航栏中选择"插件中心"，单击CoreDNS插件的"编辑"按钮，进入插件详情页。
3. 在"规格配置"下配置CoreDNS参数规格。
4. 您可以根据业务需求调整不同的副本数、CPU配额和内存配额，来调整CoreDNS所能提供的域名解析QPS。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001864979754.png "点击放大")
   
   
5. 单击"确定"，完成配置下发。
 
#### 合理配置DNS存根域
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
3. 修改插件"参数配置"。 
   **未** **开启"切换Corefile视图"：**
   1. 找到"存根域设置"，单击"添加"。
   
   2. 填写存根域，格式为一个键值对，键为DNS后缀域名，值为一个或一组DNS IP地址，如 'consul.local --10.150.0.1'。
      图1添加存根域   
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002089043621.png "点击放大") 
    
   **已** **开启"切换Corefile视图"：**
   - 如果使用Corefile视图编辑配置，对应Corefile内容如下：
     ```
     .:5353 {
         bind {$POD_IP}
         cache 30 {
             servfail 5s
         }
         errors
         health {$POD_IP}:8080
         kubernetes cluster.local in-addr.arpa ip6.arpa {
             pods insecure
             fallthrough in-addr.arpa ip6.arpa
         }
         loadbalance round_robin
         prometheus {$POD_IP}:9153
         forward . /etc/resolv.conf {
             policy random
         }
         reload
         ready {$POD_IP}:8081
     }
     consul.local:5353 {
         bind {$POD_IP}
         errors
         cache 30
         forward . 10.150.0.1
     }
     ```
     
    
   
   
4. 单击"下一步"，完成升级检查后单击"确定"。
5. 在左侧导航栏中选择"配置与密钥"，在"kube-system"命名空间下，查看名为coredns的配置项数据，确认是否更新成功。
 
#### 合理配置Host
如果您需要为特定域名指定hosts，可以使用Hosts插件来配置。示例配置如下：
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
3. 修改插件"参数配置"。 
   **未** **开启"切换Corefile视图"：**
   1. 找到"扩展参数配置"，并单击进行展开。
   
   2. 在plugins字段添加以下内容。例如为www.example.com指定IP为192.168.1.1。更多关于hosts的配置参数可以参考[hosts](https://coredns.io/plugins/hosts/)。
      ```
      {
        "configBlock": "192.168.1.1 www.example.com\nfallthrough",
        "name": "hosts"
      }
      ```
      ![](https://support.huaweicloud.com/bestpractice-cce/public_sys-resources/notice_3.0-zh-cn.png)
      此处配置不能遗漏fallthrough字段，fallthrough表示当在hosts找不到要解析的域名时，会将解析任务传递给CoreDNS的下一个插件。如果不写fallthrough的话，任务就此结束，不会继续解析，会导致集群内部域名解析失败的情况。
      图2修改CoreDNS Hosts配置   
      ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002089125021.png "点击放大") 
    
   **已** **开启"切换Corefile视图"：**
   - 如果使用Corefile视图编辑配置，对应Corefile内容如下：
     ```
     .:5353 {
         bind {$POD_IP}
         hosts {
           192.168.1.1 www.example.com
           fallthrough
         }
         cache 30
         errors
         health {$POD_IP}:8080
         kubernetes cluster.local in-addr.arpa ip6.arpa {
             pods insecure
             fallthrough in-addr.arpa ip6.arpa
         }
         loadbalance round_robin
         prometheus {$POD_IP}:9153
         forward . /etc/resolv.conf {
             policy random
         }
         reload
         ready {$POD_IP}:8081
     }
     ```
     
    
   
   
4. 单击"下一步"，完成升级检查后单击"确定"。
5. 在左侧导航栏中选择"配置与密钥"，在"kube-system"命名空间下，查看名为coredns的配置项数据，确认是否更新成功。
 
#### 配置Forward插件与上游DNS服务的默认协议
1. NodeLocal DNSCache采用TCP协议与CoreDNS进行通信，CoreDNS会根据请求来源使用的协议与上游DNS服务器进行通信。因此默认情况下，来自业务容器的集群外部域名解析请求会依次经过NodeLocal DNSCache、CoreDNS，最终以TCP协议请求VPC内DNS服务器。
2. VPC内DNS服务器对TCP协议支持有限，如果您使用了NodeLocal DNSCache，您需要修改CoreDNS配置，让其总是优先采用UDP协议与上游DNS服务器进行通信，避免解析异常。建议您使用以下方式修改CoreDNS配置文件。 
   在forward插件用于设置 upstream Nameservers 上游 DNS 服务器。包含以下参数：
   **prefer_udp**：即使请求通过TCP传入，也要首先尝试使用UDP。
   若您希望CoreDNS会优先使用UDP协议与上游通信，则forward中指定请求上游的协议为prefer_udp，forward插件的详细信息请参考<https://coredns.io/plugins/forward/>。
   1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
   
   2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
   
   3. 在"参数配置"下编辑扩展参数，在plugins字段修改以下内容。
      ```
      {
          "configBlock": "prefer_udp",
          "name": "forward",
          "parameters": ". /etc/resolv.conf"
      }
      ```
      如果使用Corefile视图，则对应的Corefile为：
      ```
      Corefile: |-
        .:5353 {
            bind {$POD_IP}
            cache 30 {
                servfail 5s
            }
            errors
            health {$POD_IP}:8080
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
            }
            loadbalance round_robin
            prometheus {$POD_IP}:9153
            forward . /etc/resolv.conf {
                prefer_udp
            }
            reload
            ready {$POD_IP}:8081
        }
      ```
      
   
   4. 单击"下一步"，完成升级检查后单击"确定"。
   
   
   
   
 
#### 合理配置IPv6的解析
如果K8s集群宿主机没有关闭IPv6内核模块的话，容器请求CoreDNS时的默认行为是同时发起IPv4和IPv6解析。由于通常只使用IPv4地址，所以此时如果仅仅在CoreDNS中配置"DOMAIN -\> IPV4地址"的解析的话，当CoreDNS收到IPv6解析请求的时候就会因为本地找不到配置而forward到上游DNS服务器解析，从而导致容器的DNS解析请求变慢。
CoreDNS提供了一种plugin叫做template，经过配置后可以给所有的IPv6请求立即返回一个空结果的应答，避免请求forward到上游DNS。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，在CoreDNS下单击"编辑"，进入插件详情页。
3. 在"参数配置"下编辑扩展参数，在plugins字段添加以下内容。 
   - AAAA表示IPv6解析请求，rcode控制应答返回NXDOMAIN，即表示没有解析结果。
   
   
   template插件的官方文档地址请参考：<https://github.com/coredns/coredns/tree/master/plugin/template>
   ```
   {
     "configBlock": "rcode NXDOMAIN",
     "name": "template",
     "parameters": "ANY AAAA"
   }
   ```
   
   
4. 单击"确定"完成配置更新。
5. 在左侧导航栏中选择"配置项与密钥"，在"kube-system"命名空间下，查看coredns配置项数据，确认是否更新成功。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001552224716.png "点击放大")
   对应Corefile内容如下：
   ```
   .:5353 {
       bind {$POD_IP}
       cache 30
       errors
       health {$POD_IP}:8080
       kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
       }
       loadbalance round_robin
       prometheus {$POD_IP}:9153
       forward . /etc/resolv.conf {
           policy random
       }
       reload
       template ANY AAAA {
           rcode NXDOMAIN
       }
       ready {$POD_IP}:8081
   }
   ```
   
   
 
#### 合理配置缓存策略
如果CoreDNS配置了上游DNS服务器时，可以通过合理的缓存策略允许CoreDNS在无法连接上游DNS服务器时使用已过期的本地缓存。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，在CoreDNS下单击"编辑"，进入插件详情页。
3. 在"参数配置"下编辑扩展参数，在plugins字段修改cache内容。cache的详细配置请参见<https://coredns.io/plugins/cache/>。
   
   ```
   {
       "configBlock": "servfail 5s\nserve_stale 60s immediate",
       "name": "cache",
       "parameters": 30
   }
   ```
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000001905280433.png "点击放大")
   
   
4. 单击"确定"完成配置更新。
5. 在左侧导航栏中选择"配置与密钥"，在"kube-system"命名空间下，查看名为coredns的配置项数据，确认是否更新成功。 
   对应Corefile内容如下：
   ```
   .:5353 {
       bind {$POD_IP}
       cache 30 {
           servfail 5s
           serve_stale 60s immediate
       }
       errors
       health {$POD_IP}:8080
       kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
       }
       loadbalance round_robin
       prometheus {$POD_IP}:9153
       forward . /etc/resolv.conf {
           policy random
       }
       reload
       ready {$POD_IP}:8081
   }
   ```
   
   
 
