ToB企服应用市场:ToB评测及商务社交产业平台

标题: K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout'分 [打印本页]

作者: 张春    时间: 2023-2-18 20:42
标题: K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout'分
开篇

问题概述

20220606 5G IoT 网关设备同时安装 K3S Server, 但是 POD 却无法访问互联网地址,查看 CoreDNS 日志提示如下:
  1. ...
  2. [ERROR] plugin/errors: 2 update.traefik.io. A: read udp 10.42.0.3:38545->8.8.8.8:53: i/o timeout
  3. [ERROR] plugin/errors: 2 update.traefik.io. AAAA: read udp 10.42.0.3:38990->8.8.8.8:53: i/o timeout
  4. ...
复制代码
即 DNS 查询 forward 到了 8.8.8.8 这个 DNS 服务器,并且查询超时。
从而导致需要联网启动的 POD 无法正常启动,频繁 CrashLoopBackoff, 如下图:

但是通过 Node 直接访问,却是可以正常访问的,如下图:

环境信息

分析

网络详细配置信息

一步一步检查分析:
  1. $ cat /etc/resolv.conf
  2. # Generated by resolvconf
  3. nameserver 127.0.0.1
  4. $ netstat -anpl|grep 53
  5. (Not all processes could be identified, non-owned process info
  6. will not be shown, you would have to be root to see it all.)
  7. tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      -
  8. tcp6       0      0 :::53                   :::*                    LISTEN      -
  9. udp        0      0 0.0.0.0:53              0.0.0.0:*                           -
  10. udp6       0      0 :::53                   :::*                                -
  11. $ ps -ef|grep dnsmasq
  12. dnsmasq    912     1  0 6 月 06 ?       00:00:00 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=...
  13. $ systemctl status dnsmasq.service
  14. ● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
  15.    Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
  16.    Active: active (running) since Mon 2022-06-06 17:21:31 CST; 16h ago
  17. Main PID: 912 (dnsmasq)
  18.     Tasks: 1 (limit: 4242)
  19.    Memory: 1.1M
  20.    CGroup: /system.slice/dnsmasq.service
  21.            └─912 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=...
  22. 6 月 06 17:21:31 orangebox-7eb3 dnsmasq[912]: started, version 2.80 cachesize 150
  23. 6 月 06 17:21:31 orangebox-7eb3 dnsmasq[912]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify dumpfile
  24. 6 月 06 17:21:31 orangebox-7eb3 dnsmasq-dhcp[912]: DHCP, IP range 192.168.51.100 -- 192.168.51.200, lease time 3d
  25. 6 月 06 17:21:31 orangebox-7eb3 dnsmasq[912]: read /etc/hosts - 8 addresses
  26. 6 月 06 17:21:31 orangebox-7eb3 dnsmasq[912]: no servers found in /run/dnsmasq/resolv.conf, will retry
  27. 6 月 06 17:21:31 orangebox-7eb3 dnsmasq[928]: Too few arguments.
  28. 6 月 06 17:21:31 orangebox-7eb3 systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
  29. 6 月 06 17:22:18 orangebox-7eb3 dnsmasq[912]: reading /run/dnsmasq/resolv.conf
  30. 6 月 06 17:22:18 orangebox-7eb3 dnsmasq[912]: using nameserver 222.66.251.8#53
  31. 6 月 06 17:22:18 orangebox-7eb3 dnsmasq[912]: using nameserver 116.236.159.8#53
  32. $ cat /run/dnsmasq/resolv.conf
  33. # Generated by resolvconf
  34. nameserver 222.66.251.8
  35. nameserver 116.236.159.8
复制代码
CoreDNS 分析

这里很奇怪,就是没发现哪儿有配置 DNS 8.8.8.8, 但是日志中却显示指向了这个 DNS:
  1. [ERROR] plugin/errors: 2 update.traefik.io. A: read udp 10.42.0.3:38545->8.8.8.8:53: i/o timeout
  2. [ERROR] plugin/errors: 2 update.traefik.io. AAAA: read udp 10.42.0.3:38990->8.8.8.8:53: i/o timeout
复制代码
先查看一下 CoreDNS 的配置:(K3S 的 CoreDNS 是通过 manifests 启动的,位于:/var/lib/rancher/k3s/server/manifests/coredns.yaml 下)
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: coredns
  5.   namespace: kube-system
  6. data:
  7.   Corefile: |
  8.     .:53 {
  9.         errors
  10.         health
  11.         ready
  12.         kubernetes cluster.local in-addr.arpa ip6.arpa {
  13.           pods insecure
  14.           fallthrough in-addr.arpa ip6.arpa
  15.         }
  16.         hosts /etc/coredns/NodeHosts {
  17.           ttl 60
  18.           reload 15s
  19.           fallthrough
  20.         }
  21.         prometheus :9153
  22.         forward . /etc/resolv.conf
  23.         cache 30
  24.         loop
  25.         reload
  26.         loadbalance
  27.     }
复制代码
这里主要有 2 个配置需要关注:
CoreDNS 问题常用分析流程

检查 DNS Pod 是否正常运行 - 结果:是的;
  1. # kubectl -n kube-system get pods -l k8s-app=kube-dns
  2. NAME                       READY   STATUS    RESTARTS   AGE
  3. coredns-7448499f4d-pbxk6   1/1     Running   1          15h
复制代码
检查 DNS 服务是否存在正确的 cluster-ip - 结果:是的:
  1. # kubectl -n kube-system get svc -l k8s-app=kube-dns
  2. NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
  3. kube-dns   ClusterIP   10.43.0.10   <none>        53/UDP,53/TCP,9153/TCP   15h
复制代码
检查是否能解析域名:
先是内部域名 - 结果:无法解析:
  1. $ kubectl run -it --rm --restart=Never busybox --image=busybox -- nslookup kubernetes.default
  2. Server:         10.43.0.10
  3. Address:        10.43.0.10:53
  4. ;; connection timed out; no servers could be reached
复制代码
再试外部域名 - 结果:无法解析:
  1. $ kubectl run -it --rm --restart=Never busybox --image=busybox -- nslookup www.baidu.com
  2. Server:         10.43.0.10
  3. Address:        10.43.0.10:53
  4. ;; connection timed out; no servers could be reached
复制代码
检查 resolv.conf 中的 nameserver 配置 - 结果:确实是 8.8.8.8
  1. $ kubectl run -i --restart=Never --rm test-${RANDOM} --image=ubuntu --overrides='{"kind":"Pod", "apiVersion":"v1", "spec": {"dnsPolicy":"Default"}}' -- sh -c 'cat /etc/resolv.conf'
  2. nameserver 8.8.8.8
  3. pod "test-7517" deleted
复制代码
综上:
应该是 POD 内的 /etc/resolv.conf 被配置为 nameserver 8.8.8.8 导致了此次问题。
但是整个 Node OS 级别并没有配置 nameserver 8.8.8.8, 所以怀疑是:Kubernetes、Kubelet、CoreDNS 或 CRI 层面有这样的机制:在 DNS 配置异常时,自动配置其为 nameserver 8.8.8.8。
那么,要解决问题,还是要找到 DNS 配置异常。
容器网络 DNS 服务

我这里暂时没有查到 Kubernetes、Kubelet、CoreDNS 或 CRI 的相关 DNS 的具体证据,K3S 的 CRI 是 containerd,但是我在 Docker 的官方文档 看到了这样的描述:
<blockquote>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4