kubernetes下的DNS
Kubernetes中的DNS主要用作服务发现,在集群中调度Pod和Service,并且配置kubelet使得容器可以使用DNS Service的IP解析域名
skyDNS(Kubernetes 1.3)—>kubeDNS(Kubernetes1.3之后)—>CoreDNS(Kubernetes 1.11之后GA)
stubdomains、upstreamnameservers(1.6增加)、federation
DNS
svc
A记录(域名解析IP的记录):
SRV记录:
Pod:
kube-DNS
CoreDNS和kube-DNS主要差异
实现差异
kube-dns中一个pod内使用了数个容器:kubedns、dnsmasq 和 sidecar。 kubedns 进程监视 Kubernetes master 对 Service 和 Endpoint 操作的变更,并维护一个内存查询结构去处理 DNS 请求。dnsmasq 容器增加了一个 DNS 缓存来改善性能。为执行对 dnsmasq 和 kubedns 的健康检查,sidecar容器提供了一个单独的健康检查 Endpoint
dnsmasq中的安全漏洞导致过去需要发布Kubernetes安全补丁。此外,由于dnsmasq处理存根域,但kubedns处理External Services,因此你无法在外部服务中使用存根域
一体化解决方案
区别于 kube-dns,CoreDNS 编译出来就是一个单独的二进制可执行文件,内置了 cache,backend storage ,health check 等功能,无需第三方组件来辅助实现其他功能,从而使得部署更方便,内存管理更为安全;
bug修复和增强功能
——dns#55:kube-dns的自定义DNS条目可以通过使用kubernetes插件中的“fallthrough”机制、使用重写插件或者仅使用不同的插件(如文件插件)提供子区域来处理。
——dns#116:只有一个A记录集用于具有单个主机名的pod无头服务。此问题已修复,无需任何其他配置。
——dns#131: externalName不使用stubDomains设置。此问题已修复,无需任何其他配置。
——dns#167:启用skyDNS循环A / AAAA记录。可以使用负载均衡插件配置等效功能。
——dns#190:kube-dns无法以非root用户身份运行。现在通过使用非默认镜像解决了此问题,但在将来的版本中它将成为默认的CoreDNS行为。
——dns#232:将pod hostname修复为dns srv记录的podname,这是通过下面描述的“endpoint_pod_names”功能支持的增强功能。
CoreDNS实现原理
插件化
Kube-dns三个容器,CoreDNS****一个容器
区别于**kube-DNS,CoreDNS编译出为一个单独二进制可执行文件,内置了** cache,backend storage ,****health check 等功能,无需第三方组件来辅助实现其他功能,从而使得部署更方便,内存管理更为安全
1 |
|
从kube-dns迁移到CoreDNS
在Kubernetes1.10之后,CoreDNS支持将kube-dns的ConfigMap转换成CoreDNS的Corefile。也就是说,当你在kube-dns中已经通过ConfigMap配置了stubdomains
、upstreamnameservers
、federation
等参数, 在通过kubeadm upgrade
来安装CoreDNS后,将自动转换原来的ConfigMap到CoreDNS下的Corefile。
kube-dns下的ConfigMap:
1 |
|
转换后的CoreDNS Corefile:
1 |
|
检查可以升级的CoreDNS版本
1 |
|
升级成CoreDNS并且设为默认DNS
1 |
|
新建集群设置CoreDNS为默认
1 |
|
kubeadm upgrade
References
coredns-ga-for-kubernetes-cluster-dns
How Queries Are Processed in CoreDNS
migration-from-kube-dns-to-coredns
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!