主题
第4章 Service 的四种类型详解
Kubernetes Service 有四种主要类型:ClusterIP、NodePort、LoadBalancer、ExternalName。本章逐一讲解它们的用途、YAML 和访问方式。
4.1 ClusterIP(默认)
ClusterIP 是默认类型,分配一个仅在集群内部可达的虚拟 IP。
适用场景
- 集群内部微服务之间互相调用。
- 不需要外部访问的后端服务。
YAML 示例
yaml
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
type: ClusterIP
selector:
app: user
ports:
- port: 80
targetPort: 8080访问方式
bash
# 同命名空间
curl http://user-service:80
# 跨命名空间
curl http://user-service.production:80
# 完整 FQDN
curl http://user-service.production.svc.cluster.local:80流量路径
text
Client Pod -> Service ClusterIP:port -> kube-proxy 转发 -> Backend Pod:targetPort4.2 NodePort
NodePort 在 ClusterIP 基础上,在每个节点上开放一个固定端口。
适用场景
- 临时测试外部访问。
- 作为 LoadBalancer 或 Ingress Controller 的底层入口。
YAML 示例
yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # 可选,不指定则自动分配 30000-32767访问方式
bash
# 集群内部仍可用 ClusterIP
curl http://web-service:80
# 集群外部通过任意节点 IP + NodePort
curl http://<Node-IP>:30080注意事项
- NodePort 范围默认
30000-32767。 - 不指定
nodePort时自动分配,重建 Service 可能变化。 - 生产环境一般不直接用 NodePort 暴露公网。
4.3 LoadBalancer
LoadBalancer 在 NodePort 基础上,请求云厂商(或 MetalLB 等)创建一个外部负载均衡器。
适用场景
- 生产环境需要稳定的公网入口。
- 云厂商 Kubernetes 集群。
YAML 示例
yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 8080访问方式
bash
# 查看分配的外部 IP
kubectl get svc web-service
# 输出示例
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# web-service LoadBalancer 10.96.10.20 47.100.1.1 80:30080/TCP 1m
# 外部访问
curl http://47.100.1.1:80云厂商差异
不同云厂商的 LoadBalancer 实现略有不同:
- 阿里云:SLB
- AWS:ELB / NLB
- GCP:GCP Load Balancer
- Azure:Azure Load Balancer
4.4 ExternalName
ExternalName 没有 selector,也不分配 ClusterIP。它将 Service 名称映射到一个外部 DNS 名称(CNAME)。
适用场景
- 将集群内服务平滑迁移到外部服务,或反之。
- 让应用通过统一的内部域名访问外部 API。
YAML 示例
yaml
apiVersion: v1
kind: Service
metadata:
name: external-api
spec:
type: ExternalName
externalName: api.external-provider.com访问方式
bash
curl http://external-apiDNS 会返回 api.external-provider.com 的 CNAME 记录,再由外部 DNS 解析为实际 IP。
4.5 四种类型对比
| 类型 | 分配 ClusterIP | 暴露 NodePort | 外部入口 | 适用场景 |
|---|---|---|---|---|
| ClusterIP | ✅ | ❌ | ❌ | 集群内部调用 |
| NodePort | ✅ | ✅ | 通过节点 IP | 测试、LB 底层 |
| LoadBalancer | ✅ | ✅(底层) | 云 LB IP | 生产公网入口 |
| ExternalName | ❌ | ❌ | 外部 DNS | 内外服务映射 |
4.6 类型之间的关系
text
ExternalName
│
▼
CNAME 外部域名
ClusterIP <──── NodePort <──── LoadBalancer
内部 节点端口 云负载均衡器也就是说:
- NodePort 包含 ClusterIP 的能力。
- LoadBalancer 包含 NodePort 的能力。
- ExternalName 是独立机制,用于 DNS 别名。
4.7 本章小结
- ClusterIP 用于内部调用,是最常用的类型。
- NodePort 用于测试或作为 LB/Ingress 的底层入口。
- LoadBalancer 用于生产公网访问,依赖云厂商或 MetalLB。
- ExternalName 用于将内部域名映射到外部域名。
本章练习
- 分别创建 ClusterIP、NodePort、LoadBalancer(如果环境支持)、ExternalName 四种 Service。
- 从集群内和集群外分别测试它们的访问方式。
- 思考:为什么生产环境优先用 LoadBalancer 或 Ingress,而不是直接暴露 NodePort?