节点端口 (Node Port) 是什么
NodePort 是 Kubernetes Service 的另一种类型,它是 ClusterIP 的自然扩展。
如果说 ClusterIP 是为集群内部提供服务的“内网地址”,那么 NodePort 就是为集群外部打开的一扇“窗户”。它允许外部流量通过集群中每个节点(Node)的特定端口访问到集群内部的服务。
以下是关于 NodePort 的核心机制、工作流程及优缺点分析:
1. 核心定义
- 暴露方式:Kubernetes 会在集群中的每一个节点(包括 Master 节点和 Worker 节点)上开放同一个静态端口(即 NodePort)。
- 访问路径:外部客户端可以通过
http://<任意节点IP>:<NodePort端口>访问服务。 - 流量转发:发送到该端口的流量会被自动转发到对应的 ClusterIP Service,然后再由 ClusterIP 负载均衡到后端的 Pod。
- 端口范围:默认情况下,NodePort 的端口范围是 30000 - 32767。如果指定的端口不在此范围内,API Server 会拒绝创建。
2. 工作原理(流量走向)
NodePort 的流量转发链路通常如下:
- 外部请求:用户发起请求
curl http://<Node-IP>:30080。 - 节点接收:请求到达集群中任意一个节点的物理网卡,目标端口是 30080。
- kube-proxy 拦截:节点上运行的
kube-proxy组件(通过 iptables 或 IPVS 规则)拦截该端口的流量。 - 转发至 ClusterIP:kube-proxy 将流量重定向(DNAT)到该 Service 对应的 ClusterIP 和端口(例如
10.96.x.x:80)。 - 内部负载均衡:ClusterIP 再次根据规则,将流量转发给后端某个健康的 Pod IP。
关键点:你不需要知道具体哪个节点运行了 Pod。即使请求发到了一个没有运行该 Pod 的节点,kube-proxy 也能通过集群网络将流量正确地转发到有 Pod 的节点上。
3. YAML 配置示例
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
type: NodePort # 指定类型为 NodePort
selector:
app: my-web-app
ports:
- protocol: TCP
port: 80 # Service 内部的端口 (ClusterIP 端口)
targetPort: 8080 # 容器监听的端口
nodePort: 30080 # (可选) 指定外部访问端口,范围 30000-32767
# 如果不指定,K8s 会自动分配一个空闲端口
访问命令:
假设集群有三个节点,IP 分别为
你可以使用以下任意一个地址访问服务:
假设集群有三个节点,IP 分别为
192.168.1.10, 192.168.1.11, 192.168.1.12。你可以使用以下任意一个地址访问服务:
curl http://192.168.1.10:30080curl http://192.168.1.11:30080curl http://192.168.1.12:30080
4. 优缺点分析
✅ 优点
- 简单易用:无需依赖云厂商的负载均衡器(LoadBalancer),在裸金属服务器、本地虚拟机或开发环境中即可直接对外提供服务。
- 高可用入口:由于每个节点都开放了该端口,只要集群中有一个节点存活且网络可达,服务就可通过该节点访问。
- 调试方便:非常适合开发测试阶段,快速验证服务是否可被外部访问。
❌ 缺点
- 端口限制:每个服务必须占用一个唯一的端口号。如果部署很多服务,容易耗尽 30000-32767 这个有限的端口范围。
- IP 管理复杂:客户端需要知道至少一个节点的 IP 地址。如果节点 IP 变化(常见于动态环境),客户端配置需要更新。通常需要在 Service 前面再挂一个硬件负载均衡器(如 F5、Nginx)来统一入口 IP。
- 安全性较低:直接暴露节点端口可能增加攻击面。通常需要配合防火墙策略,只允许可信 IP 访问 NodePort 范围。
- 不支持高级路由:无法像 Ingress 那样基于域名(Host)或路径(Path)进行七层路由,只能基于端口进行四层转发。
5. NodePort 与 ClusterIP、LoadBalancer 的关系
可以将它们理解为层层递进的关系:
- ClusterIP:仅内部可见,是基础。
- NodePort = ClusterIP + 在所有节点上开放端口。
- 当你创建 NodePort 时,K8s 实际上会自动创建一个关联的 ClusterIP。
- LoadBalancer = NodePort + 云厂商的外部负载均衡器。
- 在云环境(如 AWS, Aliyun, GCP)中,创建 LoadBalancer 类型的 Service 时,云厂商会自动创建一个外部 LB,并将流量转发到集群节点的 NodePort 上。
总结
NodePort 是一种简单粗暴但有效的服务暴露方式。
- 适用场景:开发测试环境、没有云负载均衡器的自建集群、或者作为云负载均衡器(LoadBalancer)的后端补充。
- 生产建议:在生产环境中,如果需要对外提供 HTTP/HTTPS 服务,通常推荐使用 Ingress(基于域名和路径的七层网关)或者云厂商原生的 LoadBalancer,而不是直接让客户端连接 NodePort,以获得更好的灵活性、安全性和端口管理能力。
浙公网安备 33010602011771号