更新时间:2024-11-12 GMT+08:00

合理配置CoreDNS

CoreDNS在插件界面仅支持按预设规格配置,通常情况下,这满足绝大多数使用场景。但在一些少数对CoreDNS资源用量有要求的场景下,不能根据需要灵活配置。

CoreDNS官方文档:https://coredns.io/plugins/

合理配置CoreDNS规格

  1. 登录CCE控制台,进入集群。
  2. 在左侧导航栏中选择“插件中心”,单击CoreDNS插件的“编辑”按钮,进入插件详情页。
  3. 在“规格配置”下配置CoreDNS参数规格。
  4. 您可以根据业务需求调整不同的副本数、CPU配额和内存配额,来调整CoreDNS所能提供的域名解析QPS。

  5. 单击“确定”,完成配置下发。

合理配置DNS存根域

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
  3. “参数配置”下添加存根域。格式为一个键值对,键为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
    }

  4. 单击“确定”完成配置更新。
  5. 在左侧导航栏中选择“配置与密钥”,在“kube-system”命名空间下,查看名为coredns的配置项数据,确认是否更新成功。

合理配置Host

如果您需要为特定域名指定hosts,可以使用Hosts插件来配置。示例配置如下:

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
  3. “参数配置”下编辑扩展参数,在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
    }

  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控制台,单击集群名称进入集群。
    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
        }

合理配置IPv6的解析

如果K8s集群宿主机没有关闭IPv6内核模块的话,容器请求CoreDNS时的默认行为是同时发起IPv4和IPv6解析。由于通常只使用IPv4地址,所以此时如果仅仅在CoreDNS中配置“DOMAIN -> IPV4地址”的解析的话,当CoreDNS收到IPv6解析请求的时候就会因为本地找不到配置而forward到上游DNS服务器解析,从而导致容器的DNS解析请求变慢。

CoreDNS提供了一种plugin叫做template,经过配置后可以给所有的IPv6请求立即返回一个空结果的应答,避免请求forward到上游DNS。

  1. 登录CCE控制台,单击集群名称进入集群。
  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配置项数据,确认是否更新成功。

    对应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控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“插件中心”,在CoreDNS下单击“编辑”,进入插件详情页。
  3. “参数配置”下编辑扩展参数,在plugins字段修改cache内容。cache的详细配置请参见https://coredns.io/plugins/cache/

    {
        "configBlock": "servfail 5s\nserve_stale 60s immediate",
        "name": "cache",
        "parameters": 30
    }

  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
    }