作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。
DNS服务在kubernetes中经历了三个阶段。
第一阶段,在kubernetes
1.2版本时,dns服务使用的是由SkyDNS提供的,由4个容器组成:kube2sky、skydns、etcd和healthz。etcd存储dns记录;kube2sky监控service变化,生成dns记录;skydns读取服务,提供查询服务;healthz提供健康检查
第二阶段,在kubernetes
1.4版本开始使用kubedns,有3个容器组成:kubedns、dnsmasq和sidecar。kubedns监控service变化,并记录到内存(存到内存提高性能)中;dnsmasq获取dns记录,提供dns缓存,提供dns查询服务;sidecar提供健康检查。
第三阶段,从kubernetes 1.11版本开始,dns服务有coredns提供,coredns支持自定义dns记录及配置upstream dns
server,可以统一管理内部dns和物理dns。coredns只有一个coredns容器。下面是coredns的架构
coredns.png
下面是coredns的配置模板
.:53 { errors health { lameduck 5s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } hosts { 172.23.1.3 hub.kellan.com fallthrough } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance }coredns的主要功能是通过插件系统实现的。它实现了一种链式插件的结构,将dns的逻辑抽象成了一个个插件。常见的插件如下:
上面已经描述了dns的服务端,那么pod有什么策略呢
目前的策略如下:
* nameservers:一组dns服务器的列表,最多可设置3个
* searchs:一组用于域名搜索的dns域名后缀,最多6个
* options:配置其他可选参数,例如ndots、timeout等 例如:spec: dnsPolicy: "None" dnsConfig: nameservers: - 1.2.3.4
searchs:
- xx.ns1.svc.cluster.local
- xx.daemon.com
options:
- name: ndots
values: "2"pod被创建后,容器内的/etc/resolv.conf会根据这个信息进行配置
架构图如下
nodelocaldns
下面是nodelocaldns的configmap的示例
cluster.local:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 health 169.254.25.10:9254 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 } ip6.arpa:53 { errors cache 30 reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 } .:53 { errors cache 30 reload loop bind 169.254.25.10 forward . /etc/resolv.conf prometheus :9253 }可以看到配置和coredns是相仿的,就不再赘述。
但是这里要进一步说明下,通过配置可以看出除了cluster.local(即kubernetes集群的解析)外都使用节点的/etc/resolv.conf文件的nameserver。如果将自定义解析加到coredns上是没有效果的,所以需要修改nodelocaldns的配置,将其他域名的解析转到coredns上才行。
#forward . /etc/resolv.conf forward . 10.233.0.3 { force_tcp }原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。