Kubernetes Pod无法解析本地局域网主机名但可解析外部域名求助
问题结论
该情况属于Kubernetes集群的正常行为,核心原因如下:
- Kubernetes Pod默认使用
ClusterFirstDNS策略,所有DNS请求优先发送到集群内的CoreDNS服务处理 - CoreDNS默认仅会解析集群内部域名(后缀为
cluster.local的域名),其余外部域名会转发至从节点/etc/resolv.conf中读取的上游DNS服务器 - 你的环境使用Ubuntu 18.04,系统默认启用systemd-resolved做本地DNS缓存,节点
/etc/resolv.conf中的默认nameserver为127.0.0.53,该地址是节点本地回环地址,仅在节点宿主机上有效,CoreDNS容器无法访问该地址,因此局域网私有域名的解析请求无法转发到正确的局域网DNS服务器 - 另外CoreDNS默认不会读取节点的
/etc/hosts文件,哪怕节点配置了静态hosts条目也不会同步到Pod的解析逻辑中
解决方案
你可以根据自身使用场景选择以下任意一种配置方式:
方案1:修改CoreDNS配置(推荐,全集群生效)
该方案可以让集群内所有Pod都支持局域网域名解析,操作步骤如下:
- 编辑CoreDNS的ConfigMap:
kubectl edit configmap coredns -n kube-system - 按需修改Corefile配置块:
如果你有固定的局域网DNS服务器(比如地址为192.168.1.10),可以直接修改转发规则,替换默认的本地回环DNS:
.:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 # 将默认的forward . /etc/resolv.conf替换为你的局域网DNS地址 forward . 192.168.1.10 cache 30 loop reload loadbalance }
如果你没有局域网DNS服务器,需要直接配置静态主机名映射,可添加hosts块:
.:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # 新增静态hosts配置块 hosts { 192.168.1.20 wrkr1 192.168.1.21 wrkr2 fallthrough } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance }
- 保存配置后等待CoreDNS Pod自动重载配置,一般1-2分钟即可生效。
方案2:为单个工作负载配置hostAliases(仅对指定Pod生效)
如果只需要个别Pod解析局域网主机名,无需修改全局配置,可直接在Deployment/Pod的YAML中添加hostAliases字段:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: busybox:1.28 command: ["sleep", "3600"] # 新增host别名配置,会直接写入Pod的/etc/hosts文件 hostAliases: - ip: "192.168.1.20" hostnames: - "wrkr1" - ip: "192.168.1.21" hostnames: - "wrkr2"
方案3:修改Pod的DNS策略(不推荐,特殊场景使用)
将Pod的dnsPolicy设置为Default,可让Pod直接继承节点的DNS配置,但该配置会导致Pod无法解析集群内部的服务域名,仅适合不需要访问集群内部服务的场景使用:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: busybox:1.28 command: ["sleep", "3600"] dnsPolicy: Default
内容的提问来源于stack exchange,提问作者JayD
相关产品推荐
相关产品推荐

