摘要:我们很高兴地宣布增加了对可配置私有区域(通常称为存根域和外部上游名称服务器)的支持。 例如,以下配置插入一个存根域和两个上游名称服务器。 例如,带有存根域后缀的名称将发送到配置的自定义解析器。
许多用户希望将自己的域名区域(现有的域名区域)集成到 Kubernetes DNS 命名空间中。 例如,混合云用户可能希望在集群内解析内部“.corp”域地址。 其他用户可能拥有由非 Kubernetes 服务发现系统(例如 Consul)组成的区域。 在 Kubernetes 1.6 中,我们很高兴地宣布 kube-dns 添加了对可配置私有 DNS 区域(通常称为“存根域”)和外部上游 DNS 名称服务器的支持。 这篇博文解释了如何设置和使用此功能。
默认搜索流
Kubernetes 目前使用 dnsPolicy 标志在每个 pod 上使用两个指定的搜索流。 。
“默认”
“ClusterFirst”
如果未显式指定 dnsPolicy,则默认使用“ClusterFirst”。
如果设置了 dnsPolicy 如果设置为“default”,则名称解析设置将从运行 pod 的节点继承。 注意:此功能不适用于 dnsPolicy:“默认”。
如果 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: v1kind: ConfigMapmetadata: name: kube-dns 命名空间: kube-systemdata: StubDomains: | {"acme.local": ["1.2.3.4"]}上游名称服务器: | [ "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.local | kube-dns |
foo.acme.local | 自定义 DNS (1.2.3.4) |
widget.com | 上游DNS(8.8.8.8 或 8.8.4.4) |
ConfigMap 配置说明
stubDomains 存根区域 (可选)
格式:JSON 映射,其值由 DNS 后缀键(例如“acme.local”)和 DNS IP 的 JSON 数组组成。
注意:目标名称服务本身可能是 Kubernetes 服务。 例如,您可以运行自己的 dnsmasq 副本,将自定义 DNS 名称导出到集群 DNS 命名空间。
upstreamNameservers 上游名称服务(可选)
格式:DNS IP 的 JSON 数组。
注意:如果指定,指定的值将替换默认从节点的 /etc/resolv.conf 获取的名称服务。
限制:您最多可以指定 3 个上游名称。 服务器
示例1:添加Consul DNS存根域
在此示例中,用户有一个他想要与之交互的数据库库贝。 -dns 集成 Consul DNS 服务发现系统。 领事域服务器位于10.150.0.1,所有领事名称均带有后缀“.consul.local”。 要配置 Kubernetes,集群管理员只需创建一个 ConfigMap 对象,如下所示。 注意:在此示例中,集群管理员不想覆盖节点的上游名称服务器,因此无需指定可选的upstreamNameservers 字段。
apiVersion: v1kind: ConfigMapmetadata: name: kube-dns 命名空间: kube-systemdata: StubDomains: | {"consul.local": ["10.150.0.1"]}
示例#2:上游名称服务器替换
在此示例中,集群管理员在我明确指出的 172.16.0.1 服务器上执行所有非集群 DNS 查找。强制它传递名称。 同样,这很容易实现。 您需要做的就是创建一个 ConfigMap,使用 uploadNameservers 字段指定所需的名称服务器。
apiVersion: v1kind: ConfigMapmetadata: name: kube-dns 命名空间: kube-systemdata:upstreamNameservers: | ["172.16.0.1"]
概览
以上是kube-dns实现的解决方案。 StubDomain和upstreamNameserver是通过代理插件在coredns中实现的。 接下来要看的是 coredns。
评论前必须登录!
注册