一文读懂Service以及实践攻略
目录
- 1 一文读懂 Kubernetes Service 以及实践攻略
- 2 实践:部署和测试Service
- 3 服务发现
- 4 总结
- 5 参考资料
1 一文读懂 Kubernetes Service 以及实践攻略
❤️ 摘要:在 Kubernetes 中,Service 是连接应用与外部世界的重要桥梁,是Kubernetes 集群中的核心资源之一。提供了稳定的访问入口,即使应用 Pod 动态变化,Service 依然保持对外的一致性。本文将从基础介绍到实践操作,深入解析 Kubernetes Service 的工作原理、类型、配置以及常见的实践应用,帮助你全面掌握 Service 的使用和最佳实践。
💯 本文关联好文:
1.1 1. 什么是 Service?
在 Kubernetes 中,Service 是一种网络抽象层,负责暴露一组 Pod,以便外部用户或内部组件能够通过一个固定的访问点与 Pod 通信。由于 Pod 的生命周期是短暂且可能频繁变动的,其 IP 地址也随之变化,Service 提供了一种稳定的访问方式,无论 Pod 如何变化,用户都可以通过 Service 一致地与后端 Pod 通信,通过抽象层将流量引导至正确的 Pod。
例如:服务(Service)作为餐厅的接待员,负责接待顾客(用户),并确保始终可以通过接待员获得稳定的服务。当Service接到顾客的订单,他会告诉后厨(pod)要完成哪些特色菜(应用程序),虽然某个厨师可能会因为休息或换班而离开,但总会把订单交到相应的厨师手上。
1.1.1 为什么需要 Service?
当某个 Pod 被删除或更新时,其 IP 地址会发生变化。如果其他服务需要与这些 Pod 通信,无法直接依赖 Pod 的 IP。因此,Service 提供了以下功能:
- 持久的网络标识:即使 Pod 重启或更换,Service 提供的 IP 和 DNS 名称仍然保持不变。Service 通过一个虚拟 IP 地址(ClusterIP)和 DNS 名称为外部提供了统一的访问方式,即使后端的 Pod 动态变化,客户端也不需要修改任何配置。
- 负载均衡:Service 会自动将流量分发到后端的一组 Pod,确保高可用性和负载均衡。
1.2 2. Service 的工作原理
❔ 说明:关于Service、EndpointSlice的关系,后续出相关文章说明。
1.2.1 核心概念
- Selector:Service 通过标签选择器(Label Selector)来定位要暴露的 Pod,Selector 允许 Service 动态绑定一组 Pod,进行流量的负载均衡。
- ClusterIP:Kubernetes 为每个 Service 分配一个虚拟 IP(ClusterIP),通过这个 IP,集群内的其他 Pod 可以稳定地访问该 Service。
- Endpoints:Service 使用 Endpoints 资源来追踪与其关联的 Pod。Endpoints 是一组 IP 地址和端口的集合,代表了实际的后端 Pod。
- EndpointSlice: 在Kubernetes v1.21版本后,EndpointSlice API 是 Endpoints 的推荐替代品,提供了更多的可伸缩性和可扩展性。
1.2.2 流量转发过程
- 当客户端(如其他 Pod)访问一个 Service 的 ClusterIP 地址时,流量会先到达 Kubernetes 的 kube-proxy。
- kube-proxy 根据该 Service 的配置,将流量通过负载均衡的方式转发到后端的 Pod 上。( 默认采用 轮询 负载均衡策略,即每个请求被依次发送到不同的 Pod。)
- Pod返回响应,完成一次完整的请求-响应过程。
❔ 说明: 对于具有更多高级需求的应用场景,还可以结合 Ingress 或 外部负载均衡器 进行更复杂的流量控制。
1.3 3. Service 的几种类型及应用场景
Kubernetes 提供了多种类型的 Service,适应不同的场景需求。常见的 Service 类型包括:
Service 类型 | 功能 | 使用场景 |
---|---|---|
ClusterIP | ClusterIP 是 Kubernetes Service 的默认类型,适用于 集群内通信。它为 Service 分配一个内部 IP,其他 Pod 可以通过该 IP 访问服务。</br> ClusterIP 只在集群内部可访问,无法被外部访问。 | 集群内部服务间的通信,如集群内部的微服务通信。 |
NodePort | NodePort 在每个节点上开放一个静态端口,外部用户可以通过 NodeIP:NodePort 的方式访问服务。 |
当你想通过集群节点的 IP 地址和端口直接访问应用时,可以使用 NodePort。 |
LoadBalancer | 为服务创建一个云提供商的外部负载均衡器(如 AWS ELB、GCP GCLB),负载均衡器将流量分发到集群中的节点,再由节点转发到相应的 Pod。自动分发流量到后端 Pod。 | 当应用需要对外暴露,并希望自动使用云提供商的负载均衡器时,可以使用 LoadBalancer 类型。适合公有云环境。 |
ExternalName | 将服务映射到 externalName 字段的内容(例如,映射到主机名 api.foo.bar.example)。 该映射将集群的 DNS 服务器配置为返回具有该外部主机名值的 CNAME 记录。 | 将 Kubernetes 外部的服务暴露给集群内的服务。 |
Headless Service | Headless Service 是一种不需要 ClusterIP 的 Service,用于 不进行负载均衡 的场景。通常与 StatefulSet 一起使用,它允许客户端直接与 Pod 通信。与普通的 Service 不同,Headless Service 不会自动创建一个 ClusterIP。 | 需要直接访问 Pod 的场景,如数据库集群或状态有依赖的应用。 |
2 实践:部署和测试Service
2.1 示例:创建Deployment
这里使用Nginx作为应用:
apiVersion: apps/v1
kind: Deployment
metadata:
# 定义Deployment的名字
name: nginx-deployment
labels:
app: nginx
spec:
# 定义副本数
replicas: 3