Kubernetes中ClusterIP服务curl超时问题求助
排查ClusterIP服务curl超时问题
根据你提供的服务和Pod信息,以下是逐步排查步骤:
1. 直接验证Pod的可访问性
先跳过Service,直接从控制平面节点访问Pod的IP,确认Pod本身是否正常响应:
curl http://172.16.222.234
- 如果请求超时:问题出在Pod与控制平面节点的网络连通性,或者Pod内的Nginx服务未正常监听。
- 如果请求成功:问题出在Service的流量转发逻辑。
情况1:Pod访问超时
a. 确认Pod内Nginx是否正常监听端口
进入Pod内部检查Nginx的监听状态:
kubectl exec -it nginx-nfs-deployment-5dd946cdd6-7hh4k -- bash -c "netstat -tulpn | grep 80"
正常输出应该显示0.0.0.0:80或:::80,说明Nginx在所有接口监听80端口。如果没有输出,重启Pod或重新拉取Nginx镜像。
b. 检查节点防火墙规则
登录到Pod所在节点c1-node1(IP:192.168.0.11),检查防火墙是否允许Pod网段(172.16.0.0/16)的入站流量:
- 对于
iptables:
确保没有拒绝该网段的规则。iptables -L INPUT -n | grep 172.16 - 对于
firewalld:
确认Pod网段已被允许,或临时关闭防火墙测试:firewall-cmd --list-allfirewall-cmd --stop。
c. 检查Calico CNI网络配置
你的集群使用Calico作为CNI,检查Calico组件状态:
kubectl get pods -n calico-system
确保所有Calico Pod处于Running状态。同时检查是否存在阻止流量的网络策略:
kubectl get networkpolicies --all-namespaces
如果有默认拒绝策略,需要添加允许控制平面节点访问Pod的规则。
情况2:Pod访问成功,但Service访问超时
a. 确认Service与Pod的标签匹配
虽然描述中显示Selector是app=nginx,Pod也有app=nginx标签,但再次验证:
kubectl get pods --show-labels | grep nginx kubectl get svc nginx-nfs-service -o jsonpath='{.spec.selector}'
确保两者标签完全一致(注意大小写和字符)。
b. 检查kube-proxy运行状态
ClusterIP的流量转发依赖kube-proxy,检查控制平面节点上的kube-proxy Pod:
kubectl get pods -n kube-system | grep kube-proxy
如果Pod异常,重启kube-proxy:
kubectl delete pod -n kube-system <kube-proxy-pod-name>
同时查看kube-proxy日志,排查转发规则是否生成异常:
kubectl logs -n kube-system <kube-proxy-pod-name>
c. 检查控制平面节点的iptables规则
kube-proxy会生成iptables规则处理Service流量,检查是否存在对应Service的规则:
iptables -t nat -L KUBE-SERVICES -n | grep 10.105.179.135
如果没有相关规则,重启kube-proxy或刷新iptables规则:
iptables -F && iptables -t nat -F && systemctl restart kube-proxy
内容的提问来源于stack exchange,提问作者Zeinab Ganjei
相关产品推荐
相关产品推荐

