Kubernetes DnsPolicy
Pods DNS策略
DNS 策略可以逐个 Pod 来设定。目前 Kubernetes 支持以下特定 Pod 的 DNS 策略。 这些策略可以在 Pod 规约中的 dnsPolicy
字段设置
Default
"Default
": Pod 从运行所在的节点继承名称解析配置,Pod首先尝试使用集群内部DNS服务器解析域名。如果找不到,则将会使用节点上的/etc/resolv.conf文件中配置的DNS服务器进行解析(resolv.conf是CoreDNS的forward指定的上游)。这使得Pod可以解析集群内外的域名,参考相关讨论获取更多信息。
ClusterFirst
"ClusterFirst
": 与配置的集群域后缀不匹配的任何 DNS 查询(例如 "www.kubernetes.io") 都会由 DNS 服务器转发到上游名称服务器。集群管理员可能配置了额外的存根域和上游 DNS 服务器。 参阅相关讨论 了解在这些场景中如何处理 DNS 查询的信息。
Pod首先查询Cluster DNS服务器,如果找不到,则查询/etc/hosts文件(主机文件),然后查询默认的DNS服务器
ClusterFirstWithHostNet
"ClusterFirstWithHostNet
": 对于以 hostNetwork 方式运行的 Pod,应将其 DNS 策略显式设置为 "ClusterFirstWithHostNet
"。否则,以 hostNetwork 方式和 "ClusterFirst"
策略运行的 Pod 将会做出回退至 "Default"
策略的行为。
- 范例
apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - image: busybox:1.28 command: - sleep - "3600" imagePullPolicy: IfNotPresent name: busybox restartPolicy: Always hostNetwork: true dnsPolicy: ClusterFirstWithHostNet
None
"None
": 此设置允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。Pod 会使用其 dnsConfig
字段所提供的 DNS 设置。 参见 Pod 的 DNS 配置节。
"Default" 不是默认的 DNS 策略。如果未明确指定 dnsPolicy
,则使用 "ClusterFirst"
Pod 的 DNS 配置
Pod 的 DNS 配置可让用户对 Pod 的 DNS 设置进行更多控制。
dnsConfig
字段是可选的,它可以与任何 dnsPolicy
设置一起使用。 但是,当 Pod 的 dnsPolicy
设置为 "None
" 时,必须指定 dnsConfig
字段。
- 如下例子
apiVersion: v1 kind: Pod metadata: namespace: default name: dns-example spec: containers: - name: test image: nginx dnsPolicy: "None" dnsConfig: nameservers: - 192.0.2.1 # 这是一个示例 searches: - ns1.svc.cluster-domain.example - my.dns.search.suffix options: - name: ndots value: "2" - name: edns0
- ndots解释
- 请求的域名携带的"."大于nodts设置,则不使用search定义的范围,将直接解析请求的域名并返回解析结果
- 请求的域名携带的"."小于nodts设置,则使用search定义的范围,逐个查询并请求DNS域并返回解析结果
HostAliases
当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts
文件中添加条目, 可以在 Pod 级别覆盖对主机名的解析。你可以通过 PodSpec 的 HostAliases 字段来添加这些自定义条目。
建议通过使用 HostAliases 来进行修改,因为该文件由 Kubelet 管理,并且 可以在 Pod 创建/重启过程中被重写。
- 通过 HostAliases 增加额外条目
apiVersion: v1 kind: Pod metadata: name: hostaliases-pod spec: restartPolicy: Never hostAliases: - ip: "127.0.0.1" hostnames: - "foo.local" - "bar.local" - ip: "10.1.2.3" hostnames: - "foo.remote" - "bar.remote" containers: - name: cat-hosts image: busybox:1.28 command: - cat args: - "/etc/hosts"