4. NodePort与外部访问配置
NodePort Service 的端口映射模型
NodePort 在 ClusterIP 的基础上增加了一层“节点端口”映射:kube-proxy 会在集群每个节点上监听同一个 nodePort(默认范围 30000–32767),把到达 节点IP:nodePort 的流量转发到 Service 的 ClusterIP,再由 Service 负载均衡到后端 Pod 的 targetPort。因此外部访问链路是:客户端 → 节点IP:nodePort → Service ClusterIP:port → Pod:targetPort。
创建 NodePort Service
先确认已有 Deployment 及其容器端口。以下示例假设应用容器监听 8080,Deployment 名为 web,标签为 app=web。
kubectl get deploy web -o wide
kubectl get pods -l app=web -o custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase
编写 NodePort Service 清单,显式指定 nodePort: 30080,避免由系统随机分配后难以记录:
apiVersion: v1
kind: Service
metadata:
name: web-nodeport
spec:
type: NodePort
selector:
app: web
ports:
- name: http
protocol: TCP
port: 80 # Service ClusterIP 上暴露的端口
targetPort: 8080 # 容器实际监听端口
nodePort: 30080 # 每个节点对外监听的端口
kubectl apply -f web-nodeport.yaml
kubectl get svc web-nodeport -o wide
预期输出中 TYPE 为 NodePort,PORT(S) 形如 80:30080/TCP,EXTERNAL-IP 为 <none>(NodePort 不使用外部 IP,而是通过节点 IP 访问)。
从集群外节点 IP 验证访问
获取任一节点的可路由 IP(示例使用 192.168.1.11 与 192.168.1.12):
kubectl get nodes -o wide
在集群外一台能访问节点 IP 的机器上执行:
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://192.168.1.11:30080/
curl -s -o /dev/null -w "HTTP %{http_code}\n" http://192.168.1.12:30080/
两次请求都应返回 HTTP 200,说明任意节点都能代理到后端 Pod。若需要观察负载均衡,可连续请求并查看后端 Pod 的响应标识:
for i in $(seq 1 6); do curl -s http://192.168.1.11:30080/hostname; echo; done
预期响应会在不同 Pod 名称之间交替,证明 Service 正在对多个 Pod 做负载均衡。
端口冲突与防火墙检查
NodePort 失败通常来自两类原因:端口被占用,或节点防火墙未放行。按以下顺序排查。
| 检查项 | 命令 | 判断依据 |
|---|---|---|
| nodePort 是否已被占用 | kubectl get svc -A -o jsonpath='{range .items[*]}{.spec.ports[*].nodePort}{"\n"}{end}' | sort | uniq -d |
输出非空表示有重复 nodePort,需更换端口 |
| 节点端口是否在监听 | ss -lntp | grep 30080 |
应看到 kube-proxy 相关监听;无输出说明规则未生效 |
| 防火墙是否放行 | iptables -L INPUT -n | grep 30080 或 firewall-cmd --list-ports |
无放行规则时外部请求会被丢弃 |
| Service 后端是否就绪 | kubectl get endpoints web-nodeport |
ENDPOINTS 为空说明 selector 未匹配到就绪 Pod |
若
kubectl get endpoints web-nodeport 返回空,先检查 Service 的 selector 是否与 Pod 标签一致,以及 Pod 是否处于 Ready 状态。NodePort 只负责端口映射,不负责修复后端不可用。
关键参数速查
port:Service 在 ClusterIP 上暴露的端口,集群内其他服务通过它访问。targetPort:Pod 内容器实际监听的端口,必须与容器进程一致。nodePort:每个节点对外监听的端口,范围默认 30000–32767,可显式指定或省略由系统分配。selector:决定 Service 将流量转发到哪些 Pod,必须与 Pod 标签匹配。
生产环境若需固定外部入口,建议结合 Ingress 或 LoadBalancer 使用;NodePort 更适合测试、临时暴露或没有云负载均衡器的自建集群。显式指定 nodePort 时,应记录端口分配表,避免多个 Service 争用同一端口。