4. NodePort与外部访问配置

NodePort与外部访问配置 学习卡片

NodePort Service 的端口映射模型

NodePort 在 ClusterIP 的基础上增加了一层“节点端口”映射:kube-proxy 会在集群每个节点上监听同一个 nodePort(默认范围 30000–32767),把到达 节点IP:nodePort 的流量转发到 Service 的 ClusterIP,再由 Service 负载均衡到后端 Pod 的 targetPort。因此外部访问链路是:客户端 → 节点IP:nodePort → Service ClusterIP:port → Pod:targetPort。

集群外客户端 curl 节点IP:30080 (任意节点均可) Kubernetes 节点(每台节点都监听 30080) node-1 kube-proxy 监听 :30080 iptables/IPVS 规则 转发到 ClusterIP node-2 kube-proxy 监听 :30080 iptables/IPVS 规则 转发到 ClusterIP Service (NodePort) port: 80 → targetPort: 8080 nodePort: 30080 Pod A :8080 Pod B :8080 外部流量 nodePort 30080 (默认范围 30000-32767) targetPort 8080 (容器实际监听端口)

创建 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 争用同一端口。