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工作流程图
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
在查询处理过程中遇到的任何错误都将打印到标准输出。特定类型的错误可以在一段时间内合并和打印一次。
基本语法:
errors
errors
health
启用进程范围的健康探测接口。当CoreDNS启动并运行时,它会返回200 OK HTTP
状态代码。默认情况下,健康状况在端口8080/health
上导出。
基本语法:
health 127.0.0.1:8080
#注意如果绑定所有地址可写:8080
health 127.0.0.1:8080
#注意如果绑定所有地址可写:8080
ready
启用就绪探测接口,默认为:8181
固定路径为/ready
,当该服务器准备就绪时,就绪端点返回 200 响应代码和“OK”字样。否则返回 503和未准备好的插件列表。
基本语法:
ready 127.0.0.1:8181
#注意如果绑定所有地址可写:8181
ready 127.0.0.1:8181
#注意如果绑定所有地址可写:8181
hosts
hosts插件可以用来直接定义自己所需的dns解析让coredns进行解析返回。
基本语法:
hosts . {
10.0.0.1 example.org #自己填写dns解析,可以写多条
fallthrough #表示处理完这个插件内容继续处理其余插件内容
}
hosts . {
10.0.0.1 example.org #自己填写dns解析,可以写多条
fallthrough #表示处理完这个插件内容继续处理其余插件内容
}
prometheus
使用prometheus,您可以从 CoreDNS 和任何拥有它们的插件中导出指标。指标的默认位置是localhost:9153
。指标路径固定为/metrics
。
基本语法:
prometheus localhost:9253
#注意如果绑定所有地址可写:9253
prometheus localhost:9253
#注意如果绑定所有地址可写:9253
cache
启用缓存,除区域传输和元数据记录外的所有记录都将被缓存长达 3600 秒。当从后端(上游、数据库等)获取数据成本高昂时缓存最有用。
基本语法:
cache 30 #缓存多少秒
cache 30 #缓存多少秒
loop
循环插件负责防止coredns进入到死循环,自动中断循环。
loop
loop
reload
自动重载配置,在修改配置文件后coredns会自动检测配置文件修改并且重新加载配置。
reload
reload
loadbalance
自动实现DNS负载均衡。
loadbalance
loadbalance
forward
forward插件将DNS请求转发到上游。它支持UDP、TCP 和 DNS-over-TLS 并可以实现监控检测。这个插件每个服务器只能使用一个。
可以配置外部dns服务IP也可以使用主机的/etc/resolv.conf
配置。
配置示例:
forward . /etc/resolv.conf {
except www.zhangzhuo.org #排除的域名
expire 10s #缓存时间10秒默认
}
forward . /etc/resolv.conf {
except www.zhangzhuo.org #排除的域名
expire 10s #缓存时间10秒默认
}
log
日志插件只会影响查询日志记录,CoreDNS 的任何其他日志记录都会显示出来。请注意对于繁忙的服务器,日志记录会导致性能下降。
配置示例:
log
log
4.dns排查
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