非托管CoreDNS配置说明

ACS默认推荐使用CoreDNS作为DNS服务器,CoreDNS是一种高效的DNS服务器,为Kubernetes集群提供服务发现功能。您可以通过自行安装并运维非托管版本CoreDNS来定制CoreDNS相关功能的需求。本文介绍ACS集群中非托管版本的CoreDNS在各应用场景下配置说明。

场景说明

说明

本文档的内容仅适用于非托管版本的CoreDNS,托管版本的CoreDNS相关配置对用户不可见,也不支持用户自行配置。有关托管版CoreDNS的详细使用,请参见DNS策略配置和域名解析说明。关于如何安装非托管版本CoreDNS,请参见在ACS集群内使用非托管CoreDNS

本文演示使用ACS集群提供的CoreDNS来做域名解析,即使用dnsPolicy: ClusterFirst策略。示例配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alinux3
  namespace: default
spec:
  containers:
  - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alinux3
  dnsPolicy: ClusterFirst

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

CoreDNS的默认配置

在ACS集群命名空间kube-system下,有一个CoreDNS配置项。CoreDNS会基于该配置项启用和配置插件。不同CoreDNS版本的配置项有略微差异,修改配置前请仔细阅读CoreDNS官方文档。以下是1.6.2版本CoreDNS默认采用的配置文件:

  Corefile: |
    .:53 {
        errors
        log
        health {
           lameduck 15s
        }
        ready
        kubernetes {{.ClusterDomain}} 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

将错误信息输出到标准输出。

health

CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。可以通过http://localhost:8080/health获取健康状态。

ready

CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://localhost:8181/ready获取可读状态。当所有插件都运行后,ready状态为200。

kubernetes

CoreDNS Kubernetes插件,提供集群内服务解析能力。

prometheus

CoreDNS自身metrics数据接口。可以通过http://localhost:9153/metrics获取Prometheus格式的监控数据。

forward(或proxy

将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在Kubernetes域时,将请求转发到预定义的解析器(/etc/resolv.conf)中。默认使用宿主机的/etc/resolv.conf配置。

cache

DNS缓存。

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服务器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

    如果您需要为特定域名指定静态IP地址,类似于/etc/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
        }
    重要

    请在hosts配置中添加fallthrough参数fallthrough,否则会造成非定制Hosts域名解析失败。

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

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

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

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

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

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

    • 集群内服务foo.default.svc.cluster.local通过内网CLB进行了暴露,且通过云解析PrivateZone在VPC内网中将foo.example.com解析到该内网CLB的IP。具体步骤,请参见上述CoreDNS配置说明

    • 在集群内部,您可以通过Rewrite插件将foo.example.comCNAME到foo.default.svc.cluster.local。示例配置如下:

        Corefile: |
          .:53 {
              errors
              health {
                 lameduck 15s
              }
              ready
              
              rewrite stop {
                name exact 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 .
        }