Kubernetes节点80/443端口无法访问,自定义服务端口失效求助
碰到这种手动指定的80、443端口没法访问,但自动分配的NodePort正常的情况,大概率和端口范围限制、系统端口占用、kube-proxy状态、安全规则这几个点有关,咱们一步步来梳理排查:
1. 先确认NodePort的合法范围
Kubernetes默认的NodePort端口范围是30000-32767,如果你手动指定的80、443不在这个区间里,kube-apiserver会直接拒绝分配,Service的状态也会异常。
- 查一下你集群的NodePort配置:
kubectl get configmap kube-apiserver -n kube-system -o yaml | grep -E "service-node-port-range" - 如果确实要用到80、443这类低端口,得修改kube-apiserver的启动参数,加上
--service-node-port-range=1-65535,然后重启apiserver组件。不过要提前留意,低端口很可能被系统服务占用,后续还要做端口占用排查。
2. 检查Node节点上的端口占用情况
80和443是常用端口,很可能被节点上的nginx、apache,甚至系统自带的HTTP服务占用了,导致kube-proxy没法绑定这些端口。
- 在每个Node节点上执行命令查端口占用:
# 检查80端口 sudo netstat -tulpn | grep :80 # 检查443端口 sudo netstat -tulpn | grep :443
要是发现有其他进程占了端口,要么停掉对应服务,要么换个未被占用的端口(或者调整NodePort范围后确认端口空闲)。
3. 验证Service的配置和状态
你只提供了traefik Service的部分定义,建议先确认几个关键配置:
spec.type是不是NodePortspec.ports[*].nodePort有没有正确设置为80/443- Service的
selector是否和Pod的标签匹配(如果selector不匹配,Service没法关联到Pod,自然访问不通)
查看完整的Service配置:
kubectl get service traefik -n kube-system -o yaml
同时检查对应Pod的标签是否匹配:
kubectl get pods -n kube-system -l <你的Service selector标签>
比如如果Service的selector是app=traefik,就用kubectl get pods -n kube-system -l app=traefik,看看有没有正常运行的Pod。
4. 检查kube-proxy的运行状态
kube-proxy负责把NodePort的流量转发到后端Pod,要是它出问题,手动指定的端口可能没法正常转发。
- 先看kube-proxy的Pod状态:
kubectl get pods -n kube-system -l k8s-app=kube-proxy - 再看日志里有没有端口绑定失败的错误:
kubectl logs -n kube-system <kube-proxy-pod-name>
如果日志里出现address already in use这类错误,就回到步骤2处理端口占用的问题。
5. 排查节点防火墙/云安全组规则
就算节点上端口没被占用,防火墙或者云厂商的安全组可能拦住了80、443的入站流量。
- 检查节点的iptables规则:
sudo iptables-save | grep -A5 -B5 <你的NodePort>
确认是否有允许该端口的规则。
- 如果是云环境,记得检查对应节点的安全组是否开放了80、443端口的入站权限。
总结
按上面的步骤逐一排查,最常见的原因就是端口不在NodePort合法范围或者被节点上的其他服务占用。先确认范围,再查端口占用,接着验证Service和kube-proxy状态,最后排查安全规则,应该就能解决问题。
内容的提问来源于stack exchange,提问作者bbholzbb

