在 Kubernetes (K8s) 中,Service 是一种抽象,它定义了一种访问 Pod 的方式,无论背后 Pod 的数量如何变化。Service 为一组执行相同功能的 Pod 提供一个稳定的接口和地址(通常是一个 IP 场址和端口),客户端只需通过这个接口访问服务,而无需关心后端 Pod 的具体情况。
核心特性
- 稳定的访问点:Service 提供一个稳定的 IP 地址和端口,客户端可以通过这个地址访问后端的一组 Pod,即使 Pod 发生扩缩容或更新。
- 负载均衡:Service 可以对后端的 Pod 进行负载均衡,将外部请求分发到所有健康的 Pod 上。
- 服务发现:Kubernetes 通过内部 DNS 支持基于 Service 名称的服务发现,使得 Pod 之间可以通过 Service 名称进行通信。
Service 类型
Kubernetes 提供了几种类型的 Service,以适应不同的访问和曝露服务的需求:
- ClusterIP(默认类型):分配一个内部的 IP 地址给 Service,使得 Service 只能在集群内部访问。这是默认的 Service 类型。
- NodePort:在每个节点上打开一个静态端口(NodePort),并将该端口路由到 Service。这允许从集群外部通过
<NodeIP>:<NodePort>
访问 Service。 - LoadBalancer:在支持的云平台上,通过创建一个外部负载均衡器来自动将外部流量路由到 Service。这种类型使得 Service 可以通过外部 IP 地址被互联网访问。
- ExternalName:通过返回一个 CNAME 记录,将 Service 映射到 externalName 字段的值(如
),无需代理。这主要用于将服务映射到集群外部的服务。
Service 定义
Service 是通过 YAML(或 JSON)文件定义的,其中指定了 Service 的类型、选择器(Selector)、端口等信息。选择器用于确定哪些 Pod 属于这个 Service。
示例
以下是一个简单的 Service 定义示例,它创建了一个名为 “my-service” 的 ClusterIP 类型的 Service,用于访问带有标签 app: MyApp
的 Pod。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
在这个例子中,Service 将监听 80 端口上的 TCP 流量,并将所有流量路由到标签为 app: MyApp
的 Pod 上的 9376 端口。
使用场景
- 内部通信:在 Pod 之间进行通信时,使用 ClusterIP 类型的 Service。
- 外部访问:当需要从集群外部访问应用时,可以使用 NodePort 或 LoadBalancer 类型的 Service。
- 第三方服务集成:当需要在应用中使用外部服务时,可以使用 ExternalName 类型的 Service 来实现。
Kubernetes 的 Service 是集群内部通信和外部访问的基石,为 Pod 提供了一个可靠和灵活的访问机制。