Skip to content

1. CoreDns简介

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

CoreDNS是一个DNS服务器,它是用Go编写的。CoreDNS与其他DNS服务器不同,因为它非常灵活几乎所有功能都包含到插件中。

kubernetes中使用coredns提供service资源名称的域名解析,使用kubernetes插件。

当然coredns还有许多的实用插件,官方网站:https://coredns.io/plugins/

2. CoreDNS名称解析

  • CoreDNS:是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中,CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。
  • CoreDNS YAML文件https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns
  • ClusterIP 命名规范: ServiceName.Namespace.svc.ClusterDomain(默认是 cluster.local)
  • 示例:my-svc.my-namespace.svc.cluster.local
  • CoreDNS工作流程图image

2.1 案例

  • 查看service服务

    shell
    [root@k8s-master service]# kubectl get service
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        8d
    probe-demo   ClusterIP   10.104.161.168   <none>        80/TCP         4d1h
    web          NodePort    10.100.222.42    <none>        80:30009/TCP   19h
    [root@k8s-master service]# kubectl get service
    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        8d
    probe-demo   ClusterIP   10.104.161.168   <none>        80/TCP         4d1h
    web          NodePort    10.100.222.42    <none>        80:30009/TCP   19h
  • 启动一个busybox服务进行测试

    shell
    [root@k8s-master service]# kubectl run -it dns-test --image=busybox:1.28.4 -- /bin/sh
    If you don't see a command prompt, try pressing enter.
    / # nslookup web
    Server:    10.96.0.10
    Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
    
    Name:      web
    Address 1: 10.100.222.42 web.default.svc.cluster.local
    [root@k8s-master service]# kubectl run -it dns-test --image=busybox:1.28.4 -- /bin/sh
    If you don't see a command prompt, try pressing enter.
    / # nslookup web
    Server:    10.96.0.10
    Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
    
    Name:      web
    Address 1: 10.100.222.42 web.default.svc.cluster.local

3. CoreDns插件

errors

在查询处理过程中遇到的任何错误都将打印到标准输出。特定类型的错误可以在一段时间内合并和打印一次。

基本语法:

bash
errors
errors

health

启用进程范围的健康探测接口。当CoreDNS启动并运行时,它会返回200 OK HTTP状态代码。默认情况下,健康状况在端口8080/health上导出。

基本语法:

bash
health 127.0.0.1:8080 
#注意如果绑定所有地址可写:8080
health 127.0.0.1:8080 
#注意如果绑定所有地址可写:8080

ready

启用就绪探测接口,默认为:8181固定路径为/ready,当该服务器准备就绪时,就绪端点返回 200 响应代码和“OK”字样。否则返回 503和未准备好的插件列表。

基本语法:

bash
ready 127.0.0.1:8181
#注意如果绑定所有地址可写:8181
ready 127.0.0.1:8181
#注意如果绑定所有地址可写:8181

hosts

hosts插件可以用来直接定义自己所需的dns解析让coredns进行解析返回。

基本语法:

bash
hosts . {
  10.0.0.1 example.org  #自己填写dns解析,可以写多条
  fallthrough    #表示处理完这个插件内容继续处理其余插件内容
}
hosts . {
  10.0.0.1 example.org  #自己填写dns解析,可以写多条
  fallthrough    #表示处理完这个插件内容继续处理其余插件内容
}

prometheus

使用prometheus,您可以从 CoreDNS 和任何拥有它们的插件中导出指标。指标的默认位置是localhost:9153。指标路径固定为/metrics

基本语法:

bash
prometheus localhost:9253
#注意如果绑定所有地址可写:9253
prometheus localhost:9253
#注意如果绑定所有地址可写:9253

cache

启用缓存,除区域传输和元数据记录外的所有记录都将被缓存长达 3600 秒。当从后端(上游、数据库等)获取数据成本高昂时缓存最有用。

基本语法:

bash
cache 30  #缓存多少秒
cache 30  #缓存多少秒

loop

循环插件负责防止coredns进入到死循环,自动中断循环。

bash
loop
loop

reload

自动重载配置,在修改配置文件后coredns会自动检测配置文件修改并且重新加载配置。

bash
reload
reload

loadbalance

自动实现DNS负载均衡。

bash
loadbalance
loadbalance

forward

forward插件将DNS请求转发到上游。它支持UDP、TCP 和 DNS-over-TLS 并可以实现监控检测。这个插件每个服务器只能使用一个。

可以配置外部dns服务IP也可以使用主机的/etc/resolv.conf配置。

配置示例:

bash
forward  . /etc/resolv.conf {
    except www.zhangzhuo.org  #排除的域名
    expire 10s  #缓存时间10秒默认
}
forward  . /etc/resolv.conf {
    except www.zhangzhuo.org  #排除的域名
    expire 10s  #缓存时间10秒默认
}

log

日志插件只会影响查询日志记录,CoreDNS 的任何其他日志记录都会显示出来。请注意对于繁忙的服务器,日志记录会导致性能下降。

配置示例:

bash
log
log

4.dns排查

bash
 kubectl get pods -n kube-system |grep coredns
 
 kubectl get ep kube-dns -nkube-system
 kubectl get pods -n kube-system |grep coredns
 
 kubectl get ep kube-dns -nkube-system