- 在 Kubernetes 中,
Service
是一种抽象的方式,用于将一组 Pod 进行连接并暴露给外部或集群内部访问。 - 它的主要目的是通过提供稳定的 IP 地址和端口来允许其他服务或客户端与一组 Pod 进行通信。
Service 类型
Kubernetes 中 Service
有四种主要类型,分别是:
- ClusterIP (默认类型)
- NodePort
- LoadBalancer
- ExternalName
各种类型的区别
1. ClusterIP
- 作用:这是默认的
Service
类型,主要用于集群内部的访问。它为Service
分配一个集群内的 IP 地址。 - 访问范围:仅限于 Kubernetes 集群内部的其他 Pod 可以访问该 Service,不能从外部直接访问。
- 适用场景:用于集群内部服务之间的通信,例如微服务架构中的内部通信。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: ClusterIPselector:app: my-appports:- port: 80targetPort: 8080
2. NodePort
- 作用:通过为每个 Node 分配一个端口号(
NodePort
)来暴露 Service,从而可以通过集群中任意 Node 的 IP 和指定端口访问 Service。 - 访问范围:可以从集群外部通过
<NodeIP>:<NodePort>
的方式访问服务。通常会与ClusterIP
配合使用,前者处理集群内部流量,后者则暴露端口给外部。 - 适用场景:适用于需要从外部访问 Kubernetes 集群内服务的场景,比如开发测试环境。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: NodePortselector:app: my-appports:- port: 80targetPort: 8080nodePort: 30007 # 端口号通常在 30000-32767 之间
3. LoadBalancer
- 作用:为
Service
提供一个外部负载均衡器(例如 AWS ELB、GCP Load Balancer 等)。当使用LoadBalancer
类型时,Kubernetes 会自动请求云服务提供商来创建一个负载均衡器并将流量转发到集群中的Service
。 - 访问范围:可以通过外部负载均衡器的 IP 地址或域名访问集群中的 Service。
- 适用场景:适用于需要高可用、可伸缩、并且从外部可以访问的服务,如生产环境中的 Web 应用。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: LoadBalancerselector:app: my-appports:- port: 80targetPort: 8080
4. ExternalName
- 作用:通过一个 CNAME 记录,将
Service
映射到外部的 DNS 名称。这意味着该Service
不会指向集群内的 Pod,而是指向外部的某个 DNS 记录。 - 访问范围:用于从 Kubernetes 集群内部访问外部服务。
- 适用场景:适用于需要将外部服务映射到集群内部的场景,例如访问外部的数据库或 API 服务。
- 示例:
kind: Service apiVersion: v1 metadata:name: my-service spec:type: ExternalNameexternalName: example.com # 外部 DNS 名称
总结:ClusterIP、NodePort 和 LoadBalancer 的区别
类型 | 访问范围 | 适用场景 | 是否支持外部访问 | 使用场景例子 |
---|---|---|---|---|
ClusterIP | 集群内部访问 | 集群内服务间的通信 | 否 | 微服务之间的内部通信 |
NodePort | 集群内外访问,外部通过 Node IP 和端口访问 | 需要从集群外部访问服务 | 是 | 测试环境或开发环境中访问服务 |
LoadBalancer | 集群内外访问,提供外部负载均衡器 | 从外部访问服务,需要高可用、负载均衡 | 是 | 生产环境中需要外部访问的 Web 应用 |
ExternalName | 外部 DNS 名称映射 | 将外部服务映射为 Kubernetes 内部服务 | 是 | 访问外部的数据库或 API 服务 |
小结
- ClusterIP:只限内部访问,适合内部服务通信。
- NodePort:允许外部通过指定端口访问集群,适合开发测试环境。
- LoadBalancer:提供外部负载均衡器,适合生产环境。
- ExternalName:通过外部 DNS 名称访问服务,适合连接外部资源。
https://github.com/0voice