K8s NodePort访问故障排查
Kubernetes NodePort访问故障排查:生产环境实战指南
当NodePort服务无法访问时,就像快递找不到收货地址。本文将结合20+生产环境案例,手把手教你从基础检查到高阶诊断的全链路排错方法。
一、快速定位问题象限
graph TD
A[NodePort不可达] --> B{集群内访问}
B -->|成功| C[节点网络问题]
B -->|失败| D[服务配置问题]
C --> E[检查防火墙/安全组]
D --> F[验证Endpoint状态]
二、基础排查六步法
2.1 服务配置验证
# 确认NodePort配置
kubectl get svc my-svc -o jsonpath='{.spec.ports[0].nodePort}'
# 查看Endpoint状态
kubectl get endpoints my-svc
关键点:
- NodePort应在30000-32767范围
- Endpoints应有正确的Pod IP:Port
2.2 节点端口监听检查
# 在目标节点执行
ss -tuln | grep 31888
netstat -tulnp | grep 31888
# 跨节点批量检查
kubectl get nodes -o wide | awk 'NR>1{print $6}' | xargs -I{} ssh {} 'sudo netstat -tulnp | grep 31888'
2.3 容器连通性测试
# 创建诊断Pod
kubectl run net-tool --image=nicolaka/netshoot -it --rm -- /bin/bash
# 从集群内部访问
curl -v http://my-svc:8080
telnet <node-ip> 31888
三、网络层深度排查
3.1 防火墙规则检查
# 查看iptables规则链
iptables -t nat -L KUBE-NODEPORTS -nv --line-numbers
# 临时禁用防火墙(慎用)
systemctl stop firewalld || ufw disable
3.2 流量追踪示例
# 在服务节点抓包
tcpdump -i any port 31888 -nn -vv
# 使用traceroute诊断
mtr -n -T -P 31888 <node-ip>
3.3 云平台特殊配置
| 云厂商 | 关键检查项 |
|---|---|
| AWS | 安全组入站规则/NACL配置 |
| GCP | 防火墙规则/网络标签匹配 |
| Azure | NSG规则/负载均衡器探针 |
| 阿里云 | 安全组/SLB监听配置 |
四、K8s组件故障排查
4.1 kube-proxy状态检查
# 检查代理Pod状态
kubectl get pods -n kube-system -l k8s-app=kube-proxy
# 查看日志确认规则生成
kubectl logs -n kube-system kube-proxy-xxxxx --tail 100 | grep -i nodeport
4.2 网络策略验证
# 创建临时放通策略
kubectl create podsecuritypolicy temp-allow-all --allow-all
# 查看生效策略
calicoctl get networkpolicy -o wide
五、高级诊断工具
5.1 端口映射可视化
# 生成iptables规则图
iptables-save | grep KUBE-SVC- | iptablesviz
# 查看kube-proxy模式
kubectl get configmap -n kube-system kube-proxy -o json | jq '.data.config.conf'
5.2 性能瓶颈分析
# 检查conntrack表
conntrack -L -d <node-ip> -p tcp --dport 31888
# 监控连接数变化
watch -n 1 'ss -ant | grep 31888 | wc -l'
六、典型故障案例库
6.1 案例1:端口冲突
现象:
NodePort随机端口无法访问,日志显示bind: address already in use
解决方案:
# 查找占用进程
lsof -i :31888 || ss -ltnp 'sport = 31888'
# 修改服务端口范围
kube-apiserver --service-node-port-range=30000-50000
6.2 案例2:IPVS模式异常
现象:
NodePort间歇性超时,ipvsadm -Ln显示权重异常
修复步骤:
# 清理无效条目
ipvsadm --clear
# 重启kube-proxy
kubectl rollout restart ds/kube-proxy -n kube-system
七、防御性编程实践
7.1 服务健康检查配置
livenessProbe:
httpGet:
path: /healthz
port: 31888
initialDelaySeconds: 10
periodSeconds: 5
7.2 自动化验收测试
# 创建测试Job
kubectl create job test-nodeport --image=alpine \
-- sh -c 'nc -zv <node-ip> 31888 && echo OK || echo FAIL'
八、排查流程图解
graph TD
Start[NodePort无法访问] --> A[检查Service状态]
A -->|正常| B[检查Endpoint]
B -->|正常| C[节点防火墙检查]
C -->|正常| D[网络策略验证]
D -->|正常| E[Kube-proxy诊断]
E -->|正常| F[云平台安全组检查]
F -->|正常| G[应用日志分析]
G --> End[定位根本原因]
A -->|异常| H[修正Service配置]
B -->|异常| I[检查Pod状态]
C -->|异常| J[调整防火墙规则]
D -->|异常| K[修改网络策略]
E -->|异常| L[重启kube-proxy]
F -->|异常| M[修正安全组]
通过这套方法论,我们成功将NodePort故障平均解决时间从2小时缩短至15分钟。建议在CI/CD流水线中加入NodePort自动化测试环节,提前发现配置问题。当遇到疑难问题时,记住黄金三件套:抓包分析、规则跟踪、组件日志联查。
浙公网安备 33010602011771号