Kubernetes DNS服务简介

栏目: 编程工具 · 发布时间: 6年前

内容简介:域名系统(DNS)是一种用于将各种类型的信息(例如IP地址)与易于记忆的名称相关联的系统。 默认情况下,大多数Kubernetes群集会自动配置内部DNS服务,以便为服务发现提供轻量级机制。 内置的服务发现使应用程序更容易在Kubernetes集群上相互查找和通信,即使在节点之间创建,删除和移动pod和服务时也是如此。最近版本的Kubernetes中Kubernetes DNS服务的实现细节已经改变。 在本文中,我们将介绍Kubernetes DNS服务的kube-dns和CoreDNS几个不同的实现版本

Kubernetes DNS服务简介

原文

介绍

域名系统(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的服务service和端点endpoint事件,并根据需要更新其DNS记录。 创建,更新或删除Kubernetes服务及其关联的pod时会触发这些事件。
  • kubelet将每个新pod的/etc/resolv.conf名称服务器选项设置为kube-dns服务的集群IP,并使用适当的搜索选项以允许使用更短的主机名:

resolve.conf

nameserver 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 文件中列出了搜索域后缀,所以您通常不需要使用完整主机名来访问其他服务。 如果要在同一命名空间中寻址其它服务,则只需使用服务名称即可:

other-service

如果服务位于不同的命名空间中,请将其添加:

other-service.other-namespace

如果您要定位pod,则至少需要像以下所示使用:

pod-ip.other-namespace.pod

正如我们在默认的resolv.conf文件中看到的那样,只有.svc后缀会自动完成,因此请确保指定.pod之前的所有内容。

现在我们已经了解了Kubernetes DNS服务的实际用途,让我们来看看两个不同实现的一些细节。

Kubernetes DNS实现细节

如上一节所述,Kubernetes 1.11版引入了处理kube-dns服务的新版本CoreDNS。 这样做的动机是提高服务的性能和安全性。 我们先来看看原始的kube-dns实现。

kube-dns

Kubernetes 1.11之前的kube-dns服务由在kube-system命名空间中的kube-dns pod中运行的三个容器组成。 这三个容器是:

  • kube-dns:运行SkyDNS的容器,用于执行DNS查询解析
  • dnsmasq:流行的轻量级DNS解析器和缓存,用于缓存SkyDNS的响应
  • sidecar:一个sidecar容器,用于处理指标报告并响应服务的运行状况检查

Dnsmasq中的安全漏洞以及SkyDNS的扩展性能问题导致了被CoreDNS所替换。

CoreDNS

从Kubernetes 1.11开始,新的Kubernetes DNS服务,CoreDNS已升级为GA。 这意味着它已准备好用于生产,并且将成为许多安装 工具 和托管Kubernetes提供商的默认集群DNS服务。

CoreDNS,用 Go 编写且单一进程,它涵盖了以前系统的所有功能: 单个容器解析并缓存DNS查询,响应运行状况检查并提供指标。

除了解决与性能和安全相关的问题之外,CoreDNS还修复了一些其他小错误并添加了一些新功能:

  • 修复了使用stubDomains和外部服务之间不兼容的一些问题
  • CoreDNS可以通过随机化返回某些记录的顺序来增强基于DNS的round-robin负载平衡
  • autopath功能可以在解析外部主机名时提高DNS响应时间,方法是更好地遍历resolv.conf中列出的每个搜索域后缀
  • 如果使用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和容器如何解析某些自定义域,或者需要调整上游名称服务器或搜索resolv.conf中配置的域后缀。 您可以使用pod规范的dnsConfig选项执行此操作:

example_pod.yaml

yaml

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.44search custom.dns.local 这几行。

结论

在本文中,我们介绍了Kubernetes DNS为开发人员提供了哪些服务的基础知识,展示了service和pod的一些DNS记录示例,讨论了不同的Kubernetes版本上的不同实现,并突出显示了一些可用于自定义pod解析DNS查询的其他配置选项。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Hackers

Hackers

Steven Levy / O'Reilly Media / 2010-5-30 / USD 21.99

This 25th anniversary edition of Steven Levy's classic book traces the exploits of the computer revolution's original hackers -- those brilliant and eccentric nerds from the late 1950s through the ear......一起来看看 《Hackers》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具