kubernetes pod 无法解析本地主机名,但可以解析外部主机名,例如 google.com
kubernetes pod cannot resolve local hostnames but can resolve external ones like google.com
我正在尝试 kubernetes,但似乎遇到了一些障碍。问题是,在我的 pod 中,我无法卷曲本地主机名,例如 wrkr1 或 wrkr2 (我网络上的机器主机名)但可以成功解析主机名,例如 google.com 或 whosebug.com.
我的集群是一个基本设置,包含一个主节点和 2 个工作节点。
pod 中的工作原理:
从 pod 卷曲到 google.com -- 有效
从 pod 卷曲到另一个服务 (kubernetes) -- 有效
通过其 IP 地址(例如 192)curl 到同一 LAN 上的另一台机器。168.x.x -- 有效
通过其主机名(例如 wrkr1)curl 到同一 LAN 上的另一台机器 -- 不起作用
节点托管 pod 的工作原理:
- 卷曲到 google.com --works
- 通过 curl 到同一 LAN 上的另一台机器
它的 IP 地址如 192.168.x.x -- 有效
- 卷曲到另一台机器
在同一个 LAN 上通过其主机名(例如 wrkr1)——有效。
Note: the pod cidr is completely different from the IP range used in
LAN
该节点包含一个主机文件,其条目对应于 wrkr1 的 IP 地址(尽管我已经检查过节点也可以在没有它的情况下解析主机名,但我在某处读到一个 pod 继承了它的节点 DNS 解析,所以我保留了条目)
Kubernetes 版本:1.19.14
Ubuntu 版本:18.04 LTS
需要帮助了解这是否是正常行为,如果我希望 pod 也能够解析本地 LAN 上的主机名,可以做什么?
会发生什么
Need help as to whether this is normal behavior
这是正常行为,因为在您的网络中没有托管虚拟机的 DNS 服务器,而 kubernetes 在集群内有自己的 DNS 服务器,它根本不知道您的主机上发生了什么,尤其是在 /etc/hosts
因为 pods 根本无权访问此文件。
I read somewhere that a pod inherits its nodes DNS resolution so I've
kept the entry
这是棘手的事情发生的地方。 There are four available DNS policies
应用于每个 pod。我们来看看其中两个常用的:
- "Default":Pod继承pods 运行所在节点的名称解析配置。有关详细信息,请参阅相关讨论。
- "ClusterFirst":任何与配置的集群域后缀不匹配的 DNS 查询,例如"www.kubernetes.io",将转发到继承自的上游名称服务器节点。集群管理员可能配置了额外的存根域和上游 DNS 服务器
有史以来最棘手的部分是(来自上面的 link):
Note: "Default" is not the default DNS policy. If dnsPolicy is not
explicitly specified, then "ClusterFirst" is used.
这意味着所有未设置 DNS policy
的 pods 将是 运行 和 ClusterFirst
,他们将无法看到 /etc/resolv.conf
在主机上。我尝试将其更改为 Default
,实际上,它可以解析主机可以解析的所有内容,但是内部解析停止工作,所以它不是一个选项。
例如 coredns
部署是 运行 并且 Default
dnsPolicy 允许 coredns
解析主机。
如何解决这个问题
1.将 local
域添加到 coreDNS
这将需要为每个主机添加 A
条记录。这是编辑过的 coredns configmap 的一部分:
这应该在 .:53 {
块内
file /etc/coredns/local.record local
这部分紧接在上面的块结束之后(SOA信息取自示例,这里没有任何区别):
local.record: |
local. IN SOA sns.dns.icann.org. noc.dns.icann.org. 2015082541 7200 3600 1209600 3600
wrkr1. IN A 172.10.10.10
wrkr2. IN A 172.11.11.11
然后 coreDNS
应该添加部署以包含此文件:
$ kubectl edit deploy coredns -n kube-system
volumes:
- configMap:
defaultMode: 420
items:
- key: Corefile
path: Corefile
- key: local.record # 1st line to add
path: local.record # 2nd line to add
name: coredns
并重新启动 coreDNS
部署:
$ kubectl rollout restart deploy coredns -n kube-system
以防万一检查 coredns
pods 是否为 running and ready
:
$ kubectl get pods -A | grep coredns
kube-system coredns-6ddbbfd76-mk2wv 1/1 Running 0 4h46m
kube-system coredns-6ddbbfd76-ngrmq 1/1 Running 0 4h46m
如果一切正确,现在新创建的 pods 将能够通过名称解析主机。 Please find an example in coredns documentation
2。在网络中设置DNS服务器
虽然 avahi
看起来类似于 DNS 服务器,但它并不像 DNS 服务器。无法将 requests forwarding
从 coredns
设置为 avahi
,但可以在网络中设置正确的 DNS 服务器,这样一切都会得到解决。
3。部署 avahi
到 kubernetes 集群
avahi
here 有一个现成的图像。如果将其部署到 dnsPolicy
设置为 ClusterFirstWithHostNet
的集群中,最重要的是 hostNetwork: true
它将能够使用主机适配器发现网络中的所有可用主机。
有用links:
我正在尝试 kubernetes,但似乎遇到了一些障碍。问题是,在我的 pod 中,我无法卷曲本地主机名,例如 wrkr1 或 wrkr2 (我网络上的机器主机名)但可以成功解析主机名,例如 google.com 或 whosebug.com.
我的集群是一个基本设置,包含一个主节点和 2 个工作节点。
pod 中的工作原理:
从 pod 卷曲到 google.com -- 有效
从 pod 卷曲到另一个服务 (kubernetes) -- 有效
通过其 IP 地址(例如 192)curl 到同一 LAN 上的另一台机器。168.x.x -- 有效
通过其主机名(例如 wrkr1)curl 到同一 LAN 上的另一台机器 -- 不起作用
节点托管 pod 的工作原理:
- 卷曲到 google.com --works
- 通过 curl 到同一 LAN 上的另一台机器 它的 IP 地址如 192.168.x.x -- 有效
- 卷曲到另一台机器 在同一个 LAN 上通过其主机名(例如 wrkr1)——有效。
Note: the pod cidr is completely different from the IP range used in LAN
该节点包含一个主机文件,其条目对应于 wrkr1 的 IP 地址(尽管我已经检查过节点也可以在没有它的情况下解析主机名,但我在某处读到一个 pod 继承了它的节点 DNS 解析,所以我保留了条目)
Kubernetes 版本:1.19.14
Ubuntu 版本:18.04 LTS
需要帮助了解这是否是正常行为,如果我希望 pod 也能够解析本地 LAN 上的主机名,可以做什么?
会发生什么
Need help as to whether this is normal behavior
这是正常行为,因为在您的网络中没有托管虚拟机的 DNS 服务器,而 kubernetes 在集群内有自己的 DNS 服务器,它根本不知道您的主机上发生了什么,尤其是在 /etc/hosts
因为 pods 根本无权访问此文件。
I read somewhere that a pod inherits its nodes DNS resolution so I've kept the entry
这是棘手的事情发生的地方。 There are four available DNS policies
应用于每个 pod。我们来看看其中两个常用的:
- "Default":Pod继承pods 运行所在节点的名称解析配置。有关详细信息,请参阅相关讨论。
- "ClusterFirst":任何与配置的集群域后缀不匹配的 DNS 查询,例如"www.kubernetes.io",将转发到继承自的上游名称服务器节点。集群管理员可能配置了额外的存根域和上游 DNS 服务器
有史以来最棘手的部分是(来自上面的 link):
Note: "Default" is not the default DNS policy. If dnsPolicy is not explicitly specified, then "ClusterFirst" is used.
这意味着所有未设置 DNS policy
的 pods 将是 运行 和 ClusterFirst
,他们将无法看到 /etc/resolv.conf
在主机上。我尝试将其更改为 Default
,实际上,它可以解析主机可以解析的所有内容,但是内部解析停止工作,所以它不是一个选项。
例如 coredns
部署是 运行 并且 Default
dnsPolicy 允许 coredns
解析主机。
如何解决这个问题
1.将 local
域添加到 coreDNS
这将需要为每个主机添加 A
条记录。这是编辑过的 coredns configmap 的一部分:
这应该在 .:53 {
块内
file /etc/coredns/local.record local
这部分紧接在上面的块结束之后(SOA信息取自示例,这里没有任何区别):
local.record: |
local. IN SOA sns.dns.icann.org. noc.dns.icann.org. 2015082541 7200 3600 1209600 3600
wrkr1. IN A 172.10.10.10
wrkr2. IN A 172.11.11.11
然后 coreDNS
应该添加部署以包含此文件:
$ kubectl edit deploy coredns -n kube-system
volumes:
- configMap:
defaultMode: 420
items:
- key: Corefile
path: Corefile
- key: local.record # 1st line to add
path: local.record # 2nd line to add
name: coredns
并重新启动 coreDNS
部署:
$ kubectl rollout restart deploy coredns -n kube-system
以防万一检查 coredns
pods 是否为 running and ready
:
$ kubectl get pods -A | grep coredns
kube-system coredns-6ddbbfd76-mk2wv 1/1 Running 0 4h46m
kube-system coredns-6ddbbfd76-ngrmq 1/1 Running 0 4h46m
如果一切正确,现在新创建的 pods 将能够通过名称解析主机。 Please find an example in coredns documentation
2。在网络中设置DNS服务器
虽然 avahi
看起来类似于 DNS 服务器,但它并不像 DNS 服务器。无法将 requests forwarding
从 coredns
设置为 avahi
,但可以在网络中设置正确的 DNS 服务器,这样一切都会得到解决。
3。部署 avahi
到 kubernetes 集群
avahi
here 有一个现成的图像。如果将其部署到 dnsPolicy
设置为 ClusterFirstWithHostNet
的集群中,最重要的是 hostNetwork: true
它将能够使用主机适配器发现网络中的所有可用主机。