
# 使用CoreDNS实现自定义域名解析
#### 应用现状
在使用CCE时，可能会有解析自定义内部域名的需求，例如：
- 存量代码配置了用固定域名调用内部其他服务，如果要切换到Kubernetes Service方式，修改配置工作量大。
- 在集群外自建了一个其他服务，需要将集群中的数据通过固定域名发送到这个服务。
 
#### 解决方案
使用CoreDNS有以下几种自定义域名解析的方案。
- [为CoreDNS配置存根域]：为特定域名指定域名解析服务器，可以直接在控制台添加，简单易操作。
- [使用CoreDNS Hosts插件配置任意域名解析]：为特定域名配置本地解析记录，简单直观，可以添加任意解析记录，类似在本地/etc/hosts中添加解析记录。
- [使用CoreDNS Rewrite插件指向域名到集群内服务]：在集群内对域名进行CNAME解析，将一个域名指向另一个集群内域名，相当于给Kubernetes中的Service名称取了个别名，无需提前知道解析记录的IP地址。
- [使用CoreDNS Forward插件将自建DNS设为上游DNS]：完全使用自建DNS作为外部域名解析服务器。自建DNS中，可以管理大量的解析记录，解析记录专门管理，增删记录无需修改CoreDNS配置。
 
#### 注意事项
CoreDNS修改配置需额外谨慎，因为CoreDNS负责集群的域名解析任务，修改不当可能会导致集群解析出现异常。请做好修改前后的测试验证。
 #### 为CoreDNS配置存根域
集群管理员可以修改CoreDNS Corefile的ConfigMap以更改服务发现的工作方式。
若集群管理员有一个位于10.150.0.1的Consul域名解析服务器，并且所有Consul的域名都带有.consul.local的后缀。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
3. 在"参数配置"下添加存根域。格式为一个键值对，键为DNS后缀域名，值为一个或一组DNS IP地址，如 'consul.local --10.150.0.1'。 
   图1添加存根域   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002089043621.png "点击放大")
   如果使用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的配置项数据，确认是否更新成功。
 
 #### 使用CoreDNS Hosts插件配置任意域名解析
在CoreDNS中修改hosts后，可以不用单独在每个Pod中配置hosts添加解析记录。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
3. 在"参数配置"下编辑扩展参数，在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/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
   此处配置不能遗漏fallthrough字段，fallthrough表示当在hosts找不到要解析的域名时，会将解析任务传递给CoreDNS的下一个插件。如果不写fallthrough的话，任务就此结束，不会继续解析，会导致集群内部域名解析失败的情况。
   hosts的详细配置请参见<https://coredns.io/plugins/hosts/>。
   图2修改CoreDNS Hosts配置   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002089125021.png "点击放大")
   如果使用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的配置项数据，确认是否更新成功。
 
 #### 使用CoreDNS Rewrite插件指向域名到集群内服务
使用 CoreDNS 的 Rewrite 插件，将指定域名解析到某个 Service 的域名。例如，将访问example.com域名的请求重新指向到example.default.svc.cluster.local域名，即指向到default命名空间下的example服务。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
3. 在"参数配置"下编辑扩展参数，在plugins字段添加以下内容。例如，将example.com重写为example.default.svc.cluster.local。更多关于rewrite的配置参数可以参考[rewrite](https://coredns.io/plugins/rewrite/)。
   
   ```
   {
      "name": "rewrite",
      "parameters": "name example.com example.default.svc.cluster.local"
   }
   ```
   图3添加CoreDNS Rewrite配置指向域名到集群内服务   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002052966220.png "点击放大")
   如果使用Corefile视图编辑配置，对应Corefile内容如下：
   ```
   .:5353 {
       bind {$POD_IP}
       rewrite name example.com example.default.svc.cluster.local
       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的配置项数据，确认是否更新成功。
 
 #### 使用CoreDNS Forward插件将自建DNS设为上游DNS
当域名不在Kubernetes域时，CoreDNS默认使用节点的/etc/resolv.conf文件进行解析，您也可以修改成外部DNS的解析地址。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"插件中心"，找到**CoreDNS 域名解析**插件，单击"编辑"，进入插件详情页。
3. 在"参数配置"下编辑扩展参数，在plugins字段修改以下内容。例如，所有域名查询都转发给192.168.1.1这个DNS服务器，并且用随机策略选择上游。更多关于forward的配置参数可以参考[forward](https://coredns.io/plugins/forward/)。
   
   ```
   {
       "configBlock": "policy random",
       "name": "forward",
       "parameters": ". 192.168.1.1"
   }
   ```
   图4使用CoreDNS级联自建DNS   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002053124608.png "点击放大")
   如果使用Corefile视图编辑配置，对应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 . 192.168.1.1 {
           policy random
       }
       reload
       ready {$POD_IP}:8081
   }
   ```
   
   
4. 单击"下一步"，完成升级检查后单击"确定"。
5. 在左侧导航栏中选择"配置与密钥"，在"kube-system"命名空间下，查看名为coredns的配置项数据，确认是否更新成功。
 
