Kubernetes Pod DNS 配置

一、概述

Kubernetes 提供多种 DNS 策略(dnsPolicy),同时 kubelet 参数也影响最终的 DNS 行为。


二、dnsPolicy 策略说明

dnsPolicy 含义说明
Default 使用宿主机的 DNS 配置(kubelet 的 --resolv-conf
ClusterFirst 优先使用集群 DNS(如 CoreDNS),仅在无法解析时退回宿主机 DNS(默认策略
ClusterFirstWithHostNet ClusterFirst 类似,但适用于 hostNetwork: true 的 Pod,需要显式设置
None 不自动配置 DNS,需用户通过 dnsConfig 自定义

三、kubelet 与 DNS 的关系

Kubelet 决定了 Pod 的 DNS 配置来源:

kubelet 参数 含义
--cluster-dns= 指定 CoreDNS 的 ClusterIP,供 ClusterFirst* 策略使用
--cluster-domain 设置集群内服务搜索域(默认是 cluster.local
--resolv-conf= 指定当 dnsPolicy: Default 时使用的宿主机 DNS 配置(默认是 /etc/resolv.conf

kubelet 构造行为:

dnsPolicy /etc/resolv.conf 来源
Default 拷贝 --resolv-conf 文件
ClusterFirst 使用 --cluster-dns + --cluster-domain 构造
ClusterFirstWithHostNet 同上,但用于 hostNetwork: true 的场景
None + dnsConfig 用户手动定义

四、ndots 配置解释

/etc/resolv.conf 中常见如下配置:

options ndots:5

含义:

如果一个域名中 . 的数量 < ndots,则认为它是 不完整的域名,需要加上 search 域后再尝试解析。

举例:

  • 配置:

    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
    
  • 执行 ping my-service,尝试解析的顺序为:

    my-service.default.svc.cluster.local
    my-service.svc.cluster.local
    my-service.cluster.local
    

注意事项:

  • ndots 值大时,公网域名解析会多次失败(浪费时间)

  • 访问公网域名建议写为 curl www.google.com.(末尾加 .


五、特殊场景说明

1. Pod 使用 hostNetwork: true 时 DNS 问题

  • 默认降级为 dnsPolicy: Default,即使用宿主机 DNS,可能无法解析 *.svc.cluster.local

  • 解决方案:

    hostNetwork: true
    dnsPolicy: ClusterFirstWithHostNet
    

    强制构造 Pod 的 DNS 为集群 DNS


六、实用排查命令

  • 查看 Pod 实际 DNS 配置:

    kubectl exec  -- cat /etc/resolv.conf
    
  • 查看 CoreDNS 是否正常:

    kubectl get svc -n kube-system kube-dns
    kubectl logs -n kube-system -l k8s-app=kube-dns
    
  • 验证域名解析是否正确:

    kubectl exec  -- nslookup my-service.default.svc.cluster.local
    

七、最佳实践建议

场景 建议配置
常规集群服务解析 默认使用 ClusterFirst
边车 / Agent 使用 hostNetwork 使用 ClusterFirstWithHostNet
容器只需访问公网(不需要访问 Service) 可以用 dnsPolicy: Default
完全自定义 DNS 配置 设置 dnsPolicy: None 并配置 dnsConfig

八、配置示例

示例:hostNetwork + 使用集群 DNS

apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
  containers:
    - name: nginx
      image: nginx

九、参考链接

  • Kubernetes 官方文档:DNS for Services and Pods | Kubernetes

  • CoreDNS 文档:CoreDNS: DNS and Service Discovery

你可能感兴趣的:(k8s,k8s)