这篇文章发表已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

在 Kubernetes 中配置私有 DNS 区域和上游名称服务器

编者按:这篇文章是关于 Kubernetes 1.6 新特性的系列深入文章的一部分

许多用户都有现有的域名区域,他们希望将其集成到 Kubernetes DNS 命名空间中。例如,混合云用户可能希望在集群内解析其内部的“.corp”域地址。其他用户可能有一个由非 Kubernetes 服务发现系统(如 Consul)填充的区域。我们很高兴地宣布,在 Kubernetes 1.6 中,kube-dns 增加了对可配置的私有 DNS 区域(通常称为“存根域”)和外部上游 DNS 名称服务器的支持。在这篇博文中,我们将介绍如何配置和使用此功能。

默认查找流程

Kubernetes 当前支持两种 DNS 策略,它们使用 dnsPolicy 标志在每个 pod 的基础上指定:“Default” 和 “ClusterFirst”。如果未显式指定 dnsPolicy,则使用 “ClusterFirst”。

  • 如果 dnsPolicy 设置为 “Default”,则名称解析配置将从运行 pod 的节点继承。注意:此功能不能与 dnsPolicy: “Default” 结合使用。
  • 如果 dnsPolicy 设置为 “ClusterFirst”,则 DNS 查询将发送到 kube-dns 服务。对于以配置的集群域后缀为根的域(在上面的示例中,任何以 “.cluster.local” 结尾的地址)的查询,将由 kube-dns 服务响应。所有其他查询(例如,www.kubernetes.io)将转发到从节点继承的上游名称服务器。在此功能之前,通常通过用自定义解析器替换上游 DNS 来引入存根域。然而,这导致自定义解析器本身成为 DNS 解析的关键路径,其中可伸缩性和可用性问题可能导致集群失去 DNS 功能。此功能允许用户在不接管整个解析路径的情况下引入自定义解析。

自定义 DNS 流程

从 Kubernetes 1.6 开始,集群管理员可以通过为 kube-dns 提供 ConfigMap 来指定自定义存根域和上游名称服务器。例如,下面的配置插入一个存根域和两个上游名称服务器。如所指定,后缀为 “.acme.local” 的 DNS 请求将转发到 1.2.3.4 侦听的 DNS。此外,Google 公共 DNS 将为上游查询提供服务。有关数据格式的一些说明,请参阅本节末尾的 ConfigMap 配置说明。

apiVersion: v1

kind: ConfigMap

metadata:

  name: kube-dns

  namespace: kube-system

data:

  stubDomains: |

    {“acme.local”: [“1.2.3.4”]}

  upstreamNameservers: |

    [“8.8.8.8”, “8.8.4.4”]

下图显示了上述配置中指定的 DNS 查询流程。将 dnsPolicy 设置为 “ClusterFirst” 时,DNS 查询首先发送到 kube-dns 中的 DNS 缓存层。从这里,将检查请求的后缀,然后转发到适当的 DNS。在这种情况下,带有集群后缀(例如:“.cluster.local”)的名称将发送到 kube-dns。带有存根域后缀(例如:“.acme.local”)的名称将发送到配置的自定义解析器。最后,与任何这些后缀都不匹配的请求将转发到上游 DNS。

下面是一个示例域名表以及这些域名的查询目标

域名响应查询的服务器
kubernetes.default.svc.cluster.localkube-dns
foo.acme.local自定义 DNS (1.2.3.4)
widget.com上游 DNS(8.8.8.8,8.8.4.4 之一)

ConfigMap 配置说明

  • stubDomains(可选)

    • 格式:使用 DNS 后缀键(例如,“acme.local”)的 JSON 映射,以及由 DNS IP 的 JSON 数组组成的值。
    • 注意:目标名称服务器本身可以是 Kubernetes 服务。例如,您可以运行自己的 dnsmasq 副本,将自定义 DNS 名称导出到 ClusterDNS 命名空间。
  • upstreamNameservers(可选)

    • 格式:DNS IP 的 JSON 数组。
    • 注意:如果指定,则指定的值将替换默认从节点的 /etc/resolv.conf 获取的名称服务器。
    • 限制:最多可以指定三个上游名称服务器

示例 #1:添加 Consul DNS 存根域

在此示例中,用户有一个 Consul DNS 服务发现系统,他们希望将其与 kube-dns 集成。consul 域服务器位于 10.150.0.1,所有 consul 名称的后缀均为 “.consul.local”。要配置 Kubernetes,集群管理员只需创建一个如下所示的 ConfigMap 对象即可。注意:在此示例中,集群管理员不希望覆盖节点的上游名称服务器,因此他们不需要指定可选的 upstreamNameservers 字段。

apiVersion: v1

kind: ConfigMap

metadata:

  name: kube-dns

  namespace: kube-system

data:

  stubDomains: |

    {“consul.local”: [“10.150.0.1”]}

示例 #2:替换上游名称服务器

在此示例中,集群管理员希望显式强制所有非集群 DNS 查找都通过他们自己在 172.16.0.1 的名称服务器进行。同样,这很容易实现;他们只需要创建一个 ConfigMap,其中 upstreamNameservers 字段指定所需的名称服务器。

apiVersion: v1

kind: ConfigMap

metadata:

  name: kube-dns

  namespace: kube-system

data:

  upstreamNameservers: |

    [“172.16.0.1”]




**Get involved**  

If you’d like to contribute or simply help provide feedback and drive the roadmap, [join our community](https://github.com/kubernetes/community#kubernetes-community). Specifically for network related conversations participate though one of these channels:  

- Chat with us on the Kubernetes [Slack network channel](https://kubernetes.slack.com/messages/sig-network/)
- Join our Special Interest Group, [SIG-Network](https://github.com/kubernetes/community/wiki/SIG-Network), which meets on Tuesdays at 14:00 PT
Thanks for your support and contributions. Read more in-depth posts on what's new in Kubernetes 1.6 [here](https://kubernetes.ac.cn/blog/2017/03/five-days-of-kubernetes-1-6).


- Post questions (or answer questions) on [Stack Overflow](http://stackoverflow.com/questions/tagged/kubernetes)
- Join the community portal for advocates on [K8sPort](http://k8sport.org/)
- Get involved with the Kubernetes project on [GitHub](https://github.com/kubernetes/kubernetes)
- Follow us on Twitter [@Kubernetesio](https://twitter.com/kubernetesio) for latest updates
- Connect with the community on [Slack](http://slack.k8s.io/)
- [Download](http://get.k8s.io/) Kubernetes