全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:DNS概述

更新时间:Mar 12, 2025

在Kubernetes集群中,Pod访问Service或集群外的服务时使用的是域名,但是域名需要被解析为IP地址才可访问。DNS(Domain Name System)就用于这个场景,它保存了名称与IP地址的对应关系。通过本文,您可了解DNS的基础知识、ACK中的DNS组件以及DNS配置。

DNS域名解析原理

虽然互联网设备通过IP地址互相通信,但是域名本身包含了语义,比起IP地址更容易记忆。因此,绝大多数情况下,客户端会通过域名发起请求。下图展示了客户端向example.com发送请求时的流程:

image
  1. 服务器向DNS服务器注册自身的IP地址与域名,DNS服务器会保存对应的记录。

  2. 客户端向DNS服务器询问example.com对应的IP地址。

  3. DNS服务器根据保存的记录将IP返回给客户端。

  4. 客户端使用IP地址访问目标服务器。

集群中的DNS组件

ACK托管集群中,有两个负责DNS的组件,CoreDNS与NodeLocal DNSCache。在您了解它们的作用之前,请您阅读下方的内容,了解集群中DNS的基础知识。

在大多数情况下,Service只会显示一个简短的名称。但在进行DNS查询时,会使用Service的完整域名,格式为“<servicename>.<namespace>.svc.<ClusterDomain>”。其中<ClusterDomain>为集群本地顶级域名,默认为cluster.local,支持自定义配置。例如,在default命名空间中,名为database-svc的Service,它的完整域名为database-svc.default.svc.cluster.local

在Pod创建时,节点上的kubelet会为Pod配置/etc/resolv.conf配置文件,Pod进行DNS查询时会参考此文件中的配置。

CoreDNS

CoreDNS是Kubernetes集群中负责DNS解析的组件,能够支持解析集群内部自定义服务域名和集群外部域名。CoreDNS项目由CNCF托管。关于CoreDNS的更多信息,请参见CoreDNS: DNS and Service Discovery

与开源Kubernetes标准相同,ACK集群默认安装CoreDNS作为DNS服务器。CoreDNS以Deployment的方式部署在了集群的kube-system命名空间下。kube-dns则是CoreDNS所属的ClusterIP类型的Service。CoreDNS的配置方法,请参见CoreDNS配置说明

通过kubectl查看CoreDNS所属的资源

  1. 查看Deployment

    kubectl get deployment -l k8s-app=kube-dns -n kube-system 

    预期输出:

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   2/2     2            2           1h
  2. 查看Service

    kubectl get service -n kube-system kube-dns

    预期输出:

    NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
    kube-dns   ClusterIP   172.**.**.**   <none>        53/UDP,53/TCP,9153/TCP   1h

下面的示例中,处于default命名空间的Pod尝试访问database-svc,经历了以下流程:

image
  1. Pod查看/etc/resolv.conf配置文件,确定了DNS服务器的IP为172.0.XX.X,这是kube-dns的ClusterIP。

  2. Pod向kube-dns发起DNS查询,它会以search中的值作为后缀发起查询,即依次尝试查询:

    1. database-svc.default.svc.cluster.local(与Pod同一命名空间的Service)

    2. database-svc.svc.cluster.local(其他命名空间的Service)

    3. database-svc.cluster.local(集群范围内的域名)

    4. database-svc(集群外域名)

  3. CoreDNS Pod返回结果,对应的IP为172.4.XX.X

  4. Pod使用此IP访问目标服务database-svc

NodeLocal DNSCache

NodeLocal DNSCache会在每个Worker节点配置DNS缓存,可以降低CoreDNS的压力,提升集群DNS的稳定性和可用性。 我们总是建议您在集群下安装该组件,提升DNS 解析的稳定性。您可参见使用NodeLocal DNSCache安装并使用组件。

下面的示例中,在安装了NodeLocal DNSCache且给default命名空间打上node-local-dns-injection: "enabled"标签后,处于default命名空间的Pod尝试访问database-svc,经历了以下流程:

image
  1. Pod会首先查看所在节点的DNS缓存。

  2. 根据节点DNS缓存是否命中,此时会分为两种情况:

    1. 缓存命中,即节点DNS缓存中有database-svc记录,则缓存返回结果,Pod使用结果访问服务。

    2. 缓存未命中,即节点DNS缓存中没有database-svc记录,则仍旧通过CoreDNS获取结果。从CoreDNS获取的结果将同步到节点DNS缓存以便后续使用。

集群DNS配置

集群中的DNS配置可分为下列三个维度,它们分别作用于不同的范围。

集群配置(全局)

ClusterDomain是每个节点的kubelet配置,但是在整个集群内所有节点的kubelet中都应保持一致,否则会出现网络错误。

  • ClusterDomain

    ClusterDomain是集群本地顶级域名,即集群中所有Service完整域名的默认后缀,默认为cluster.local。ClusterDomain配置通常用于区分集群内网络与集群外网络。在创建集群时,您可对ClusterDomain自定义,请注意不要与您常用的外部域名重合。

    image.png

节点配置

  • resolveConf

    resolveConf指定节点上 DNS 配置文件的路径。当 Pod 的 dnsPolicyDefault 时,kubelet 会将 resolveConf 指定的文件(默认 /etc/resolv.conf)复制到 Pod 的 /etc/resolv.conf 中。

Pod配置

  • 每个Pod都有两个配置:dnsPolicydnsConfig,您可通过它们为Pod自定义DNS策略。dnsPolicy定义Pod的DNS解析策略,dnsConfig 用于自定义 DNS 服务器和搜索域。请参见DNS策略配置和域名解析说明,了解如何结合场景使用dnsPolicydnsConfig