34·Service进阶

NodePort 服务

kubernetesservicenodeportnetworking

NodePort 服务

学习目标

  1. 理解 NodePort 的工作原理
  2. 掌握 NodePort 的配置方法
  3. 了解 NodePort 的使用场景和限制

核心概念

一句话解释

NodePort 在每个节点上开放一个端口,外部客户端可以通过任意节点的 IP 和该端口访问服务。

NodePort 工作原理

外部客户端
    │
    ▼
┌─────────────────────────────────────────┐
│  Node 1 (IP: 192.168.1.10)             │
│  NodePort: 30080                        │
│  ┌─────────────────────────────────┐   │
│  │  kube-proxy                     │   │
│  │  ┌─────────────────────────┐   │   │
│  │  │  ClusterIP Service      │   │   │
│  │  │  IP: 10.96.0.100        │   │   │
│  │  └─────────────────────────┘   │   │
│  └─────────────────────────────────┘   │
└─────────────────────────────────────────┘
        │           │           │
        ▼           ▼           ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│   Pod 1   │ │   Pod 2   │ │   Pod 3   │
│ (任意节点) │ │ (任意节点) │ │ (任意节点) │
└───────────┘ └───────────┘ └───────────┘

NodePort 配置

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30080

配置参数说明

参数说明默认值
typeService 类型NodePort
portService 端口
targetPortPod 端口与 port 相同
nodePort节点端口自动分配 (30000-32767)

NodePort 端口范围

┌─────────────────────────────────────────┐
│  NodePort 端口范围: 30000-32767         │
├─────────────────────────────────────────┤
│  30000 ──────────────────────────────── │
│  30001                                  │
│  ...                                    │
│  30080 (示例)                           │
│  ...                                    │
│  32767 ──────────────────────────────── │
└─────────────────────────────────────────┘

NodePort 访问方式

1. 通过任意节点 IP 访问
   curl http://192.168.1.10:30080
   curl http://192.168.1.11:30080
   curl http://192.168.1.12:30080

2. 通过 DNS 访问(如果配置了 DNS)
   curl http://node1.example.com:30080

NodePort 与 ClusterIP 关系

┌─────────────────────────────────────────┐
│  NodePort Service                       │
│  type: NodePort                         │
│  nodePort: 30080                        │
│  port: 80                               │
│  targetPort: 8080                       │
└─────────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────────┐
│  自动创建 ClusterIP Service             │
│  type: ClusterIP                        │
│  IP: 10.96.0.100                        │
│  port: 80                               │
│  targetPort: 8080                       │
└─────────────────────────────────────────┘

NodePort 网络流程

外部请求
    │
    ▼
节点 IP:NodePort (192.168.1.10:30080)
    │
    ▼
kube-proxy (iptables/IPVS)
    │
    ▼
ClusterIP Service (10.96.0.100:80)
    │
    ▼
后端 Pod (10.244.1.5:8080)

NodePort 特性

特性说明
外部访问集群外部可访问
节点端口在每个节点上开放端口
端口范围30000-32767
自动分配可自动分配端口
负载均衡自动分发请求到后端 Pod

NodePort 使用场景

1. 开发测试环境
   - 简单的外部访问
   - 不需要云负载均衡器

2. 本地环境
   - Minikube 访问
   - 本地开发调试

3. 临时访问
   - 快速验证服务
   - 临时调试

4. 自建负载均衡器
   - 在 NodePort 前放置外部负载均衡器

NodePort 限制

1. 端口范围限制
   - 只能使用 30000-32767
   - 不能使用 80、443 等常用端口

2. 节点 IP 依赖
   - 需要知道节点 IP
   - 节点 IP 可能变化

3. 无自动负载均衡
   - 需要外部负载均衡器
   - 或使用 DNS 轮询

4. 安全性
   - 端口暴露在所有节点
   - 需要配置网络策略

NodePort 与 LoadBalancer

NodePort:
- 简单,但有限制
- 需要知道节点 IP
- 无自动负载均衡

LoadBalancer:
- 云环境自动创建负载均衡器
- 自动分配外部 IP
- 生产环境首选

实践练习

练习 1:创建 NodePort Service

创建一个 NodePort Service:

apiVersion: v1
kind: Service
metadata:
  name: web-nodeport
spec:
  type: NodePort
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30080

练习 2:访问 NodePort

  1. 创建 Service
  2. 查看节点 IP
  3. 通过节点 IP 和端口访问服务
  4. 验证负载均衡

常见误解

1. NodePort 不是生产环境首选

错误:生产环境使用 NodePort
正确:生产环境使用 LoadBalancer 或 Ingress

NodePort 适合开发测试,不适合生产

2. NodePort 不是单节点访问

错误:只能通过一个节点访问
正确:可以通过任意节点访问

NodePort 在所有节点上开放端口

小结

要点说明
NodePort节点端口外部访问
端口范围30000-32767
访问方式任意节点 IP:NodePort
使用场景开发测试、临时访问
限制端口范围、节点 IP 依赖

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「LoadBalancer 服务」 以巩固所学知识。