Kubernetes DNS 使用 systemd 解析条目的理想设置
Ideal settings for Kubernetes DNS to use systemd resolvd entires
我即将使用 KubeSpray 部署一个新的 K8S 裸机集群。
在我的代理上,我已解决 运行,它不从 /etc/resolvd.conf
获取 DNS 设置,而是从 /etc/systemd/resolved.conf
.
获取 DNS 设置
那么最好使用哪个 DNS 设置?核心域名系统?库伯域名系统?只想确保我部署的 pods 使用与我的代理节点上配置的相同的 DNS 服务器。
我应该选择什么
# Can be dnsmasq_kubedns, kubedns, coredns, coredns_dual, manual or none
dns_mode: kubedns
# Set manual server if using a custom cluster DNS server
#manual_dns_server: 10.x.x.x
# Can be docker_dns, host_resolvconf or none
resolvconf_mode: docker_dns
?
从 Kubernetes v1.12 开始,CoreDNS 是推荐的 DNS 服务器,取代了 kube-dns。但是,kube-dns 可能仍会默认使用某些 Kubernetes 安装程序工具进行安装。请参阅安装程序提供的文档以了解默认安装的 DNS 服务器。
CoreDNS 部署公开为具有静态 IP 的 Kubernetes 服务。 CoreDNS 和 kube-dns 服务都在 metadata.name
字段中命名为 kube-dns
。这样做是为了与依赖遗留 kube-dns
服务名称来解析集群内部地址的工作负载有更好的互操作性。它抽象出哪个 DNS 提供商 运行 位于该公共端点后面的实施细节。
如果 Pod 的 dnsPolicy
设置为“default
”,它会从 Pod 运行 所在的节点继承名称解析配置。 Pod 的 DNS 解析应该与节点的行为相同。但是看到 Known issues.
如果你不想这样,或者如果你想要 pods 的不同 DNS 配置,你可以使用 kubelet 的 --resolv-conf
标志。将此标志设置为“”以防止 Pods 继承 DNS。将其设置为有效的文件路径以指定 /etc/resolv.conf
以外的文件用于 DNS 继承。
一些 Linux 发行版(例如 Ubuntu)默认使用本地 DNS 解析器(systemd-resolved)。 Systemd-resolved 将 /etc/resolv.conf
移动并替换为一个存根文件,该存根文件在解析上游服务器中的名称时可能会导致致命的转发循环。这可以通过使用 kubelet 的 --resolv-conf
标志指向正确的 resolv.conf
(使用 systemd-resolved
,这是 /run/systemd/resolve/resolv.conf
)手动修复。 kubeadm 1.11 自动检测 systemd-resolved
,并相应地调整 kubelet 标志。
Kubernetes 安装不会将节点的 resolv.conf
文件配置为默认使用集群 DNS,因为该过程本质上是特定于分发的。这可能最终会实现。
Linux 的 libc 不可能卡住 (see this bug from 2005),限制只有 3 个 DNS nameserver
记录和 6 个 DNS search
记录。 Kubernetes 需要消耗 1 nameserver
条记录和 3 search
条记录。这意味着如果本地安装已经使用 3 nameserver
s 或使用超过 3 search
es,其中一些设置将丢失。作为部分解决方法,节点可以 运行 dnsmasq
这将提供更多 nameserver
条目,但不会提供更多 search
条目。您还可以使用 kubelet 的 --resolv-conf
标志。
如果您使用 Alpine 3.3 版或更早版本作为基础映像,由于 Alpine 的一个已知问题,DNS 可能无法正常工作。查看 here 了解更多信息。
我即将使用 KubeSpray 部署一个新的 K8S 裸机集群。
在我的代理上,我已解决 运行,它不从 /etc/resolvd.conf
获取 DNS 设置,而是从 /etc/systemd/resolved.conf
.
那么最好使用哪个 DNS 设置?核心域名系统?库伯域名系统?只想确保我部署的 pods 使用与我的代理节点上配置的相同的 DNS 服务器。
我应该选择什么
# Can be dnsmasq_kubedns, kubedns, coredns, coredns_dual, manual or none
dns_mode: kubedns
# Set manual server if using a custom cluster DNS server
#manual_dns_server: 10.x.x.x
# Can be docker_dns, host_resolvconf or none
resolvconf_mode: docker_dns
?
从 Kubernetes v1.12 开始,CoreDNS 是推荐的 DNS 服务器,取代了 kube-dns。但是,kube-dns 可能仍会默认使用某些 Kubernetes 安装程序工具进行安装。请参阅安装程序提供的文档以了解默认安装的 DNS 服务器。
CoreDNS 部署公开为具有静态 IP 的 Kubernetes 服务。 CoreDNS 和 kube-dns 服务都在 metadata.name
字段中命名为 kube-dns
。这样做是为了与依赖遗留 kube-dns
服务名称来解析集群内部地址的工作负载有更好的互操作性。它抽象出哪个 DNS 提供商 运行 位于该公共端点后面的实施细节。
如果 Pod 的 dnsPolicy
设置为“default
”,它会从 Pod 运行 所在的节点继承名称解析配置。 Pod 的 DNS 解析应该与节点的行为相同。但是看到 Known issues.
如果你不想这样,或者如果你想要 pods 的不同 DNS 配置,你可以使用 kubelet 的 --resolv-conf
标志。将此标志设置为“”以防止 Pods 继承 DNS。将其设置为有效的文件路径以指定 /etc/resolv.conf
以外的文件用于 DNS 继承。
一些 Linux 发行版(例如 Ubuntu)默认使用本地 DNS 解析器(systemd-resolved)。 Systemd-resolved 将 /etc/resolv.conf
移动并替换为一个存根文件,该存根文件在解析上游服务器中的名称时可能会导致致命的转发循环。这可以通过使用 kubelet 的 --resolv-conf
标志指向正确的 resolv.conf
(使用 systemd-resolved
,这是 /run/systemd/resolve/resolv.conf
)手动修复。 kubeadm 1.11 自动检测 systemd-resolved
,并相应地调整 kubelet 标志。
Kubernetes 安装不会将节点的 resolv.conf
文件配置为默认使用集群 DNS,因为该过程本质上是特定于分发的。这可能最终会实现。
Linux 的 libc 不可能卡住 (see this bug from 2005),限制只有 3 个 DNS nameserver
记录和 6 个 DNS search
记录。 Kubernetes 需要消耗 1 nameserver
条记录和 3 search
条记录。这意味着如果本地安装已经使用 3 nameserver
s 或使用超过 3 search
es,其中一些设置将丢失。作为部分解决方法,节点可以 运行 dnsmasq
这将提供更多 nameserver
条目,但不会提供更多 search
条目。您还可以使用 kubelet 的 --resolv-conf
标志。
如果您使用 Alpine 3.3 版或更早版本作为基础映像,由于 Alpine 的一个已知问题,DNS 可能无法正常工作。查看 here 了解更多信息。