k8s hostNetwork 网络的 pod 无法解析 service 排查
背景公司内大部分 pod 因为特殊环境使用的 host 网络,最近无意中发现,有一个 pod 无法解析 k8s 的 service,于是展开了后面的排查排查步骤查阅百度发现文章都是一群人一个抄一个,句句不在点子上,如...
背景
公司内个别 pod 因为特殊环境使用的 host 网络,最近无意中发现,有一个 host 网络的 pod 无法解析 k8s 的 service,于是展开了后面的排查
排查步骤
进入 pod 内 ping svc,发现无法解析 svc,初步怀疑是 dns 的搜索域或者 dns 有问题
$ kubectl exec ht-deployment-7d4b886c7b-mf6pq ping test-service
ping: ht-service: Name or service not known
$ kubectl exec ht-deployment-7d4b886c7b-mf6pq cat /etc/resolv.conf # 发现 pod 的 dns 地址和搜索域不太正常,不是集群内的 dns地址
search dns.com
nameserver 10.10.10.10
nameserver 10.10.10.20
options timeout:2
options rotate
$ kubectl exec ab-deployment--mf6pq-xas1w cat /etc/resolv.conf # 正常的是这样
nameserver 169.254.25.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
查阅百度发现文章都是一群人一个抄一个,句句不在点子上,比如这个
这个确实是有点关系,但是根本原因不在这,试想如果几十台节点,逐个更改真的不太现实(k8s官方不至于这么傻),且修改完这个dns搜索域可能会引发宿主机解析问题
一开始,也尝试根据上面的资料进行处理,后来脑海里突然闪现出这么一个字段
dnsPolicy
(之前对这个字段有少许印象),对比了下可以解析 service 的 hostnetwork类型的pod,发现真理貌似就在这里
发现可以正常可以解析 svc 的 pod ,
dnsPolicy
是ClusterFirstWithHostNet
,官方解释是这样,对于以 hostNetwork 方式运行的 Pod,应显式设置其 DNS 策略 "ClusterFirstWithHostNet"
,白话就是使用这个参数,可以将使用hostNetwork的pod共享的名称空间再做一个细化的区分,与宿主机只共享网络(IP、hosts),不共享其他网络相关配置(/etc/resolv.conf)
区别是这样:
- dnsPolicy为ClusterFirst的pod,
/etc/resolv.conf
文件中内容和宿主机内容一致。 - dnsPolicy为ClusterFirstWithHostNet的pod,
/etc/resolv.conf
文件中内容和宿主机内容不一致,使用的是 k8s 集群内的dns搜索域。
问题解决
$ kubectl edit deployment ht-deployment
···
spec:
template:
spec:
dnsPolicy: ClusterFirstWithHostNet # 调整策略
···
参考文献:https://kubernetes.io/zh/docs/concepts/services-networking/dns-pod-service/
更多推荐
所有评论(0)