专栏首页云计算教程系列Kubernetes DNS服务简介
原创

Kubernetes DNS服务简介

介绍

域名系统(DNS)是一种用于将各种类型的信息(例如IP地址)与易于记忆的名称相关联的系统。默认情况下,大多数Kubernetes群集会自动配置内部DNS服务,以便为服务发现提供轻量级机制。内置的服务发现使应用程序更容易在Kubernetes集群上相互查找和通信,即使在节点之间创建,删除和移动pod和服务时也是如此。

最近版本的Kubernetes中Kubernetes DNS服务的实现细节已经改变。在本文中,我们将介绍Kubernetes DNS服务的kube-dnsCoreDNS版本。我们将审查它们的运作方式以及Kubernetes生成的DNS记录。

要完成本教程,您需要具备一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

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选项以允许使用更短的主机名: 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-ip.other-namespace.pod

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

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

Kubernetes DNS实施细节

如上一节所述,Kubernetes 1.11版引入了处理该kube-dns服务的新软件。改变的动机是提高服务的性能和安全性。我们先来看一下原来的kube-dns实现。

KUBE-DNS

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

  • 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可以通过使在resolv.conf中列出的每个搜索域后缀更加智能化改善DNS响应时间的功能。
  • 即使pod实际上不存在, kube-dns的 10.32.0.125.namespace.pod.cluster.local也会一直解析10.32.0.125。CoreDNS具有“已验证的pod”模式,只有当存在具有正确IP且位于右侧命名空间的pod时,才会成功解析。

有关CoreDNS及其与kube-dns的不同之处的更多信息,您可以阅读Kubernetes CoreDNS GA公告

其他配置选项

Kubernetes运营商通常希望自定义其pod和容器如何解析某些自定义域,或者需要调整上游名称服务器或搜索resolv.conf中配置的域后缀。您可以使用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

更新此配置将重写容器的resolv.conf以启用更改。配置直接映射到标准resolv.conf选项,因此上面的配置将创建一个带nameserver 203.0.113.44search custom.dns.local行的文件。

结论

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

有关Kubernetes DNS服务的更多信息,请参阅官方Kubernetes DNS服务和Pods文档

想要了解更多关于Kubernetes DNS服务简介的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《An Introduction to the Kubernetes DNS Service》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在CentOS 7上安装和配置ownCloud

    ownCloud是一个文件共享服务器,允许您将个人内容(如文档和图片)集中存储在此位置,就像Dropbox一样。与ownCloud的不同之处在于它是免费的开源软...

    爆栈工程师
  • 如何在CentOS 7上使用InfluxDB分析系统指标

    InfluxDB是一个时间序列,指标和分析数据库。时间序列数据库旨在解决存储在一段时间内进行的连续测量所产生的数据的问题。此数据可能包含系统指标(如CPU和内存...

    爆栈工程师
  • 如何在Ubuntu 14.04上使用UFW设置防火墙

    UFW或简单防火墙是iptables的一个接口,旨在简化配置防火墙的过程。虽然iptables是一个可靠而灵活的工具,但初学者很难学会如何使用它来正确配置防火墙...

    爆栈工程师
  • 腾讯云 Elasticsearch 进阶篇(二十九)Logstash讲解与实战

    output是Logstash的最后阶段,一个事件可以经过多个输出,而一旦所有输出处理完成,整个事件就执行完成。 一些常用的输出包括:

    南非骆驼说大数据
  • CNCF中国云原生调查2019

    在CNCF,我们定期调查社区,以更好地了解开源和云原生技术的采用。我们第三次使用中文进行了"云原生调查中国",以更深入地了解中国采用云原生的速度,以及如何在这个...

    有点技术
  • C语言常用的知识没多少之运算符与表达式

    在现实中学完数数就要开始学习数的运算,如加减乘除等。C语言也有对数的运算,有算数运算、赋值运算、关系运算、逻辑运算、位运算、条件运算、逗号运算、sizeof运算...

    用户5935416
  • 【DB笔试面试650】在Oracle中,如何查询表的DML操作数据变化量?

    DBA_TAB_MODIFICATIONS视图(基表为SYS.MON_MODS_ALL$)记录了从上次收集统计信息以来表中DML操作变化的数据量,包括执行INS...

    小麦苗DBA宝典
  • SED入门

    使用Linux多年,SED和AWK两大神器却始终无法得心应手的来提高自己的工作效率,每每需要查找替换,都要依赖于ST2等一众图形工具,深感愧疚,乃专门抽时间学习...

    大江小浪
  • Java/C/Python_实现顺序表的基本操作

    详细源码参考地址: https://github.com/jackaroo2020/my-algorithm

    Java架构师必看
  • 正则表达式性能优化

    正则表达式是计算科学的一个概念,很多语言都实现了他,正则表达式使用一些特定的元字符来检索,匹配以及替换符合规则的字符串。

    小土豆Yuki

扫码关注云+社区

领取腾讯云代金券