1. 简介#
在 Kubernetes 中,dnsPolicy
是 Pod spec
中的一个关键字段,它精确地定义了 Pod 内部应如何进行 DNS 解析。当你 Pod 内的应用程序尝试解析一个域名时(无论是集群内部服务如 my-service
,还是外部域名如 google.com
),dnsPolicy
决定了系统应采用哪种解析流程。
2. 四种 DNS 策略#
Kubernetes 提供了四种不同的 DNS 策略,以适应不同的应用场景。
策略 (dnsPolicy ) | 核心行为 | 主要应用场景 |
---|---|---|
ClusterFirst | (默认策略) 集群优先:DNS 请求首先发送到集群内部的 DNS 服务(如 CoreDNS)。如果域名是集群服务,则直接解析;否则,请求被转发到节点的上游 DNS 服务器。 | 绝大多数标准应用。这是最常用、最推荐的配置,因为它无缝地同时支持集群内部和外部的域名解析。 |
Default | 继承节点:Pod 完全忽略集群的 DNS 服务,直接继承其所在工作节点的 /etc/resolv.conf 文件配置。 | 1. 当 Pod 不需要访问集群内其他服务时。 2. 解决与集群 DNS 的特殊兼容性问题。 |
None | 无策略 / 完全自定义:Kubernetes 不为 Pod 应用任何 DNS 配置。你 必须 通过 dnsConfig 字段手动提供完整的 DNS 设置。 | 需要使用一个完全独立的、自定义的 DNS 解析方案,适用于高级网络配置。 |
ClusterFirstWithHostNet | hostNetwork 版集群优先:专为设置了 hostNetwork: true 的 Pod 设计。其行为与 ClusterFirst 类似,但配置方式会适应宿主机网络。 | 当 Pod 需要直接使用宿主机的网络,但同时又希望它能解析集群内的服务时。 |
3. 如何配置#
dnsPolicy
和 dnsConfig
都在 Pod 的 YAML 文件的 spec
部分进行配置。
示例 1:使用 ClusterFirst
(默认)#
如果你不显式设置 dnsPolicy
,它将自动默认为 ClusterFirst
。
|
|
示例 2:使用 Default
策略#
此 Pod 将直接使用其所在节点的 DNS 配置来解析所有域名。
|
|
示例 3:使用 None
和 dnsConfig
进行完全自定义#
这个例子中,我们完全绕过 Kubernetes 的 DNS,直接将 Google DNS 服务器配置给 Pod。
|
|
4. dnsConfig
字段详解#
dnsConfig
字段允许对 DNS 进行更精细的控制,可以与 dnsPolicy
结合使用。
nameservers
: 一个 IP 地址列表,用作 Pod 的 DNS 服务器。最多可以指定 3 个。searches
: 一个 DNS 搜索域列表。当解析一个不包含点 (.
) 的短域名(如my-service
)时,系统会按顺序在这些搜索域下查找。例如,它会依次尝试解析my-service.my-namespace.svc.cluster.local
、my-service.svc.cluster.local
等。options
: 一个对象列表,用于设置 DNS 解析器的选项。name
: 选项的名称 (如ndots
,timeout
)。value
: 选项的值。
注意:当设置了 dnsPolicy
时,dnsConfig
的行为会有所不同:
- 如果
dnsPolicy
是ClusterFirst
,dnsConfig
中提供的nameservers
会被 添加 到 CoreDNS 之后,作为备用。searches
和options
则会与默认值 合并。 - 如果
dnsPolicy
是None
,dnsConfig
必须提供 所有必要 的信息,因为它将是 Pod 唯一的 DNS 配置。
5. 总结#
- 日常使用:保持默认的
ClusterFirst
策略,它能满足 99% 的需求。 - 特殊需求:当需要绕过集群 DNS 时,使用
Default
。 - 高级定制:当需要接入一个完全不同的 DNS 系统时,使用
None
并配合dnsConfig
。