CoreDns

Pod 内/etc/resolv.conf详解

1
2
3
nameserver 22.68.0.2
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
  • nameserver 定义DNS服务器的IP地址。
  • search 设置域名的查找后缀规则,查找配置越多,说明域名解析查找匹配次数越多。集群匹配有kube-system.svc.cluster.local.svc.cluster.local.cluster.local. 3个后缀,最多进行8次查询才能得到正确解析结果,因为集群里面进行IPV4和IPV6查询各四次。
  • options 定义域名解析配置文件选项,支持多个KV值。例如该参数设置成ndots:5,说明如果访问的域名字符串内的点字符数量超过ndots值,则认为是完整域名,并被直接解析;如果不足ndots值,则追加search段后缀再进行查询。

集群DnsPolicy

  • ClusterFirst: 通过CoreDNS来做域名解析,Pod内/etc/resolv.conf配置的DNS服务地址是集群DNS服务的kube-dns地址。该策略是集群工作负载的默认策略。
  • None: 忽略集群DNS策略,需要您提供dnsConfig字段来指定DNS配置信息。
  • Default:Pod直接继承集群节点的域名解析配置,即服务器的/etc/resolv.conf
  • ClusterFirstWithHostNetwork:强制在hostNetWork网络模式下使用ClusterFirst策略(默认使用Default策略)。

CoreDns Configurtion

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  Corefile: |
    .:53 {
        errors
        log
        health {
           lameduck 5s
        }
        ready
        hosts {
          127.0.0.1 www.example.com
          fallthrough
        }     
        rewrite stop {
          name regex www.baidu.com startup.default.svc.cluster.local
          answer name startup.default.svc.cluster.local www.baidu.com
        }
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }    

额外配置

参数 说明
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记录的顺序。
log 如果需将CoreDNS每次域名解析的日志打印出来,您可以开启log插件,在Corefile里加上log。
host 自定义hosts,需要配置fallthrough,否则会造成非定制hosts域名解析失败
rewrite stop 将www.baidu.com CAME到 startup.default.svc.cluster.local服务

外部服务访问k8s service

把coredns的service_ip 填写到Ecs的/etc/resolv.conf,需要Ecs到k8s的网络是通的
nameserver 22.68.0.2

service调用最佳实践

在k8s内调用对方的svc,如果域名的.少于5个,他会根据/etc/resolv.conf依次search,最多会解析8次分别为ipv4&v6各4次,如果.大于等于5会直接解析。

1
2
3
4
5
6
-------------                  -------------
| Namespace |                  | Namespace |
|    foo    |                  |    foo    |
|    SVC    |      ----->      |    SVC    |
|   iauth   |                  |    test   |
-------------                  -------------

同命名空间填写test or test.bar.svc.cluster.local. 都会解析2次,test虽然不满足5个.,他第一次会直接search test.bar.svc.cluster.local.

1
2
3
4
5
6
-------------                  -------------
| Namespace |                  | Namespace |
|    foo    |                  |    bar    |
|    SVC    |      ----->      |    SVC    |
|   iauth   |                  |    test   |
-------------                  -------------

跨命名空间填写test.bar会解析4次,第二次ipvd会search到 test.bar.svc.cluster.local. 无论是跨命名还是同命名空间填写test.bar.svc.cluster.local.都会search一次ipv4&v6即为两次。
集群外的域名例如www.google.com他会解析8次,如果以.结尾www.google.com.他只会解析两次。