Kubernetes Service 是将一组 Pod 抽象化并提供稳定网络访问点的核心资源。了解不同的 Service 类型及其用途,对于正确设计 K8s 集群的通信架构至关重要。本文将聚焦三种最常见的 Service 类型:ClusterIP、NodePort 和 LoadBalancer,并提供实际操作示例。
1. ClusterIP:集群内部通信的基石
定义: ClusterIP 是 Service 的默认类型。它为 Service 分配一个只能在集群内部访问的虚拟 IP 地址。外部世界无法直接访问这个 IP。
应用场景:
* 后端服务(如数据库、缓存)。
* 微服务架构中,服务A调用服务B。
* 任何只需要在集群内部提供稳定接入点的服务。
实操示例:
apiVersion: v1
kind: Service
metadata:
name: internal-backend-service
spec:
type: ClusterIP # 默认值,可以省略
selector:
app: my-backend
ports:
- protocol: TCP
port: 80
targetPort: 8080 # Pod 容器暴露的端口
2. NodePort:简单粗暴的外部暴露
定义: NodePort 类型在 ClusterIP 的基础上,在集群中的所有节点(Node)上打开一个静态端口(默认范围 30000-32767)。这意味着你可以通过集群中任何节点的 IP 地址和这个 NodePort 访问服务。
访问方式: http://
应用场景:
* 开发或测试环境,需要快速临时暴露服务。
* 在没有集成云服务提供商(如自建数据中心)时,作为最基本的外部访问方式。
* 需要将流量通过外部防火墙或负载均衡器转发到特定端口。
实操示例:
apiVersion: v1
kind: Service
metadata:
name: external-nodeport-service
spec:
type: NodePort
selector:
app: my-frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080 # 可选,如果不指定,K8s 会自动分配一个端口
注意: NodePort 适用于小规模或测试场景,但在生产环境中不推荐直接使用,因为每个节点的 IP 地址都需要被管理,并且端口范围有限。
3. LoadBalancer:云原生生产环境的首选
定义: LoadBalancer 类型在 NodePort 的基础上,自动与底层的云服务提供商(AWS、GCP、Azure等)集成,创建并配置一个外部负载均衡器。这个负载均衡器拥有一个稳定的外部 IP 地址,并将流量路由到集群中的 NodePort。
访问方式: http://
应用场景:
* 生产环境下的 Web 应用或 API 网关。
* 需要高可用性(HA)和专业流量管理(如 SSL 终止、健康检查)的公共服务。
实操示例:
apiVersion: v1
kind: Service
metadata:
name: external-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-web-app
ports:
- protocol: TCP
port: 80
targetPort: 80
注意: 使用 LoadBalancer 类型需要你的 K8s 集群运行在一个支持外部 Load Balancer 集成的云环境中。
总结对比与选择指南
选择 Service 类型的核心依据在于你的服务需要暴露给谁:
| 特性 | ClusterIP | NodePort | LoadBalancer |
|---|---|---|---|
| 访问范围 | 集群内部 | 集群外部(通过任一 Node IP) | 集群外部(通过云 LB IP) |
| 稳定地址 | ClusterIP | Node IP + 固定的 NodePort | 外部 LB IP |
| 生产适用性 | 后端服务 | 测试/小规模 | 公共服务/生产 |
| 前提条件 | 无 | 无 | 需云服务集成 |
选择建议:
- 内部通信: 始终使用 ClusterIP。
- 临时外部访问/自建集群: 使用 NodePort。
- 云上生产级外部访问: 使用 LoadBalancer。
汤不热吧