Kubernetes

Kubernetes(k8s) NodePort 介绍

在 Kubernetes(K8s)中,NodePort 是一种将集群内部服务暴露到外部网络的方式,属于 Service 资源的一种类型。它允许通过集群中任意节点的固定端口(30000-32767)访问服务,是最简单的外部访问方式之一。

一、NodePort 的核心作用


  1. 外部访问入口
    • 将集群内部的服务(如 Web 应用、API)暴露到集群外部,使外部客户端(如浏览器、其他服务器)可以通过节点 IP 和 NodePort 访问服务。
  2. 简化服务暴露
    • 无需依赖外部负载均衡器(如云厂商的 Load Balancer),直接通过节点 IP 即可访问,适用于测试环境或资源有限的场景。
  3. 固定端口分配
    • 每个 NodePort 服务会被分配一个唯一的端口(范围:30000-32767),该端口在集群所有节点上保持一致。

二、NodePort 的工作原理


  1. Service 资源创建
    • 定义一个 Service 资源,将 type 设置为 NodePort,并指定内部端口和目标端口。
  2. 节点端口映射
    • K8s 会在集群的每个节点上打开一个固定端口(NodePort),并将该端口的流量转发到对应的服务。
  3. 负载均衡
    • 当外部请求访问任意节点的 NodePort 时,请求会被转发到后端的 Pod 集合(由 selector 定义),实现负载均衡。

三、NodePort 配置示例


以下是一个 NodePort Service 的 YAML 配置示例:

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
  labels:
    app: nginx
spec:
  type: NodePort  # 指定 Service 类型为 NodePort
  ports:
    - port: 80          # 服务端口(集群内部访问)
      targetPort: 80    # Pod 端口(实际应用监听的端口)
      nodePort: 30080   # 可选:指定 NodePort(默认范围 30000-32767)
  selector:
    app: nginx  # 匹配具有相同标签的 Pod

创建该 Service 后:

  • 集群内部可通过 nginx-nodeport:80 访问服务。
  • 集群外部可通过任意节点的 IP 和 NodePort(如 http://<节点IP>:30080)访问服务。

四、NodePort 的特点


  1. 端口范围限制
    • NodePort 必须在 30000-32767 范围内,若未指定,K8s 会自动分配一个可用端口。
  2. 节点 IP 依赖性
    • 客户端需知道节点的 IP 地址才能访问服务,适用于节点 IP 固定或可通过 DNS 解析的场景。
  3. 多节点冗余
    • 可通过任意节点的 NodePort 访问服务,即使某个节点故障,只要集群中还有存活节点,服务仍可访问。
  4. 安全性考虑
    • NodePort 直接暴露服务到节点,需确保节点防火墙配置安全,避免未授权访问。

五、NodePort vs 其他 Service 类型


Service 类型工作方式适用场景外部访问方式
ClusterIP默认类型,创建集群内部可访问的虚拟 IP,仅集群内部可访问。集群内服务间通信无法直接外部访问
NodePort在每个节点上打开固定端口,将流量转发到服务。测试环境、简单外部访问http://<节点IP>:<NodePort>
LoadBalancer使用云厂商的负载均衡器(如 AWS ELB、GCP Load Balancer)自动分配外部 IP,并将流量转发到服务。生产环境、高可用性需求http://<外部负载均衡器IP>
ExternalName通过 CNAME 记录将服务映射到外部域名(如 db.example.com),不创建任何代理或转发。访问集群外服务(如第三方 API)直接通过域名访问

六、NodePort 的使用场景


  1. 测试与开发环境
    • 快速验证服务功能,无需复杂的负载均衡配置。
  2. 内部网络访问
    • 服务仅需在企业内部网络暴露,可通过节点 IP 和 NodePort 访问。
  3. 自建负载均衡
    • 在没有云厂商负载均衡器的环境中,可结合外部负载均衡器(如 NGINX、HAProxy)使用 NodePort。
  4. 临时服务暴露
    • 临时需要对外提供服务,无需长期维护复杂的暴露方式。

七、NodePort 的局限性


  1. 端口管理复杂
    • 服务较多时,需手动管理 NodePort 端口分配,避免冲突。
  2. 扩展性有限
    • 每个服务需占用一个 NodePort,端口范围(30000-32767)最多支持约 2767 个服务。
  3. 安全性风险
    • 直接暴露节点端口,增加攻击面,需结合防火墙或 NetworkPolicy 限制访问。
  4. 外部负载均衡缺失
    • 缺乏专业负载均衡器的高级功能(如健康检查、会话亲和性、SSL 终止)。

八、NodePort 与其他组件结合使用


  1. 与 Ingress 结合
    • Ingress Controller 本身可通过 NodePort 暴露,再由 Ingress 规则将流量路由到不同服务,实现更灵活的路由和负载均衡。
  2. 与外部负载均衡器结合
    • 在自建环境中,可使用外部负载均衡器(如 HAProxy)监听 NodePort,再将流量分发到多个节点,提升可用性。

九、总结


NodePort 是 K8s 中最简单的服务暴露方式,通过节点固定端口将服务暴露到外部网络。它适用于测试、开发或内部网络环境,但由于其端口限制和安全性考虑,生产环境通常推荐使用 LoadBalancer 或 Ingress。理解 NodePort 的工作原理和适用场景,有助于在不同环境中选择合适的服务暴露策略。