跳过正文
Background Image
  1. Posts/

Kubernetes DNS 策略 (`dnsPolicy`) 详解

·366 字·2 分钟· loading · loading ·
yuzjing
作者
yuzjing
目录

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 解析方案,适用于高级网络配置。
ClusterFirstWithHostNethostNetwork 版集群优先:专为设置了 hostNetwork: true 的 Pod 设计。其行为与 ClusterFirst 类似,但配置方式会适应宿主机网络。当 Pod 需要直接使用宿主机的网络,但同时又希望它能解析集群内的服务时。

3. 如何配置
#

dnsPolicydnsConfig 都在 Pod 的 YAML 文件的 spec 部分进行配置。

示例 1:使用 ClusterFirst (默认)
#

如果你不显式设置 dnsPolicy,它将自动默认为 ClusterFirst

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-default
spec:
  containers:
  - name: my-app
    image: my-image
  # dnsPolicy: ClusterFirst  <-- 此行可省略,因为是默认值

示例 2:使用 Default 策略
#

此 Pod 将直接使用其所在节点的 DNS 配置来解析所有域名。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-node-dns
spec:
  containers:
  - name: my-app
    image: my-image
  # 在这里设置 DNS 策略
  dnsPolicy: Default

示例 3:使用 NonednsConfig 进行完全自定义
#

这个例子中,我们完全绕过 Kubernetes 的 DNS,直接将 Google DNS 服务器配置给 Pod。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: v1
kind: Pod
metadata:
  name: my-pod-custom-dns
spec:
  containers:
  - name: my-app
    image: my-image

  # 1. 设置策略为 "None" 以启用完全自定义
  dnsPolicy: "None"

  # 2. 手动提供完整的 DNS 配置
  dnsConfig:
    # 指定 DNS 服务器的 IP 地址
    nameservers:
      - 8.8.8.8
      - 8.8.4.4
    # 指定 DNS 搜索域 (用于解析短域名)
    searches:
      - my-namespace.svc.cluster.local
      - svc.cluster.local
      - cluster.local
    # DNS 解析器选项
    options:
      - name: ndots
        value: "5"

4. dnsConfig 字段详解
#

dnsConfig 字段允许对 DNS 进行更精细的控制,可以与 dnsPolicy 结合使用。

  • nameservers: 一个 IP 地址列表,用作 Pod 的 DNS 服务器。最多可以指定 3 个。
  • searches: 一个 DNS 搜索域列表。当解析一个不包含点 (.) 的短域名(如 my-service)时,系统会按顺序在这些搜索域下查找。例如,它会依次尝试解析 my-service.my-namespace.svc.cluster.localmy-service.svc.cluster.local 等。
  • options: 一个对象列表,用于设置 DNS 解析器的选项。
    • name: 选项的名称 (如 ndots, timeout)。
    • value: 选项的值。

注意:当设置了 dnsPolicy 时,dnsConfig 的行为会有所不同:

  • 如果 dnsPolicyClusterFirstdnsConfig 中提供的 nameservers 会被 添加 到 CoreDNS 之后,作为备用。searchesoptions 则会与默认值 合并
  • 如果 dnsPolicyNonednsConfig 必须提供 所有必要 的信息,因为它将是 Pod 唯一的 DNS 配置。

5. 总结
#

  • 日常使用:保持默认的 ClusterFirst 策略,它能满足 99% 的需求。
  • 特殊需求:当需要绕过集群 DNS 时,使用 Default
  • 高级定制:当需要接入一个完全不同的 DNS 系统时,使用 None 并配合 dnsConfig