Skip to content

第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:targetPort

4.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-api

DNS 会返回 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 用于将内部域名映射到外部域名。

本章练习

  1. 分别创建 ClusterIP、NodePort、LoadBalancer(如果环境支持)、ExternalName 四种 Service。
  2. 从集群内和集群外分别测试它们的访问方式。
  3. 思考:为什么生产环境优先用 LoadBalancer 或 Ingress,而不是直接暴露 NodePort?