CoreDNS 添加自定义DNS解析记录

CoreDNS 的架构

解析流程

这里用到的是 CoreDNS 的 hosts plugin 插件。该插件仅支持 A, AAAA, 和 PTR 记录。

kubectl edit configmap coredns -n kube-system
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods verified
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        hosts {
            192.168.1.122  demo1.xx.com
            192.168.1.123  demo2.xx.com
            fallthrough
        }
        autopath @kubernetes
        prometheus :9153
        forward . /etc/resolv.conf {
            prefer_udp
            policy sequential
        }
        cache 30
        loop
        reload
        loadbalance
    }

kubernetes plugin

支持从 Kubernetes 集群读取 zone 数据。

运行 kubernetes 插件的 CoreDNS 可用作 kubernetes 集群中 kube-dns 的替代品。

forward plugin

用于设置 upstream Nameservers 上游 DNS 服务器。CoreDNS 就是通过它让容器能够解析外网的。

Multiple upstreams are randomized (see policy) on first use.

  • prefer_udp, try first using UDP even when the request comes in over TCP.
  • policy specifies the policy to use for selecting upstream servers. The default is random.

支持三种策略

  • random
  • round_robin
  • sequential

autopath plugin

在使用 autopath 插件之前,需要了解 pod 的四种 DNS 策略。

  • Default: Pod 从运行所在的节点继承名称解析配置。
  • ClusterFirst: 与配置的集群域后缀不匹配的任何 DNS 查询都将转发到从节点继承的上游名称服务器。
  • ClusterFirstWithHostNet: 对于以 hostNetwork 方式运行的 Pod,应显式设置该策略。
  • None: 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig 字段 所提供的 DNS 设置。

需要注意的是,pod 的默认 dnsPolicy 不是 Default,而是 ClusterFirst

在 ClusterFirst 模式下,两次(一次 ipv4,一次 ipv6)集群外部域名查询产生 8 次(四次 ipv4,四次 ipv6)查询请求。
Autopath 会在第一次域名查询失败时切割域名后缀,尝试找到正确的域名,做到两次(一次 ipv4,一次 ipv6)域名查询获取到正确的解析结果。

pods 必须设置为 verified 使其正常运行。

其它插件

  • errors: 查询处理期间遇到的任何错误都将打印到标准输出。
  • health: 监控检查。
  • ready: 就绪检查。
  • loop: 检测简单的转发循环并停止服务器。

参考文档

posted @ 2020-06-28 18:46  KeithTt  阅读(10993)  评论(0编辑  收藏  举报