在AWS上使用NodePort部署Kubernetes服务遇访问问题求助
我之前在kops搭建的AWS EC2集群上遇到过几乎一模一样的问题,结合你的情况,给你几个实用的排查和解决方向:
1. 检查节点本地的防火墙与转发规则
AWS EC2实例除了安全组,自身还可能有iptables或firewalld规则限制流量:
- 先在任意节点上执行
curl localhost:30001,测试本地能不能访问NodePort对应的服务:- 如果本地能访问,说明公网到节点的流量可能有其他拦截(比如VPC的网络ACL没放开30001端口的入站)
- 如果本地不能访问,执行
iptables-save | grep 30001,查看kube-proxy是否生成了对应的转发规则。如果没有规则,说明kube-proxy的转发配置有问题。
2. 验证kube-proxy的运行状态
NodePort的流量转发完全依赖kube-proxy组件,先确认它在所有节点上都正常运行:
kubectl get pods -n kube-system -l k8s-app=kube-proxy
如果有状态异常的Pod,查看日志排查报错:
kubectl logs -n kube-system <kube-proxy-pod-name>
另外,kops默认使用iptables模式的kube-proxy,你可以通过ConfigMap确认配置:
kubectl describe configmap kube-proxy -n kube-system | grep mode
如果是ipvs模式,需要确认节点上的ipvs模块是否正常加载(执行 lsmod | grep ip_vs)。
3. 调整External Traffic Policy配置
你的Service当前的External Traffic Policy是Cluster,这种模式下外部流量会被转发到集群内任意节点的Pod,可能因为跨节点网络问题导致失败。尝试修改为Local模式,让流量仅转发到当前节点上的Pod:
# 编辑Service配置 kubectl edit svc hello-svc # 在spec字段下添加或修改: externalTrafficPolicy: Local
修改后保存,等待Service更新,再用节点公网IP:30001测试访问。
4. 确认Pod本身的可用性
先排除应用本身的问题:用Endpoints里的Pod IP,在集群内部测试Pod是否正常提供服务:
# 替换为你的Pod IP kubectl exec -it <任意集群内Pod> -- curl 100.96.1.5:8080
如果Pod内部访问失败,先排查应用容器的服务是否正常启动(比如查看Pod日志 kubectl logs <pod-name>)。
5. 关于LoadBalancer Ingress字段
Docker Desktop里的LoadBalancer类型会自动映射到localhost是它的本地模拟特性,而AWS环境下要使用LoadBalancer类型的Service,需要AWS自动创建ELB资源,你当前使用NodePort是符合需求的,所以没有LoadBalancer Ingress字段是正常的,不用纠结这一点。
内容的提问来源于stack exchange,提问作者Shuzheng

