简介
域名系统(DNS)是一个将各种类型的信息(如IP地址)与易于记忆的名称相关联的系统。默认情况下,大多数Kubernetes集群会自动配置内部DNS服务,以提供轻量级的服务发现机制。内置的服务发现使应用程序更容易在Kubernetes集群上找到并相互通信,即使在节点之间创建、删除和转移Pod和服务时也是如此。
在Kubernetes的最新版本中,Kubernetes DNS服务的实现细节发生了变化。在本文中,我们将介绍Kubernetes DNS服务的kube-dns 和** Coredns** 两个版本。我们将回顾它们是如何运行的,以及Kubernetes生成的DNS记录。
要在开始之前更全面地了解域名系统,请阅读域名系统术语、组件和Concepts.简介对于任何你可能不熟悉的库伯内斯主题,你可以阅读What is Kubernetes?.
如果您正在寻找托管Kubernetes托管服务,查看我们为增长而构建的简单托管Kubernetes服务。
Kubernetes域名服务提供什么?
在Kubernetes 1.11之前,Kubernetes的域名服务是基于kube-dns 的。1.11版本引入了** CoreDNS** ,以解决Kube-DNS的一些安全和稳定性问题。
无论是哪种软件处理实际的DNS记录,这两种实现都以相似的方式工作:
- 创建名为
kube-dns
的服务和一个或多个实例。 kube-dns
服务监听来自Kubernetes API的 服务** 和** 端点** 事件,并根据需要更新其DNS记录。当您创建、更新或删除Kubernetes服务及其关联实例时,会触发这些事件。- kubelet为
kube-dns
服务的集群IP设置每个新实例的/etc/Resolv.con``name erver
选项,并设置相应的earch
选项,以允许使用更短的主机名:
1[标签解析.conf]
2名称服务器10.32.0.10
3搜索名称空间.svc.cluster.local svc.cluster.local cluster.local
4选项ndots:5
- 运行在容器中的应用程序可以将
Example-Serice.Namespace
等主机名解析为正确的集群IP地址。
Kubernetes域名记录示例
Kubernetes服务的完整DNS`A‘记录如下所示:
1service.namespace.svc.cluster.local
Pod将具有以下格式的记录,反映Pod的实际IP地址:
110.32.0.125.namespace.pod.cluster.local
此外,为Kubernetes服务的命名端口创建SRV
记录:
1_port-name._protocol.service.namespace.svc.cluster.local
所有这一切的结果是一种内置的、基于DNS的服务发现机制,在该机制中,您的应用程序或微服务可以针对简单且一致的主机名来访问集群上的其他服务或Pod。
搜索域名并解析较短的主机名
由于resolv.conf
文件中列出了搜索域后缀,因此您通常不需要使用完整的主机名来联系另一个服务。如果您在同一命名空间中寻址服务,则可以仅使用服务名称来联系它:
1other-service
如果服务位于不同的命名空间中,请将其添加到查询中:
1other-service.other-namespace
如果你的目标是一个pod,你至少需要使用以下几个:
1pod-ip.other-namespace.pod
正如我们在默认的Resolv.conf
文件中看到的那样,只有.svc
后缀是自动完成的,因此请确保您指定了.pod
之前的所有后缀。
现在我们知道了Kubernetes DNS服务的实际用途,让我们来看看两种不同实现的一些细节。
Kubernetes域名解析实现详情
如上一节所述,Kubernetes版本1.11引入了新的软件来处理kube-dns
服务。更改的动机是为了提高服务的性能和安全性。让我们先来看看原来的kube-dns
实现。
Kub-dns
Kubernetes 1.11之前的kube-dns
服务由三个容器组成,运行在kube-system
命名空间中的一个kube-dns
pod中。这三个容器是:
*kube-dns: 运行SkyDNS的容器,进行DNS查询解析 *dnsmasq: 流行的轻量级DNS解析器和缓存,用于缓存来自SkyDNS的响应 *sidecar: 一个sidecar容器,用于处理服务的指标报告和响应健康检查
Dnsmasq中的安全漏洞以及SkyDNS的扩展性能问题导致创建了替代系统CoreDNS。
核心域名解析
Kubernetes 1.11是一项新的Kubernetes域名服务,CoreDNS 已升级为普及版。这意味着它已经准备好投入生产使用,并将成为许多安装工具和托管Kubernetes提供商的默认集群DNS服务。
CoreDNS是一个用GO编写的单一进程,它涵盖了以前系统的所有功能。单个容器可以解析和缓存DNS查询,响应运行状况检查,并提供指标。
除了解决与性能和安全相关的问题外,CoreDNS还修复了其他一些小错误,并添加了一些新功能:
- 修复了使用存根域和外部服务之间的一些不兼容问题
- CoreDNS可以通过随机化返回某些记录的顺序来增强基于DNS的循环负载平衡
- 一种名为
autopath
的功能可以在解析外部主机名时缩短DNS响应时间,它可以更智能地遍历analyv.conf
中列出的每个搜索域后缀 - 如果使用kube-dns
10.32.0.125.ame pace.pod.cluster.local
,即使实例实际不存在,也会始终解析为10.32.0.125
。CoreDNS有一种Pods验证
模式,只有在存在具有正确IP且在正确命名空间中的Pod时,该模式才能成功解析。
有关CoreDNS以及它与kube-dns的区别的更多信息,您可以阅读Kubernetes CoreDNS GA公告。
附加配置选项
Kubernetes运营商通常希望自定义其Pod和容器如何解析某些自定义域,或者需要调整上游名称服务器或在resolv.conf
中配置的搜索域后缀。您可以使用pod的spec的dnsConfig
选项来完成此操作:
1[label example_pod.yaml]
2apiVersion: v1
3kind: Pod
4metadata:
5 namespace: example
6 name: custom-dns
7spec:
8 containers:
9 - name: example
10 image: nginx
11 dnsPolicy: "None"
12 dnsConfig:
13 nameservers:
14 - 203.0.113.44
15 searches:
16 - custom.dns.local
更新此配置将重写Pod的Resolv.conf
以启用更改。该配置直接映射到标准的解决方案.con
选项,因此上述配置将创建一个包含name erver 203.0.113.44
和search stom.dns.local
行的文件。
结论
在本文中,我们介绍了Kubernetes DNS服务为开发人员提供的基础知识,展示了一些服务和Pod的示例DNS记录,讨论了该系统如何在不同的Kubernetes版本上实现,并重点介绍了一些可用于自定义Pod解析DNS查询的其他配置选项。
有关kubernetes dns服务的更多信息,请参考官方kubernetes_dns for Services和pods_documentation.