NodePort 服务
学习目标
- 理解 NodePort 的工作原理
- 掌握 NodePort 的配置方法
- 了解 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
配置参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
| type | Service 类型 | NodePort |
| port | Service 端口 | 无 |
| targetPort | Pod 端口 | 与 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
- 创建 Service
- 查看节点 IP
- 通过节点 IP 和端口访问服务
- 验证负载均衡
常见误解
1. NodePort 不是生产环境首选
错误:生产环境使用 NodePort
正确:生产环境使用 LoadBalancer 或 Ingress
NodePort 适合开发测试,不适合生产
2. NodePort 不是单节点访问
错误:只能通过一个节点访问
正确:可以通过任意节点访问
NodePort 在所有节点上开放端口
小结
| 要点 | 说明 |
|---|---|
| NodePort | 节点端口外部访问 |
| 端口范围 | 30000-32767 |
| 访问方式 | 任意节点 IP:NodePort |
| 使用场景 | 开发测试、临时访问 |
| 限制 | 端口范围、节点 IP 依赖 |
练习编辑器
bash
Loading...