Kubernetes 使用私有 DNS
Kubernetes use private DNS
是否可以在 Kubernetes 中使用私有 DNS?例如,应用程序需要通过其主机名连接到外部数据库。解析 IP 的 DNS 条目存放在私有 DNS 中。
我的 AKS(Azure Kubernetes 服务)运行 版本 1.17 已经使用了新的 coreDNS。
我的第一个尝试是通过配置 pods:
的 /etc/resolve.conf 文件来像在 VM 上一样使用私有 DNS
dnsPolicy: "None"
dnsConfig:
nameservers:
- 10.76.xxx.xxx
- 10.76.xxx.xxx
searches:
- az-q.example.com
options:
- name: ndots
value: "2"
然后我尝试使用configmap来调整coreDNS:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
upstreamNameservers: |
["10.76.xxx.xxx", "10.76.xxx.xxx"]
但我的 pod 每次 运行 部署时都出错:
$ sudo kubectl logs app-homepage-backend-xxxxx -n ingress-nginx
events.js:174
throw er; // Unhandled 'error' event
^
Error: getaddrinfo ENOTFOUND az-q.example.com az-q.example.com:636
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
我错过了什么?
在应用程序的部署配置中设置的 dnsPolicy
是什么?根据this doc:
Custom upstream nameservers and stub domains do not affect Pods with a
dnsPolicy
set to “Default
” or “None
”.
If a Pod’s dnsPolicy
is set to “ClusterFirst
”, its name resolution is
handled differently, depending on whether stub-domain and upstream DNS
servers are configured.
请参阅该文档中的示例以及自定义配置会发生什么。
Everyting 取决于 dnsPolicy 您在应用程序的部署配置文件中设置。
当 Pod 的 dnsPolicy 设置为 “default”,
时,它会从 Pod 运行 所在的节点继承名称解析配置。 Pod 的 DNS 解析应该与节点的行为相同。
1. 许多 Linux 发行版(例如 Ubuntu),使用本地 DNS 解析器
默认(systemd 解析)。 Systemd 解决的移动和替换
/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,因为该过程本身就是
分配特定的。这可能应该实施
终于。
2. Linux 的 libc 不可能被卡住(参见 2005 年的这个错误)
只有 3 个 DNS 名称服务器记录和 6 个 DNS 搜索记录的限制。
Kubernetes 需要消耗 1 个名称服务器记录和 3 个搜索
记录。这意味着如果本地安装已经使用 3
名称服务器或使用超过 3 个搜索,其中一些设置
会迷路。作为部分解决方法,节点可以 运行 dnsmasq
这将提供更多名称服务器条目,但不会提供更多搜索
条目。您还可以使用 kubelet 的 --resolv-conf
标志。
3。确保您没有使用 Alpine 版本 3.3 或更早版本,因为
您的基本映像,DNS 可能无法正常工作。
为了实现您的需求,我会在 pod 清单中使用 dnsPolicy: ClusterFirst
定义,然后在您的集群 DNS 子系统中定义存根区域(专用 DNS 区域)。
为了识别集群 DNS 堆栈,通常检查 kube-system
命名空间中的 pods 运行ning。您很可能会找到以下两者之一:CoreDNS 或 Kube-DNS。
如果您的集群 DNS 运行s 在 CoreDNS 上,则在您的 coredns
configmap 中查找 this 类型的修改。
如果您 运行 在较旧的 Kube-DNS 系统上,则在 kube-dns
configmap 中查找 this 修改。
重要的是,如果您想将此修改应用于主机网络模式下的 pods 运行ning(许多 pods 来自 kube-system
命名空间) ,您需要使用 dnsPolicy: ClusterFirstWithHostNet
节修改它们的清单。
是否可以在 Kubernetes 中使用私有 DNS?例如,应用程序需要通过其主机名连接到外部数据库。解析 IP 的 DNS 条目存放在私有 DNS 中。
我的 AKS(Azure Kubernetes 服务)运行 版本 1.17 已经使用了新的 coreDNS。
我的第一个尝试是通过配置 pods:
的 /etc/resolve.conf 文件来像在 VM 上一样使用私有 DNSdnsPolicy: "None"
dnsConfig:
nameservers:
- 10.76.xxx.xxx
- 10.76.xxx.xxx
searches:
- az-q.example.com
options:
- name: ndots
value: "2"
然后我尝试使用configmap来调整coreDNS:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
upstreamNameservers: |
["10.76.xxx.xxx", "10.76.xxx.xxx"]
但我的 pod 每次 运行 部署时都出错:
$ sudo kubectl logs app-homepage-backend-xxxxx -n ingress-nginx
events.js:174
throw er; // Unhandled 'error' event
^
Error: getaddrinfo ENOTFOUND az-q.example.com az-q.example.com:636
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
我错过了什么?
在应用程序的部署配置中设置的 dnsPolicy
是什么?根据this doc:
Custom upstream nameservers and stub domains do not affect Pods with a
dnsPolicy
set to “Default
” or “None
”.If a Pod’s
dnsPolicy
is set to “ClusterFirst
”, its name resolution is handled differently, depending on whether stub-domain and upstream DNS servers are configured.
请参阅该文档中的示例以及自定义配置会发生什么。
Everyting 取决于 dnsPolicy 您在应用程序的部署配置文件中设置。
当 Pod 的 dnsPolicy 设置为 “default”,
时,它会从 Pod 运行 所在的节点继承名称解析配置。 Pod 的 DNS 解析应该与节点的行为相同。
1. 许多 Linux 发行版(例如 Ubuntu),使用本地 DNS 解析器
默认(systemd 解析)。 Systemd 解决的移动和替换
/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,因为该过程本身就是 分配特定的。这可能应该实施 终于。
2. Linux 的 libc 不可能被卡住(参见 2005 年的这个错误)
只有 3 个 DNS 名称服务器记录和 6 个 DNS 搜索记录的限制。
Kubernetes 需要消耗 1 个名称服务器记录和 3 个搜索
记录。这意味着如果本地安装已经使用 3
名称服务器或使用超过 3 个搜索,其中一些设置
会迷路。作为部分解决方法,节点可以 运行 dnsmasq
这将提供更多名称服务器条目,但不会提供更多搜索
条目。您还可以使用 kubelet 的 --resolv-conf
标志。
3。确保您没有使用 Alpine 版本 3.3 或更早版本,因为 您的基本映像,DNS 可能无法正常工作。
为了实现您的需求,我会在 pod 清单中使用 dnsPolicy: ClusterFirst
定义,然后在您的集群 DNS 子系统中定义存根区域(专用 DNS 区域)。
为了识别集群 DNS 堆栈,通常检查 kube-system
命名空间中的 pods 运行ning。您很可能会找到以下两者之一:CoreDNS 或 Kube-DNS。
如果您的集群 DNS 运行s 在 CoreDNS 上,则在您的 coredns
configmap 中查找 this 类型的修改。
如果您 运行 在较旧的 Kube-DNS 系统上,则在 kube-dns
configmap 中查找 this 修改。
重要的是,如果您想将此修改应用于主机网络模式下的 pods 运行ning(许多 pods 来自 kube-system
命名空间) ,您需要使用 dnsPolicy: ClusterFirstWithHostNet
节修改它们的清单。