合理配置CoreDNS
CoreDNS在插件界面仅支持按预设规格配置,通常情况下,这满足绝大多数使用场景。但在一些少数对CoreDNS资源用量有要求的场景下,不能根据需要灵活配置。
CoreDNS官方文档:https://coredns.io/plugins/
合理配置CoreDNS规格
- 登录CCE控制台,进入集群。
- 在左侧导航栏中选择“插件中心”,单击CoreDNS插件的“编辑”按钮,进入插件详情页。
- 在“规格配置”下配置CoreDNS参数规格。
- 您可以根据业务需求调整不同的副本数、CPU配额和内存配额,来调整CoreDNS所能提供的域名解析QPS。
- 单击“确定”,完成配置下发。
合理配置DNS存根域
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
- 在“参数配置”下添加存根域。格式为一个键值对,键为DNS后缀域名,值为一个或一组DNS IP地址,如 'consul.local --10.150.0.1'。
图1 添加存根域
对应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 }
- 单击“确定”完成配置更新。
- 在左侧导航栏中选择“配置与密钥”,在“kube-system”命名空间下,查看名为coredns的配置项数据,确认是否更新成功。
合理配置Host
如果您需要为特定域名指定hosts,可以使用Hosts插件来配置。示例配置如下:
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
- 在“参数配置”下编辑扩展参数,在plugins字段添加以下内容。
{ "configBlock": "192.168.1.1 www.example.com\nfallthrough", "name": "hosts" }
此处配置不能遗漏fallthrough字段,fallthrough表示当在hosts找不到要解析的域名时,会将解析任务传递给CoreDNS的下一个插件。如果不写fallthrough的话,任务就此结束,不会继续解析,会导致集群内部域名解析失败的情况。
hosts的详细配置请参见https://coredns.io/plugins/hosts/。
图2 修改CoreDNS Hosts配置
对应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 }
- 单击“确定”完成配置更新。
- 在左侧导航栏中选择“配置与密钥”,在“kube-system”命名空间下,查看名为coredns的配置项数据,确认是否更新成功。
配置Forward插件与上游DNS服务的默认协议
- NodeLocal DNSCache采用TCP协议与CoreDNS进行通信,CoreDNS会根据请求来源使用的协议与上游DNS服务器进行通信。因此默认情况下,来自业务容器的集群外部域名解析请求会依次经过NodeLocal DNSCache、CoreDNS,最终以TCP协议请求VPC内DNS服务器。
- 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/。
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
- 在“参数配置”下编辑扩展参数,在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 }
合理配置IPv6的解析
如果K8s集群宿主机没有关闭IPv6内核模块的话,容器请求CoreDNS时的默认行为是同时发起IPv4和IPv6解析。由于通常只使用IPv4地址,所以此时如果仅仅在CoreDNS中配置“DOMAIN -> IPV4地址”的解析的话,当CoreDNS收到IPv6解析请求的时候就会因为本地找不到配置而forward到上游DNS服务器解析,从而导致容器的DNS解析请求变慢。
CoreDNS提供了一种plugin叫做template,经过配置后可以给所有的IPv6请求立即返回一个空结果的应答,避免请求forward到上游DNS。
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
- 在“参数配置”下编辑扩展参数,在plugins字段添加以下内容。
- AAAA表示IPv6解析请求,rcode控制应答返回NXDOMAIN,即表示没有解析结果。
template插件的官方文档地址请参考:https://github.com/coredns/coredns/tree/master/plugin/template
{ "configBlock": "rcode NXDOMAIN", "name": "template", "parameters": "ANY AAAA" }
- 单击“确定”完成配置更新。
- 在左侧导航栏中选择“配置项与密钥”,在“kube-system”命名空间下,查看coredns配置项数据,确认是否更新成功。
对应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服务器时使用已过期的本地缓存。
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
- 在“参数配置”下编辑扩展参数,在plugins字段修改cache内容。cache的详细配置请参见https://coredns.io/plugins/cache/。
{ "configBlock": "servfail 5s\nserve_stale 60s immediate", "name": "cache", "parameters": 30 }
- 单击“确定”完成配置更新。
- 在左侧导航栏中选择“配置与密钥”,在“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 }