介绍
域名系统(DNS)是一种用于将各种类型的信息(例如IP地址)与易于记忆的名称相关联的系统。 默认情况下,大多数Kubernetes群集会自动配置内部DNS服务,以便为服务发现提供轻量级机制。 内置的服务发现使应用程序更容易在Kubernetes集群上相互查找和通信,即使在节点之间创建,删除和移动pod和服务时也是如此。
最近版本的Kubernetes中Kubernetes DNS服务的实现细节已经改变。 在本文中,我们将介绍Kubernetes DNS服务的kube-dns和CoreDNS版本。 我们将审查它们的运作方式以及Kubernetes生成的DNS记录。
要在开始之前更全面地了解DNS,请阅读“DNS术语,组件和概念简介” 。 对于您可能不熟悉的任何Kubernetes主题,您可以阅读Kubernetes简介 。
Kubernetes DNS服务提供什么?
在Kubernetes版本1.11之前,Kubernetes DNS服务基于kube-dns 。 1.11版引入了CoreDNS来解决kube-dns的一些安全性和稳定性问题。
无论处理实际DNS记录的软件如何,两种实现都以类似的方式工作:
- 创建名为
kube-dns
服务和一个或多个pod。 -
kube-dns
服务监听来自Kubernetes API的服务和端点事件,并根据需要更新其DNS记录。 创建,更新或删除Kubernetes服务及其关联的pod时会触发这些事件。 kubelet将每个新pod的
/etc/resolv.conf
nameserver
选项设置为kube-dns
服务的集群IP,并使用适当的search
选项以允许使用更短的主机名:的resolv.confnameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5
然后,在容器中运行的应用程序可以将主机名(例如
example-service.namespace
解析为正确的群集IP地址。
示例Kubernetes DNS记录
Kubernetes服务的完整DNS A
记录将类似于以下示例:
service.namespace.svc.cluster.local
一个pod会有这种格式的记录,反映了pod的实际IP地址:
10.32.0.125.namespace.pod.cluster.local
此外,为Kubernetes服务的命名端口创建SRV
记录:
_port-name._protocol.service.namespace.svc.cluster.local
所有这些的结果是内置的,基于DNS的服务发现机制,您的应用程序或微服务可以在其中定位一个简单一致的主机名,以访问群集上的其他服务或pod。
搜索域并解决较短的主机名
由于resolv.conf
文件中列出的搜索域Postfix,您通常不需要使用完整主机名来联系其他服务。 如果要在同一名称空间中寻址服务,则只需使用服务名称即可联系它:
other-service
如果服务位于不同的命名空间中,请将其添加到查询中:
other-service.other-namespace
如果您要定位广告连播,则至少需要使用以下内容:
pod-ip.other-namespace.pod
正如我们在默认的resolv.conf
文件中看到的那样,只有.svc
Postfix会自动完成,因此请确保指定.pod
所有内容。
现在我们已经了解了Kubernetes DNS服务的实际用途,让我们来看看两个不同实现的一些细节。
Kubernetes DNS实施细节
如上一节所述,Kubernetes 1.11版引入了处理kube-dns
服务的新软件。 改变的动机是提高服务的性能和安全性。 我们先来看看原始的kube-dns
实现。
KUBE-DNS
Kubernetes 1.11之前的kube-dns
服务由在kube-system
命名空间中的kube-dns
pod中运行的三个容器组成。 这三个容器是:
- kube-dns:运行SkyDNS的容器,用于执行DNS查询解析
- dnsmasq:一种流行的轻量级DNS解析器和缓存,用于缓存SkyDNS的响应
- sidecar:一个边车容器,用于处理指标报告并响应服务的运行状况检查
Dnsmasq中的安全漏洞以及SkyDNS的扩展性能问题导致创建了替换系统CoreDNS。
CoreDNS
从Kubernetes 1.11开始,新的Kubernetes DNS服务, CoreDNS已升级为通用可用性。 这意味着它已准备好用于生产,并且将成为许多安装工具和托管Kubernetes提供程序的默认群集DNS服务。
CoreDNS是一个用Go编写的单一进程,它涵盖了以前系统的所有功能。 单个容器解析并缓存DNS查询,响应运行状况检查并提供指标。
除了解决与性能和安全相关的问题之外,CoreDNS还修复了一些其他小错误并添加了一些新功能:
- 修复了使用stubDomains和外部服务之间不兼容的一些问题
- CoreDNS可以通过随机化返回某些记录的顺序来增强基于DNS的循环负载平衡
- 称为
autopath
的功能可以在解析外部主机名时提高DNS响应时间,方法是autopath
迭代resolv.conf
列出的每个搜索域Postfix - 使用kube-dns
10.32.0.125.namespace.pod.cluster.local
将始终解析为10.32.0.125
,即使pod实际上不存在。 CoreDNS具有“已验证的pod”模式,只有当存在具有正确IP且位于右侧命名空间的pod时,才会成功解析。
有关CoreDNS及其与kube-dns的不同之处的更多信息,您可以阅读Kubernetes CoreDNS GA公告 。
其他配置选项
Kubernetes运营商通常希望自定义其pod和容器如何解析某些自定义域,或者需要调整上游Nameservers或搜索resolv.conf
配置的域Postfix。 您可以使用pod规范的dnsConfig
选项执行此操作:
apiVersion: v1
kind: Pod
metadata:
namespace: example
name: custom-dns
spec:
containers:
- name: example
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 203.0.113.44
searches:
- custom.dns.local
更新此配置将重写pod的resolv.conf
以启用更改。 配置直接映射到标准的resolv.conf
选项,因此上面的配置将创建一个nameserver 203.0.113.44
的文件并search custom.dns.local
行。
结论
在本文中,我们介绍了Kubernetes DNS服务为开发人员提供的基础知识,展示了服务和pod的一些示例DNS记录,讨论了如何在不同的Kubernetes版本上实现系统,并突出显示了一些可用于自定义pod的方式的其他配置选项解析DNS查询。
有关Kubernetes DNS服务的更多信息,请参阅官方Kubernetes DNS服务和Pods文档 。