kubernetes中pod里的容器无法解析外网

avatar 2023年3月11日18:01:44 评论 1,377 次浏览

kubernetes安装好后,因为代理的问题所以就没有安装什么服务,有的安装好后也就没有测试,后来发现安装后在jenkins的时候安装不上,我一直以为是我的版本的问题,后来看日志,访问超时,但是我的宿主机是可以联网的,我就随便找个pod,在pod上ping一下外网,如果我ping域名解析不了,但是ip是可以的。根据kubernetes的原理,问题就应该在kubernetes中的dns上了。

 [root@www.wulaoer.org ~]# for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); \
 > do kubectl logs --namespace=kube-system $p; done
 ...................................................
 INFO] 10.244.104.45:55282 - 63278 "A IN www.baidu.com.localdomain. udp 43 false 512" - - 0 0.000110555s
 [ERROR] plugin/errors: 2 www.baidu.com.localdomain. A: plugin/loop: no next plugin found
 ......................................................

后来在网上搜索了一下,说是内核版本太低的问题,但是别人的错误是因为IPVS的问题。而我的并不是,所以刚开始升级内核后还是不能解决。

 E0326 15:20:23.159364  1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]
 E0326 15:20:23.159388  1 proxier.go:1192] Failed to sync endpoint for service: 10.8.0.10:53/UPD, err: parseIP Error ip=[10 96 0 16 0 0 0 0 0 0 0 0 0 0 0 0]
 E0326 15:20:23.159479  1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]
 E0326 15:20:23.159501  1 proxier.go:1192] Failed to sync endpoint for service: 10.8.0.10:53/TCP, err: parseIP Error ip=[10 96 0 16 0 0 0 0 0 0 0 0 0 0 0 0]
 E0326 15:20:23.159595  1 proxier.go:1950] Failed to list IPVS destinations, error: parseIP Error ip=[10 96 0 10 0 0 0 0 0 0 0 0 0 0 0 0]

系统内核升级可以参考: https://www.wulaoer.org/?p=2818

然后就继续找答案,也有得说只要把coredns中不让内部解析,使用外部解析也可以解决。

 [root@www.wulaoer.org ~]# kubectl edit configmap coredns -n kube-system
 ..........................................................
         prometheus :9153
         forward . /etc/resolv.conf {
            max_concurrent 100
         } #把forward注释掉,直接使用service 8.8.8.8
         cache 30

但是我的环境依然不可以,后来就找了一下coredns的configmap文档的注释,发现并不一定是内核的问题,后来有说主要原因是因为宿主机上有多个nameserver,而coredns不能解析的时候会向宿主机/etc/resolv.conf配置文件中多个nameserver采取random的随机转发,失败就会返回错误。

 **CoreDNS 配置参数说明:**
 
 - errors: 输出错误信息到控制台。
 - health:CoreDNS 进行监控检测,检测地址为 http://localhost:8080/health 如果状态为不健康则让 Pod 进行重启。
 - ready: 全部插件已经加载完成时,将通过 endpoints 在 8081 端口返回 HTTP 状态 200。
 - kubernetes:CoreDNS 将根据 Kubernetes 服务和 pod 的 IP 回复 DNS 查询。
 - prometheus:是否开启 CoreDNS Metrics 信息接口,如果配置则开启,接口地址为 http://localhost:9153/metrics
 - forward:任何不在Kubernetes 集群内的域名查询将被转发到预定义的解析器 (/etc/resolv.conf)。
 - cache:启用缓存,30 秒 TTL。
 - loop:检测简单的转发循环,如果找到循环则停止 CoreDNS 进程。
 - reload:监听 CoreDNS 配置,如果配置发生变化则重新加载配置。
 - loadbalance:DNS 负载均衡器,默认 round_robin。

最后问题定位在forward上面了,根据配置的说法是policy是 CoreDNS 的一等公民,fallthrough 关键字流向下一个 plugin必须依照plugin的顺序来,更多可以参考:https://coredns.io/plugins/

解决方法

所以只需要在coredns的configmap中添加policy sequential就可以了。

 [root@www.wulaoer.org ~]# kubectl edit configmap coredns -n kube-system
 ..........................................................
         prometheus :9153
         forward . /etc/resolv.conf {
            max_concurrent 100
            policy sequential #增加
         } 
         cache 30
 .................................

然后重启一下CoreDNS即可,我就不测试了,如果你的CoreDNS副本比较少可以增加CoreDNS。

 [root@www.wulaoer.org ~]# kubectl -n kube-system scale --replicas=3 deployment/coredns

好了,问题解决了,看看有没有适合你的方法吧,没有了,看些其他的吧

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: