我家里有一个 4 节点集群设置,我正在使用它,当我开始尝试进行 pod 到 pod 通信时遇到了问题。我使用 Kubespray 安装节点(1 个“服务器/控制器”和 3 个“节点”)。
问题是我无法通过名称解析服务,只能通过 IP 解析。例如,我使用 Helm 在默认命名空间中启动 Jeknins,服务名称为“jenkins”,但如果我尝试 ping “jenkins”或“jenkins.default”,它不会解析。在 dnsutils pod 中执行dig jenkins
或会产生:dig jenkins.default
/ # dig jenkins.default
; <<>> DiG 9.11.6-P1 <<>> jenkins.default
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 8927
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 229fbf94bb25564ae66dc8f45e7f646e5abb5f9dd4ede1d7 (good)
;; QUESTION SECTION:
;jenkins.default. IN A
;; Query time: 0 msec
;; SERVER: 169.254.25.10#53(169.254.25.10)
;; WHEN: Sat Mar 28 14:51:26 UTC 2020
;; MSG SIZE rcvd: 72
检查/etc/resolv.conf
dnsutils pod 中的文件时,我注意到它设置了一个奇怪的 IP 地址nameserver
:169.254.25.10。查看所有 pod 后,似乎它们都具有相同的配置,但 coredns 服务设置为 10.233.0.3。实际上,所有 IP 都是 10. 某个数字。手动将/etc/resolv.conf
dnsutils pod 更改为使用 10.233.0.3 作为名称服务器似乎可以纠正该 pod 的问题,但我该如何修复所有 pod 的问题?而且 169.254.25.10 IP 到底是从哪里来的?据我所知,我的实际网络 DNS 服务器是 10.0.0.5,而且我的内部网络中没有 169.254 IP。
答案1
正如我们从 Kubernetes dosc 中看到的那样自定义 DNS 服务:
如果 Pod 的
dnsPolicy
设置为“default
”,它将从 Pod 运行的节点继承名称解析配置。Pod 的 DNS 解析应与节点的行为相同。如果您不想这样,或者想要为 Pod 配置不同的 DNS,则可以使用 kubelet 的
--resolv-conf
标志。将此标志设置为“”可防止 Pod 继承 DNS。将其设置为有效的文件路径可指定除/etc/resolv.conf
DNS 继承之外的文件。
至于Pod 的 DNS 策略如下面所述:
DNS 策略可以针对每个 Pod 设置。目前,Kubernetes 支持以下特定于 Pod 的 DNS 策略。这些策略在
dnsPolicy
Pod Spec 的字段中指定。
- “
Default
“:Pod 从其运行的节点继承名称解析配置。请参阅 相关讨论 更多细节。- “
ClusterFirst
“:任何与配置的集群域后缀不匹配的 DNS 查询(例如“www.kubernetes.io
”)都将转发到从节点继承的上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。请参阅 相关讨论 了解在这些情况下如何处理 DNS 查询的详细信息。- “
ClusterFirstWithHostNet
“:对于使用 hostNetwork 运行的 Pod,您应该明确设置其 DNS 策略“ClusterFirstWithHostNet
”。- “ “:它允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。所有 DNS 设置都应该使用 Pod Spec 中的字段
None
提供 。请参阅dnsConfig
Pod 的 DNS 配置 下面的小节。
答案2
169.254.0.0/16 是链接本地地址。我发现这个地址大多是在链接断开时分配的。更多信息 -https://en.wikipedia.org/wiki/Link-local_address。