排查步骤
1. 检查 Pod 是否正常运行
查看 my-nginx
相关的 Pod 是否处于 Running
状态,并确保它们的 READY
为 1/1
:
sh复制编辑kubectl get pods -o wide
如果 Pod 不是 Running 状态或 没有 READY,可能是应用本身启动失败,查看日志:
sh复制编辑kubectl logs <pod-name>
如果有多个容器:
sh复制编辑kubectl logs <pod-name> -c <container-name>
2. 进入 Node 测试 Pod
尝试 exec
进入一个 Pod 内,看看 在 Pod 内部是否能访问端口:
sh复制编辑kubectl exec -it <pod-name> -- /bin/sh
然后在 Pod 内测试:
sh复制编辑nc -zv 127.0.0.1 80 # 本地服务是否正常nc -zv <pod-ip> 80 # 是否能连接其他 Pod
如果连 127.0.0.1
80 端口都失败,说明 Pod 内 Nginx 没有正常启动。
3. 检查 Pod 的 iptables
规则
如果 Pod 运行正常,但不能访问端口,可能是 iptables
规则有问题:
sh复制编辑iptables -t nat -L -n --line-numbers | grep 10.244
如果没有对应的 DNAT 规则,说明 kube-proxy
可能异常,尝试重启:
sh复制编辑systemctl restart kubelet
systemctl restart kube-proxy
4. 检查 Flannel 网络
你的 ip a
结果显示 Flannel 网络是 10.244.1.0/24
,但你访问的 Pod 在 10.244.2.42
这个网段,可能 flannel
网络异常。
检查 Flannel 配置:
sh复制编辑kubectl get pods -n kube-system -o wide | grep flannel
如果 Flannel Pod 崩溃或未启动:
sh复制编辑kubectl logs -n kube-system <flannel-pod-name>
如果 flanneld
有问题,可以尝试重启:
sh复制编辑kubectl delete pod -n kube-system -l app=flannel
5. 查看 kube-proxy
规则
如果 iptables
规则有问题,检查 kube-proxy
:
sh复制编辑kubectl get pods -n kube-system -o wide | grep kube-proxy
进入 kube-proxy
容器:
sh复制编辑kubectl logs -n kube-system <kube-proxy-pod-name>
如果发现 kube-proxy
没有正确处理 Service,尝试重启:
sh复制编辑kubectl delete pod -n kube-system -l k8s-app=kube-proxy