Kubernetes中Heapster结合Kube-DNS无法解析monitoring-influxdb问题
从你描述的现象来看,核心矛盾是同一集群内不同命名空间的DNS解析表现不一致:default命名空间的busybox能正常解析带命名空间后缀的地址,但kube-system里的Heapster连带后缀的地址都解析失败,还报了server misbehaving的错误。咱们一步步来排查:
1. 先检查Heapster容器的DNS基础配置
进入Heapster容器,先看最关键的resolv.conf:
kubectl exec -it heapster-<你的PodID> -n kube-system -- cat /etc/resolv.conf
正常情况下,内容应该包含:
search kube-system.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.254.0.2
options ndots:5
- 如果
search字段里没有kube-system.svc.cluster.local,那直接用monitoring-influxdb短名肯定找不到,因为默认只会在当前命名空间的搜索域里查找; - 再确认Heapster的Pod DNS策略是否正常:
kubectl describe pod heapster-<你的PodID> -n kube-system | grep "DNS Policy"
默认应该是ClusterFirst,如果被改成Default或者其他值,会直接用宿主机的DNS,导致集群内Service解析失败。
2. 从Kube-DNS本身验证解析逻辑
既然Kube-DNS的状态正常,那咱们直接从Kube-DNS Pod里测试解析,排除集群外的干扰:
# 进入Kube-DNS Pod(如果是老版本kube-dns,替换成kube-dns-xxx) kubectl exec -it coredns-<你的CoreDNS PodID> -n kube-system -- sh # 测试完整域名解析 nslookup monitoring-influxdb.kube-system.svc.cluster.local
- 如果这里解析失败,那要回头确认InfluxDB的Service配置:
- 执行
kubectl get svc -n kube-system,确认monitoring-influxdb的ClusterIP正常分配; - 执行
kubectl describe svc monitoring-influxdb -n kube-system,检查selector是否和InfluxDB Pod的标签完全匹配(哪怕一个字符错了都会导致Endpoint异常);
- 执行
- 如果这里解析成功,那查看Kube-DNS的日志,看有没有Heapster请求的错误记录:
kubectl logs coredns-<你的CoreDNS PodID> -n kube-system | grep "monitoring-influxdb"
比如有没有拒绝请求、域名不存在的日志,这能帮你定位是Kube-DNS拒绝了Heapster的请求,还是其他问题。
3. 检查kube-system命名空间的网络限制
有没有可能是网络策略阻止了Heapster访问Kube-DNS的53端口?
kubectl get networkpolicy -n kube-system
如果有网络策略存在,确认规则是否允许Heapster的Pod访问UDP/TCP 53端口(DNS需要这两个端口)。如果策略里没放开,Heapster连Kube-DNS都连不上,自然会报server misbehaving。
另外,也可以临时在Heapster容器里ping下Kube-DNS的ClusterIP(10.254.0.2),确认网络连通性:
kubectl exec -it heapster-<你的PodID> -n kube-system -- ping 10.254.0.2
4. 排查容器DNS缓存或异常状态
有时候容器的DNS配置会因为Pod创建时的异常出现问题,试试重启Heapster Pod:
kubectl delete pod heapster-<你的PodID> -n kube-system
重启后再进入容器测试解析,看是否恢复正常。
另外,检查Heapster的Pod有没有自定义的dnsConfig,如果有手动配置的nameserver或search域,可能覆盖了默认的集群DNS:
kubectl get pod heapster-<你的PodID> -n kube-system -o yaml | grep -A 10 "dnsConfig"
5. 确认InfluxDB Service的基础配置
最后再仔细核对一遍:
- 执行
kubectl get svc -n kube-system,确认Service名称确实是monitoring-influxdb,没有拼写错误; - 确认Service的类型是
ClusterIP(NodePort/LoadBalancer也不影响DNS解析,但ClusterIP是默认类型,更稳妥); - 执行
kubectl get endpoints monitoring-influxdb -n kube-system,确认Endpoint里有正常的Pod IP,且状态是Ready。
内容的提问来源于stack exchange,提问作者stiller_leser

