单节点K8s集群内Pod容器无法解析其运行宿主主机名问题求助
问题原因
- Pod默认使用
ClusterFirstDNS策略,解析请求会优先交给集群的CoreDNS服务处理,不会直接继承节点的/etc/hosts条目,也完全不会读取你本地笔记本的hosts配置。 - 节点上配置的
nameserver 127.0.0.53是systemd-resolved的本地监听地址,该服务会优先读取节点/etc/hosts的记录完成解析,因此节点上访问正常,但这个本地解析服务默认不会暴露给集群内的Pod调用。 - 你在私有网络没有配置公共DNS服务器,CoreDNS接收到Pod的解析请求后,无法通过上游DNS获取对应主机的解析记录,因此返回解析失败。
解决方案
方案1:给指定Pod添加hostAliases(少量Pod适用)
不需要修改集群配置,仅给需要访问该主机的Pod单独配置解析映射即可,yaml示例如下:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: hostAliases: - ip: "目标主机实际IP" hostnames: - "需要解析的主机名" containers: - name: test-container image: nginx
方案2:修改CoreDNS配置(全集群生效)
如果所有集群内Pod都需要解析该主机名,直接修改CoreDNS的ConfigMap添加自定义解析规则:
- 执行编辑命令:
kubectl edit configmap coredns -n kube-system - 在Corefile配置段中添加hosts插件规则,示例:
.:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } # 新增以下自定义解析规则 hosts { 目标主机实际IP 需要解析的主机名 fallthrough } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance }
- 保存配置后等待CoreDNS Pod自动重启即可生效。
方案3:CoreDNS转发到节点解析服务(多自定义主机适用)
如果有大量自定义主机需要解析,且已经全部写入节点/etc/hosts中,可以调整CoreDNS转发规则复用节点的解析能力:
- 编辑CoreDNS ConfigMap,把
forward . /etc/resolv.conf修改为forward . 节点的物理IP - 放开节点防火墙53端口的集群内部访问限制,重启CoreDNS Pod即可生效。
方案4:修改Pod DNS策略为Default(仅临时测试适用)
该方案会让Pod直接继承节点的resolv.conf配置,但会导致无法解析集群内部的服务域名,仅适合单次测试使用,配置示例:
apiVersion: v1 kind: Pod metadata: name: test-pod spec: dnsPolicy: Default containers: - name: test-container image: nginx
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

