NodePort 是一种 Kubernetes 服务类型,通过在集群中的每个节点上开放一个静态端口,将应用程序暴露到外部。外部流量可以通过节点的 IP 地址和分配的端口访问该服务。
主要特性
- 端口范围:默认情况下,NodePort 使用 30000-32767 范围内的端口
- 访问方式:通过
<k8s节点IP>:<端口号
>
从集群外部访问。 - 流量路由:
- 发送到 NodePort 端口的流量会被路由到对应的 Service。
- Service 根据标签选择器(labels/selectors)将流量转发到后端某个 Pod。
适用场景
场景适用:开发和测试环境时快速暴露服务供外部访问。在无云负载均衡器的本地化环境中使用。还有就是当外部负载均衡器不可用时,直接通过节点暴露服务。
工作原理
- 服务创建:创建 NodePort 服务时,Kubernetes 会:
- 在每个节点上分配一个高位端口(如
31000
)。 - 创建一个 ClusterIP服务(集群内部访问),将流量路由到 Pod。
- 在每个节点上分配一个高位端口(如
- 外部访问:用户通过
<k8s节点IP>:31000
访问服务,节点将流量转发给 Service。
写一个YAML简单实例
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort #指定服务类型
selector:
app: my-app
ports:
- port: 80 # 服务端口(集群内部访问)
targetPort: 80 # 后端 Pod 端口
nodePort: 32342(30000-32767) # 手动指定 NodePort 端口(默认系统将自动分配)
服务类型的对比
服务类型 | 用途 | 访问范围 |
---|---|---|
ClusterIP | 集群内部通信 | 仅限集群内 |
NodePort | 通过节点 IP:端口 外部访问 | 集群外 |
LoadBalancer | 云平台提供的负载均衡器 | 自动分配外部 IP |
常见问题排查
- 确保节点防火墙允许 NodePort 端口通信。
- 检查 Service 的标签选择器是否匹配 Pod 标签。
- 使用
kubectl get svc
确认 NodePort 是否已分配。