K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout'分 ...

张春  金牌会员 | 2023-2-18 20:42:23 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 686|帖子 686|积分 2058

开篇

问题概述

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 直接访问,却是可以正常访问的,如下图:

环境信息


  • 硬件:5G IoT 网关
  • 网络:

    • 互联网访问:5G 网卡:就是一个 usb 网卡,需要通过拨号程序启动,程序会调用系统的 dhcp/dnsmasq/resolvconf 等
    • 内网访问:wlan 网卡

  • 软件:K3S Server v1.21.7+k3s1, dnsmasq 等
分析

网络详细配置信息

一步一步检查分析:

  • 看 /etc/resolv.conf, 发现配置是 127.0.0.1
  • netstat 查看 本地 53 端口确实在运行
  • 这种情况一般都是本地启动了 DNS 服务器或 缓存,查看 dnsmasq 进程是否存在,确实存在
  • dnsmasq 用的 resolv.conf 配置是 /run/dnsmasq/resolv.conf
  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 个配置需要关注:

  • forward . /etc/resolv.conf
  • loop
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>

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表