一文读懂Service以及实践攻略

一文读懂Service以及实践攻略

目录

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 流量转发过程

  1. 当客户端(如其他 Pod)访问一个 Service 的 ClusterIP 地址时,流量会先到达 Kubernetes 的 kube-proxy
  2. kube-proxy 根据该 Service 的配置,将流量通过负载均衡的方式转发到后端的 Pod 上。( 默认采用 轮询 负载均衡策略,即每个请求被依次发送到不同的 Pod。)
  3. 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
  
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StevenZeng学堂

🎉 每笔打赏都是我分享的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值