On the console, the CoreDNS add-on can only be configured with the preset specifications, which can satisfy most of the service requirements. In some scenarios where there are requirements on the CoreDNS resource usage, you may need to customize the add-on specifications.
CoreDNS official document: https://coredns.io/plugins/
The corresponding Corefile content is as follows:
.: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
}
To specify hosts for a specific domain name, you can use the hosts add-on. An example is as follows:
{
"configBlock": "192.168.1.1 www.example.com\nfallthrough",
"name": "hosts"
}
The fallthrough field must be configured. fallthrough indicates that when the domain name to be resolved cannot be found in the hosts file, the resolution task is transferred to the next CoreDNS plug-in. If fallthrough is not specified, the task ends and the domain name resolution stops. As a result, the domain name resolution in the cluster fails.
For details about how to configure the hosts file, visit https://coredns.io/plugins/hosts/.
The corresponding Corefile content is as follows:
.: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
}
If the IPv6 kernel module is not disabled on the Kubernetes cluster host machine, the container initiates IPv4 and IPv6 resolution at the same time by default when requesting the coredns add-on. Generally, only IPv4 addresses are used. Therefore, if you only configure DOMAIN in IPv4 address, the coredns add-on forwards the request to the upstream DNS server for resolution because the local configuration cannot be found. As a result, the DNS resolution request of the container slows down.
CoreDNS provides the template plug-in. After being configured, CoreDNS can immediately return an empty response to all IPv6 requests to prevent the requests from being forwarded to the upstream DNS.
For details about the template plug-in, visit https://github.com/coredns/coredns/tree/master/plugin/template.
{
"configBlock": "rcode NXDOMAIN",
"name": "template",
"parameters": "ANY AAAA"
}
Corresponding Corefile content:
.: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
}
If you configure CoreDNS with an upstream DNS server, you can implement a cache policy that enables CoreDNS to use the expired local cache when it is unable to access the upstream DNS server.
{
"configBlock": "servfail 5s\nserve_stale 60s immediate",
"name": "cache",
"parameters": 30
}

Corresponding Corefile content:
.: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
}