Kubernetes DNS服务简介

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 介绍 域名系统(DNS)是一种用于将各种类型的信息(例如IP地址)与易于记忆的名称相关联的系统。 默认情况下,大多数Kubernetes群集会自动配置内部DNS服务,以便为服务发现提供轻量级机制。 内置的服务发现使应用程序更容易在Kubernetes集群上相互查找和通信,即使在节点之间创建,删除和移动Pod和服务时也是如此。

介绍

域名系统(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.44 search custom.dns.local 这几行。

结论

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

本文转自DockOne-Kubernetes DNS服务简介

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
113 3
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
148 60
|
3月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
280 62
|
2月前
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
64 1
|
2月前
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
58 3
|
2月前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
2月前
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
2月前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
2月前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
62 0
|
2月前
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理

相关产品

  • 云解析DNS