k8s hostNetwork 网络的 pod 无法解析 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 ,dnsPolicyClusterFirstWithHostNet,官方解释是这样,对于以 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/

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值