Kubernetes中servie类型有几种

在 Kubernetes (k8s) 中,Service(服务)是用来定义一组 Pod 的网络访问方式的资源。Service 的类型通过 spec.type 字段指定,目前 Kubernetes 支持以下几种 Service 类型。

1. ClusterIP(默认类型)

  • 描述: 这是 Kubernetes 的默认 Service 类型。Service 会被分配一个集群内部的虚拟 IP(ClusterIP),只能在集群内部访问
  • 用途: 用于集群内部 Pod 之间的通信。
  • 特点:
    • 不暴露到集群外部。
    • 通过 ClusterIP 和端口访问。
  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    spec:
    selector:
    app: my-app
    ports:
    - protocol: TCP
    port: 80
    targetPort: 8080
    type: ClusterIP

2. NodePort

  • 描述: 在每个节点的特定端口上暴露服务,外部流量可以通过 <NodeIP>:<NodePort> 访问。
  • 用途: 适合需要从集群外部访问服务,但不想使用负载均衡器的场景。
  • 特点:
    • 自动分配一个端口(默认范围 30000-32767),也可以手动指定。
    • ClusterIP 仍然存在,内部也可以通过 ClusterIP 访问。
  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    spec:
    selector:
    app: my-app
    ports:
    - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30007
    type: NodePort

3. LoadBalancer

  • 描述: 将服务暴露到外部,通过云提供商的负载均衡器(如 AWS ELB、GCP Load Balancer)分配一个外部 IP。
  • 用途: 适用于需要高可用性和外部访问的生产环境。
  • 特点:
    • 需要运行在支持负载均衡器的云平台上。
    • 自动创建 ClusterIP 和 NodePort。
    • 外部 IP 由云提供商分配。
  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    spec:
    selector:
    app: my-app
    ports:
    - protocol: TCP
    port: 80
    targetPort: 8080
    type: LoadBalancer

4. ExternalName

  • 描述: 不创建代理,而是将 Service 映射到外部 DNS 名称,流量直接转发到外部服务。
  • 用途: 用于集成集群外部的服务,而无需在集群内创建代理。
  • 特点:
    • 不分配 ClusterIP、NodePort 或 LoadBalancer。
    • 通过 DNS 返回外部名称的 CNAME 记录。
  • 示例:
    1
    2
    3
    4
    5
    6
    7
    apiVersion: v1
    kind: Service
    metadata:
    name: my-service
    spec:
    type: ExternalName
    externalName: example.com

5. Headless Service(特殊情况)

  • 描述: 严格来说,Headless Service 不是一种独立的 type,而是通过将 spec.clusterIP 设置为 None 实现的特殊 ClusterIP 服务。它不分配虚拟 IP,而是直接返回后端 Pod 的 IP
  • 用途: 适用于需要直接访问具体 Pod 的场景(如 StatefulSet)。
  • 特点:
    • 不进行负载均衡。
    • DNS 返回所有匹配 Pod 的 IP。
  • 示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    apiVersion: v1
    kind: Service
    metadata:
    name: headless-service
    spec:
    clusterIP: None
    selector:
    app: my-app
    ports:
    - protocol: TCP
    port: 80
    targetPort: 8080

总结

Kubernetes Service 类型共有以下几种:

  1. ClusterIP(默认,集群内部访问)
  2. NodePort(节点端口暴露)
  3. LoadBalancer(外部负载均衡器)
  4. ExternalName(映射外部服务)
  5. Headless Service(无 ClusterIP,特殊用法)