本页展示了如何添加自定义私有 DNS 域(存根域)和上游域名服务器。
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
To check the version, enter kubectl version
.
kube-dns
插件。通过为 kube-dns (kube-system:kube-dns
)提供 ConfigMap,集群管理员能够指定自定义存根域和上游域名服务器。
例如,下面的 ConfigMap 建立了一个 DNS 配置,它具有一个单独的存根域和两个上游域名服务器:
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"]
按如上说明,具有 “.acme.local” 后缀的 DNS 请求被转发到 DNS 1.2.3.4。Google 公共 DNS服务器 为上游查询提供服务。 下表描述了具有特定域名的查询如何映射到它们的目标 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 选项 获取更多关于配置选项格式的详细信息。
可以为每个 Pod 设置 DNS 策略。
当前 Kubernetes 支持两种 Pod 特定的 DNS 策略:“Default” 和 “ClusterFirst”。
可以通过 dnsPolicy
标志来指定这些策略。
注意:“Default” 不是默认的 DNS 策略。如果没有显式地指定 dnsPolicy
,将会使用 “ClusterFirst”。
如果 dnsPolicy
被设置为 “Default”,则名字解析配置会继承自 Pod 运行所在的节点。
自定义上游域名服务器和存根域不能够与这个策略一起使用。
如果 dnsPolicy
被设置为 “ClusterFirst”,处理名字解析有所不同,*依赖于是否配置了存根域和上游 DNS 服务器*。
未进行自定义配置:没有匹配上配置的集群域名后缀的任何请求,例如 “www.kubernetes.io”,将会被转发到继承自节点的上游域名服务器。
进行自定义配置:如果配置了存根域和上游 DNS 服务器(类似于 前面示例 配置的内容),DNS 查询将基于下面的流程对请求进行路由:
查询首先被发送到 kube-dns 中的 DNS 缓存层。
从缓存层,检查请求的后缀,并根据下面的情况转发到对应的 DNS 上:
*具有集群后缀的名字*(例如 “.cluster.local”):请求被发送到 kube-dns。
*具有存根域后缀的名字*(例如 “.acme.local”):请求被发送到配置的自定义 DNS 解析器(例如:监听在 1.2.3.4)。
*未能匹配上后缀的名字*(例如 “widget.com”):请求被转发到上游 DNS(例如:Google 公共 DNS 服务器,8.8.8.8 和 8.8.4.4)。
kube-dns kube-system:kube-dns
对应的 ConfigMap 选项如下所示:
字段 | 格式 | 描述 |
---|---|---|
stubDomains (可选) |
使用 DNS 后缀作为键(例如 “acme.local”)的 JSON map,以及由 DNS IP 的 JSON 数组组成的值。 | 目标域名服务器可能是一个 Kubernetes Service。例如,可以运行自己的 dnsmasq 副本,将 DNS 名字暴露到 ClusterDNS namespace 中。 |
upstreamNameservers (可选) |
DNS IP 的 JSON 数组。 | 注意:如果指定,则指定的值会替换掉被默认从节点的 /etc/resolv.conf 中获取到的域名服务器。限制:最多可以指定三个上游域名服务器。 |
在这个例子中,用户有一个 Consul DNS 服务发现系统,他们希望能够与 kube-dns 集成起来。 Consul 域名服务器地址为 10.150.0.1,所有的 Consul 名字具有后缀 “.consul.local”。 要配置 Kubernetes,集群管理员只需要简单地创建一个 ConfigMap 对象,如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"consul.local": ["10.150.0.1"]}
注意,集群管理员不希望覆盖节点的上游域名服务器,所以他们不会指定可选的 upstreamNameservers
字段。
在这个示例中,集群管理员不希望显式地强制所有非集群 DNS 查询进入到他们自己的域名服务器 172.16.0.1。
而且这很容易实现:他们只需要创建一个 ConfigMap,upstreamNameservers
字段指定期望的域名服务器即可:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
upstreamNameservers: |
["172.16.0.1"]
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.