一、K8s的DNS策略
Default: 由kubelet决定使用何种DNS策略,通过–resolv-conf=/etc/resolv.conf 来配置DNS解析文件地址,默认使用宿主机的resolv.conf文件。
ClusterFirst:优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器
ClusterFirstWithHostNet:和ClusterFirst相同,对于以hostNetwork模式运行的Pod应显式配置使用该策略
None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置
自定义Dns配置可以通过spec.dnsConfig字段进行设置,可以设置如下信息
- nameservers:一组dns服务器的列表,最多可设置3个
- searchs:一组用于域名搜索的dns域名后缀,最多6个
- options:配置其他可选参数,例如ndots、timeout等
k8s默认使用的DNS策略是ClusterFirst,这点需要注意,也就是说域名解析会优先使用集群的DNS进行查询,如果k8s的DNS解析失败,会转发到宿主机的DNS进行解析。
二、K8s内域名解析流程
以default下pod为例,查看/etc/resolv.conf文件
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local host.com
options ndots:5
- nameserver 10.96.0.10是k8s集群内部的dns服务的ClusterIP,无法ping,但是可以访问。
- options ndots:5 表示如果查询的域名包含的点"."不到5个,那么进行DNS查找将使用非完全限定名称(非绝对域名);如果查询的域名包含点数大于等于5,那么DNS查询默认使用绝对域名进行查询。
- search default.svc.cluster.local svc.cluster.local cluster.local host.com
使用非绝对域名查找时,将域名依次带入search域进行查找,例如b.default.svc.cluster.local -> b.svc.cluster.local -> b.cluster.local
普通的 Service 拥有自己的 ClusterIP 地址,service name 会被 DNS 解析到这个虚拟的 ClusterIP(A 记录或 CNAME 记录),然后被 kubectl proxy 转发到具体的 Pod。
而 Headless Service 没有自己的 ClusterIP(这个值被指定成了 None),service name 只提供 SRV 记录的 DNS 解析,返回一个 Pods 的 ip/dns 列表。
三、coredns配置解析
.:53 {
log
errors
health {
lameduck 5s
}
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
cache 30
loop
reload
loadbalance
}
coredns的主要功能是通过插件系统实现的。它实现了一种链式插件的结构,将dns的逻辑抽象成了一个个插件。常见的插件如下:
- loadbalance:提供基于dns的负载均衡功能
- loop:检测在dns解析过程中出现的简单循环问题
- cache:提供前端缓存功能
- health:对Endpoint进行健康检查
- kubernetes:从kubernetes中读取zone数据
- etcd:从etcd读取zone数据,可以用于自定义域名记录
- file:从文件中读取zone数据
- hosts:使用/etc/hosts文件或者其他文件读取zone数据,可以用于自定义域名记录
- auto:从磁盘中自动加载区域文件
- reload:定时自动重新加载Corefile配置文件的内容
- forward:转发域名查询到上游dns服务器
- proxy:转发特定的域名查询到多个其他dns服务器,同时提供到多个dns服务器的负载均衡功能
- prometheus:为prometheus系统提供采集性能指标数据的URL
- pprof:在URL路径/debug/pprof下提供运行是的西能数据
- log:对dns查询进行日志记录
- errors:对错误信息镜像日志记录