返回博客

Kubernetes DNS 服务:初学者指南

Kubernetes DNS 服务:初学者指南

Kubernetes,也称为 K8s,是一个开源的 编排系统,用于自动部署、扩展和管理容器化应用程序。它的可移植性、灵活性和自动扩展能力使其成为一个被广泛使用的系统。在所有突出的特性中,为服务和 Pod 创建 DNS 记录的选项使其在其他软件系统中脱颖而出。Kubernetes DNS 服务允许您使用一致的 DNS 名称而不是 IP 地址来联系服务。

前提条件

为了充分利用本教程并更好地理解 Kubernetes DNS 服务,请确保您已温习了 Kubernetes 基础知识。阅读 DNS 术语、组件和概念概述 也有助于您更好地理解 DNS 概念。此外,Docker 生态系统概述 以及 容器化技术 的基础知识将带来极大的优势。

什么是 DNS 系统?

域名系统 (DNS) 是一种将各种信息与易于记忆的名称(例如 IP 地址)相关联的机制。使用 DNS 系统将请求名称转换为 IP 地址,使最终用户能够毫不费力地访问其目标域名。大多数 Kubernetes 集群都包含一个默认配置的内部 DNS 服务,以提供一种轻量级的服务发现方法。即使在节点之间创建、删除或移动 Pod 和服务时,内置的服务发现也能简化应用程序识别 Kubernetes 集群并与之通信的过程。

最近版本的 Kubernetes 中,Kubernetes DNS 服务的技术细节发生了变化。本教程旨在介绍 Kubernetes DNS 服务的 kube-dns 和 CoreDNS 实现。我们将详细了解 Kubernetes DNS 记录,并演示 Kubernetes DNS 的工作原理。

Kubernetes DNS 服务中包含什么?

此前,在 1.11 版本发布之前,Kubernetes DNS 服务是基于 kube-dns 的。然而,安全和隐私仍然是一个严重的问题。后来,Kubernetes 社区在新的 1.11 版本中引入了 CoreDNS,以解决 kube-dns 的安全和稳定性问题。

无论您使用哪个软件版本来处理 DNS 记录,kube-dns 和 CoreDNS 的运行方式都类似:

  • 一个 kube-dns 服务以及一个或多个 Pod 将被创建。
  • kube-dns 服务监控 Kubernetes API 中的服务和端点事件,并酌情更改其 DNS 条目。当您通过创建、编辑或删除操作修改这些 Kubernetes 服务及其相关 Pod 时,这些事件会被自动触发。
  • Kubeletkube-dns 服务的集群 IP 分配给每个新 Pod 的 etc/resolv.conf nameserver 选项,以及合适的 search 设置,以允许使用更短的主机名:
  • 然后,容器化应用程序可以将类似于 example-service.namespace 的主机名解析为相应的集群 IP 地址。

Kubernetes DNS 记录概述

让我们通过一个例子来更好地理解 Kubernetes DNS 记录。Kubernetes 服务的完整 DNS A 记录如下所示:

service.namespace.svc.cluster.local

Pod 将具有此格式的记录,该记录代表 Pod 的真实 IP 地址:

10.32.0.125.namespace.pod.cluster.local

此外, SRV 记录是为 Kubernetes 服务的指定端口创建的:

因此,得益于内置的基于 DNS 的服务发现机制,您的应用程序或微服务可以通过访问一个简单且一致的主机名来连接集群上的其他服务或 Pod。

解析更短的主机名和搜索域

由于在以下文件中设置了搜索域后缀,您并不总是需要使用完整的主机名来访问另一个服务: resolv.conf 文件。如果您要联系同一个命名空间中的服务,可以直接通过其名称进行调用:

如果服务在不同的命名空间中,请在查询中添加 other-service 到查询中:

如果您要访问 pod,至少需要使用以下内容:

只有 .svc 后缀会在默认的 resolv.conf 文件中自动补全。因此,必须将设置指定到 .pod。接下来,让我们详细了解一下我们目前所学到的两种替代 Kubernetes DNS 实现的复杂之处。

Kubernetes DNS 实现

Kubernetes 1.11 版本提供了新的软件来管理 kube-dns 服务,正如在上一节中所提到的。新更新背后的主要原因是为了提高服务的性能和安全性。让我们从头开始介绍 kube-dns 集成。

  1. kube-dns

在之前的 Kubernetes 1.11 版本中, kube-dns 服务有三个容器运行在 kube-dns pod 中,位于 kube-system 命名空间。请看下面的三个容器:

  • kube-dns:运行 SkyDNS 并作为 DNS 查询解析服务运行的容器。
  • dnsmasq:SkyDNS 的回答由 dnsmasq(一种常见的轻量级 DNS 解析器和缓存)进行缓存。
  • sidecar:服务旁的容器,用于执行指标报告并对健康检查做出响应。

由于 Dnsmasq 中的安全漏洞以及 SkyDNS 的可扩展性性能问题,CoreDNS 应运而生。

  1. CoreDNS

作为新的 Kubernetes DNS 服务,CoreDNS 已在 Kubernetes 1.11 中升级为正式版(General Availability)。这意味着它已准备好用于生产环境,并将被许多安装工具和托管 Kubernetes 提供商用作默认的集群 DNS 服务。

CoreDNS 是一个灵活且可扩展的 DNS 服务器,充当 Kubernetes DNS 集群。它执行前一个系统的所有功能。DNS 容器负责解析和缓存 DNS 查询。CoreDNS 在单个容器中响应健康检查并提供指标。此外,它还解决了一些微小的缺陷,并提供了解决性能和安全问题的新功能:

  • 解决了 stubDomains 的使用与外部服务之间的一些冲突。
  • 通过随机化返回某些条目的顺序,CoreDNS 可以改进基于 DNS 的 轮询负载均衡.
  • 通过更好地遍历在 resolv.conf 中定义的每个搜索域后缀,一个名为 autopath 的功能可以在解析外部主机名时提高 DNS 响应时间。
  • 即使 pod 不存在,kube-dns 10.32.0.125.namespace.pod.cluster.local 也总是会解析为 10.32.0.125。CoreDNS 提供了一种 pod 验证模式,只有在存在具有正确 IP 地址和命名空间的 pod 时才会进行解析。

要深入了解 Kubernetes endpoints, autopaths、以及 wildcards,请查看关于如何 Kubernetes 允许从其集群中读取区域数据 的教程。

自定义功能

Kubernetes 允许您配置 DNS pod 并自定义集群的 DNS 解析,这得益于 Kubernetes 的 自定义 DNS 服务。管理员可以利用这些服务来更改在 resolv.conf 中定义的上游名称服务器或搜索域后缀。最重要的是,还有一个附加功能,可以使用 dnsConfig 选项来个性化 pod 和容器:

Kubernetes DNS Demo Pod Yaml

更新此配置将强制重写 pod 的 resolv.conf,从而使更改生效。上述设置将创建一个包含 nameserver 203.0.113.44search custom.dns.local 行的文件,这会直接转换为普通的 resolv.conf 选项。

结论

在本教程中,我们带您了解了 Kubernetes DNS 服务的基础知识及其在不同版本中的实现。我们还结合示例讨论了 Kubernetes DNS 记录。此外,我们还重点介绍了一些用于自定义 pod 和解析 DNS 查询的其他配置选项。这涵盖了 Kubernetes DNS 服务的基础知识,但您的学习不应止步于此。请查看Kubernetes 官方文档以深入了解该主题。

为了进一步拓展您的 DevOps 知识并深入了解 Kubernetes 核心要素,请查看我们博客:

祝您计算愉快!

author

Pranay Kapgate

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。