# 场景说明

使用 dnsPolicy: ClusterFirst 策略。示例配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: ClusterFirst

关于 dnsPolicy 配置和场景说明,请参见 DNS 原理和配置说明

# CoreDNS 的默认配置

在命名空间 kube-system 下,ACK 集群有一个 CoreDNS 配置项(有关如何查看配置项的具体步骤,请参见管理配置项)。CoreDNS 会基于该配置项启用和配置插件。不同 CoreDNS 版本的配置项有略微差异,修改配置前请仔细阅读 CoreDNS 官方文档。以下是一个 1.6.2 版本 CoreDNS 默认采用的配置文件:

Corefile: |
    .:53 {
        errors
        log
        health {
           lameduck 15s
        }
        ready
        kubernetes <!--swig0--> in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
              prefer_udp
        }
        cache 30
        loop
        reload
        loadbalance
    }

说明 配置文件中 ClusterDomain 代指集群创建过程中填写的集群本地域名,默认值为 cluster.local

参数描述
errors错误信息到标准输出。
healthCoreDNS 自身健康状态报告,默认监听端口 8080,一般用来做健康检查。您可以通过 http://localhost:8080/health 获取健康状态。
readyCoreDNS 插件状态报告,默认监听端口 8181,一般用来做可读性检查。可以通过 http://localhost:8181/ready 获取可读状态。当所有插件都运行后,ready 状态为 200。
kubernetesCoreDNS Kubernetes 插件,提供集群内服务解析能力。
prometheusCoreDNS 自身 metrics 数据接口。可以通过 http://localhost:9153/metrics 获取 prometheus 格式的监控数据。
forward(或 proxy将域名查询请求转到预定义的 DNS 服务器。默认配置中,当域名不在 Kubernetes 域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的 /etc/resolv.conf 配置。
cacheDNS 缓存。
loop环路检测,如果检测到环路,则停止 CoreDNS。
reload允许自动重新加载已更改的 Corefile。编辑 ConfigMap 配置后,请等待两分钟以使更改生效。
loadbalance循环 DNS 负载均衡器,可以在答案中随机 A、AAAA、MX 记录的顺序。

# CoreDNS 的扩展配置

针对以下不同场景,您可以扩展 CoreDNS 的配置:

  • 场景一:开启日志服务

    如果需将 CoreDNS 每次域名解析的日志打印出来,您可以开启 Log 插件,在 Corefile 里加上 log。示例配置如下:

    Corefile: |
        .:53 {
            errors
            log
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
                  prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
  • 场景二:特定域名使用自定义 DNS 服务器

    如果 example.com 类型后缀的域名需要经过自建 DNS 服务器(IP 为 10.10.0.10)进行解析的话,您可为域名配置一个单独的服务块。示例配置如下:

    example.com:53 {
      errors
      cache 30
      forward . 10.10.0.10
      prefer_udp
    }

    完整配置如下:

    Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
        example.com:53 {
            errors
            cache 30
            forward . 10.10.0.10
            prefer_udp
        }
  • 场景三:外部域名完全使用自建 DNS 服务器

    如果您需要使用的自建 DNS 服务的域名没有统一的域名后缀,您可以选择所有集群外部域名都使用自建 DNS 服务器(此时需要您将自建的 DNS 服务不能解析的域名转发到阿里云 DNS,禁止直接更改集群 ECS 上的 /etc/resolv.conf 文件)。例如,您自建的 DNS 服务器 IP 为 10.10.0.10 和 10.10.0.20,可以更改 forward 参数进行配置。示例配置如下:

    Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . 10.10.0.10 10.10.0.20{
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }
  • 场景四:自定义 Hosts

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

    Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            ready
            
            hosts {
              127.0.0.1 www.example.com
              fallthrough
            }
          
            kubernetes cluster.local in-addr.arpa ip6.arpa {
              pods insecure
              fallthrough in-addr.arpa ip6.arpa
              ttl 30
            }
            prometheus :9153
            forward . /etc/resolv.conf {
              prefer_udp
            }
            cache 30
            loop
            reload
            loadbalance
        }

    重要 请配置 fallthrough,否则会造成非定制 Hosts 域名解析失败。

  • 场景五:集群外部访问集群内服务

    如果您希望运行在集群 ECS 上的进程能够访问到集群内的服务,虽然可以通过将 ECS 的 /etc/resolv.conf 文件内 nameserver 配置为集群 kube-dns 的 ClusterIP 地址来达到目的,但不推荐您直接更改 ECS 的 /etc/resolv.conf 文件的方式来达到任何目的。

    内网场景下,您可以将集群内的服务通过内网 SLB 进行暴露,然后在云解析 PrivateZone 控制台通过添加 A 记录到该 SLB 的内网 IP 进行解析。具体操作,请参见添加解析记录

  • 场景六:统一域名访问服务或是在集群内对域名的做 CNAME 解析

    您可以实现在公网、内网和集群内部通过统一域名 foo.example.com 访问您的服务,原理如下:

    • 集群内的服务 foo.default.svc.cluster.local 通过公网 SLB 进行了暴露,且有域名 foo.example.com 解析到该公网 SLB 的 IP。

    • 集群内服务 foo.default.svc.cluster.local 通过内网 SLB 进行了暴露,且通过云解析 PrivateZone 在 VPC 内网中将 foo.example.com 解析到该内网 SLB 的 IP。具体步骤,请参见上述场景四:自定义 Hosts

    • 在集群内部,您可以通过 Rewrite 插件将

      foo.example.com

      CNAME 到

      foo.default.svc.cluster.local

      。示例配置如下:

      Corefile: |
          .:53 {
              errors
              health {
                 lameduck 15s
              }
              ready
              
              rewrite stop {
                name regex foo.example.com foo.default.svc.cluster.local
                answer name foo.default.svc.cluster.local foo.example.com 
              }
              kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods insecure
                fallthrough in-addr.arpa ip6.arpa
                ttl 30
              }
              prometheus :9153
              forward . /etc/resolv.conf {
                prefer_udp
              }
              cache 30
              loop
              reload
              loadbalance
          }
  • 场景七:禁止 CoreDNS 对 IPv6 类型的 AAAA 记录查询返回

    当业务容器不需要 AAAA 记录类型时,可以在 CoreDNS 中将 AAAA 记录类型拦截,返回空(NODATA),以减少不必要的网络通信。示例配置如下:

    Corefile: |
        .:53 {
            errors
            health {
               lameduck 15s
            }
            #新增以下一行Template插件,其它数据请保持不变。
            template IN AAAA .
        
        }
更新于

请我喝[茶]~( ̄▽ ̄)~*

baim0 微信支付

微信支付

baim0 支付宝

支付宝

baim0 贝宝

贝宝