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自动化测试环节,提前发现配置问题。当遇到疑难问题时,记住黄金三件套:抓包分析、规则跟踪、组件日志联查。

posted on 2025-03-21 11:12  Leo-Yide  阅读(228)  评论(0)    收藏  举报