该案例是客户提供的机器上部署 k8s 后,业务部署遇到问题,现场实施排查到有个服务 pod 无法访问到数据库:
dial tcp 10.xxx.xx.xx:3306: i/o timeout
该 pod 节点上探测下数据库端口是否可达,可能本机 IP 不在数据库白名单里,或者远端数据库端口没监听:
$ telnet 10.xxx.xx.xx 3306
Trying 10.xxx.xx.xx....
COnnect to 10.xxx.xx.xx.
Escape character is '^]'
....
说明 IP:Port 可达,使用 nsenter 进入 pod 网络内探测下:
# 找到 pod 所在的容器 ID,容器没起来则使用对应的 /pause 的容器 ID ,inspect 取 Pid
$ docker inspect xxxxx | grep -m1 Pid
"Pid": 2018877,
$ nsenter --net -t 2018877 telnet 10.xxx.xx.xx 3306
Trying 10.xxx.xx.xx....
telnet: connect to address 10.xxx.xx.xx: No route to host
奇怪了,看下 ip 和路由:
$ nsenter --net -t 2018877 ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether fe:31:23:1f:55:2a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.88.0.3/16 brd 10.88.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::fc31:23ff:fe1f:552a/64 scope link
valid_lft forever preferred_lft forever
IP 奇怪,我们的 Pod CIDR 不是这个网段的:
$ ip a s cni0
7: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
link/ether 32:70:aa:c6:eb:fc brd ff:ff:ff:ff:ff:ff
inet 10.187.4.1/24 brd 10.187.0.255 scope global cni0
valid_lft forever preferred_lft forever
inet6 fe80::3070:aaff:fec6:ebfc/64 scope link
valid_lft forever preferred_lft forever
Pod IP 是由 kubelet 拉起的时候调用 cni plugin 二进制 + /etc/cni/net.d
下的 cni 配置文件设置的,这个一般是有其他 cni-conf 文件,让现场查看了下:
$ ls -l /etc/cni/net.d
total 8
-rw-r--r-- 1 root root 292 Dec 17 17:38 10-flannel.conflist
-rw-r--r-- 1 root root 483 Aug 16 2021 87-podman-bridge.conflist
客户给的机器不干净,应该有安装 podman:
$ rpm -qa | grep podman
podman-0.10.1-8.ky10.x86_64
让现场去问客户有没有使用到,确认没有使用后卸载删掉该文件,删除下错误 IP 的 Pod 后正常了。