图文讲解k8s中Service、Selector、EndpointSlice的运行原理 - 详解

news/2025/10/1 12:49:35/文章来源:https://www.cnblogs.com/wzzkaifa/p/19122367

K8s中,Pod对象用来执行某种任务,它们的结果要能被其它应用组Pod访问的话,必须有一个稳定的代理对象,因为Pod个体自身状态是脆弱的。访问者需要连接稳定的代理对象服务,这就是service的用途和意义。

Service的官方定义:

Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。

Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种不熟悉的服务发现机制。


上面的定义对新手来说,还是比较抽象。下面是用比喻法来说明Service定义。

一、k8s中的service如同“包工头”角色

想象一个建筑工地(Kubernetes 集群):

  • Pod = 干活的工人:他们是实际执行任务的个体(运行容器应用)。工人们可能因为各种原因(生病、请假、被调去别的工地)来来去去,他们的姓名(Pod IP)和位置(在哪个节点上)是动态变化的。

  • Service = 包工头:他本身不亲自砌砖、搬水泥,但他有非常重要的作用:

1. 统一接口与负载均衡

  • 包工头:是和外界的唯一联络点。需求方不需要知道具体是张三还是李四在干活,他只需要把任务要求告诉包工头。

  • Service:Service 提供一个稳定的访问端点(VIP 和 DNS 名称),比如 my-app-service前端服务或用户只需要访问这个固定的地址,而不需要关心后端具体是哪个 Pod 在响应。Service 会自动将请求负载均衡到后端健康的 Pod 上。

2. 服务发现

  • 包工头:包工头手里有一份最新的、可用的工人名单。当有工人离开或新工人加入时,他会实时更新这份名单。

  • Service:Service 通过 Label Selector(标签选择器)来识别和管理属于它的 Pod。例如,所有带有 app: my-app 标签的 Pod 都会被这个 Service 管理。当新的 Pod 被创建并带有匹配的标签时,Service 会自动将其加入负载均衡池;当 Pod 被删除时,会自动将其移除。这就是 Kubernetes 的服务发现机制。

3. 屏蔽后端变化

  • 包工头:即使工地上的工人换了一茬又一茬,项目经理也感觉不到,因为他只跟包工头打交道。

  • Service:Pod 是“ ephemeral ”(短暂的)的,它们的 IP 地址会随着重启、调度而改变。但 Service 的 IP 地址(ClusterIP)和 DNS 名称在生命周期内是稳定的。这为微服务架构提供了强大的抽象能力,使得服务间的通信不依赖于易变的后端实例。

4. 定义不同的访问方式(Service Type)

包工头可以根据项目需求,提供不同的对接方式:

  • ClusterIP(默认):像一个内部工头。他只负责在工地内部(集群内部)协调各个施工队(服务)之间的协作。外部无法直接访问他。

  • NodePort:像一个在工地围墙上开了几个固定通道的工头。外部人员可以通过访问任意一个工地大门(任意节点的 IP 地址)和指定的门牌号(端口号)来找到这个工头,进而进入工地。

  • LoadBalancer:像一个配备了专业接待大厅和指路牌的工头。通常由云服务商(如 AWS, GCP)提供,它会自动创建一个外部负载均衡器,并分配一个外部 IP。外部用户直接访问这个 VIP 接待大厅即可。

  • ExternalName:像一个转接电话的工头。当有人来找一个服务时,他实际上是把请求转发到集群外部的另一个地址(例如,一个传统数据库服务)。

“包工头”比喻能够准确地描述了 Service 的核心价值——提供一个稳定的抽象层,来屏蔽后端 Pod 的动态和不稳定性,并智能地分发流量

这正是微服务在动态的云原生环境中能够可靠运行的关键所在。

每当想到 Service 时,脑子里浮现出这个精明能干、手握工人名单、负责派活儿的“包工头”,就完全理解了它的作用!


二、与Service相关的Selector和EndpointSlice用途

一个 Service 指向的一组 Pod 是由标签选择算符定义的。

Selector(选择器) 是 Kubernetes 中用于筛选和关联一组具有相同标签(Labels)的 Pod 或其他 API 对象的机制。
您可以把它理解为一个过滤器或查询条件。Service通过使用选择器,来找到它们需要管理或交互的 Pod。

k8s中的Selector就像媒婆或者红娘一样,专为Service和pod牵线,在“媒婆” 的小笔记本里,偷偷记录了Service的目标条件 (Selector 条件),再去看看哪些Pod 身上(配置里lable值)有这样的标签,如果匹配一致,然后两边就牵手成功。

这里不得不提到EndpointSlice的作用。

在Kubernetes中,Service通过Selector选择一组Pod,然后Service的流量会被负载均衡到这些Pod上。但是,Service并不是直接存储这些Pod的IP地址,而是通过EndpointSlice(在旧版本中是通过Endpoints)来维护这些Pod的地址信息。

关于EndpointSlice的介绍请看2.3章节。

1. Service和Pod 的关联示例

# Pod (通常由 Deployment 管理,这里只显示 Pod 的标签部分)
apiVersion: v1
kind: Pod
metadata:name: my-app-podlabels:app: my-app        # <-- 这个标签tier: backend
spec:containers:- name: my-appimage: my-app:latest
---
# Service
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-app        # <-- 选择所有带有 `app: my-app` 标签的 Podports:- protocol: TCPport: 80targetPort: 8080

定义 Service 的流量目标,这是 Selector 最常用、最直接的用途。Service 通过 selector 字段来指定哪些 Pod 应该作为服务的后端,接收由 Service 负载均衡的流量。

2.Selector 的匹配类型

在定义 Selector 时,主要有两种匹配方式:

1.matchLabels:精确的键值对匹配。这是最常用的方式。

selector:
  matchLabels:
    app: my-app
    environment: production

2.matchExpressions:基于表达式进行更复杂的匹配,支持 In、NotIn、Exists 和 DoesNotExist 等操作符。

selector:matchExpressions:- {key: tier, operator: In, values: [frontend, backend]}- {key: environment, operator: NotIn, values: [dev]}

简单来说,Selector 是 Kubernetes 中实现松耦合、动态关联的核心。

它通过一个简单的“标签-选择器”机制,将不同的组件(如 Service、Deployment、Pod)灵活地连接在一起,而无需硬编码 IP 地址或 Pod 名称。这使得应用部署、扩展和管理变得非常灵活和强大。

3.EndpointSlice用途介绍

EndpointSlice 充当了 Service 和 Pod 之间的动态桥梁。

1. 存储和分发后端端点信息
EndpointSlice 自动维护并存储所有与 Service Selector 匹配的、状态为 Ready 的 Pod 的网络端点(IP:Port)信息。

工作流程如下:

1.用户创建 Service:您在 Service 的 spec.selector 中定义了 app: my-app。

2.EndpointSlice 控制器开始工作:Kubernetes 系统中的一个控制器(endpointslice-controller)会持续监控:

  • 所有 Pod 的变化(创建、删除、就绪状态变更)。
  • 所有 Service 的变化。

3. 动态匹配与更新:

  • 控制器使用 Service 的 Selector 作为查询条件,去筛选集群中的所有 Pod。
  • 它会找到所有标签为 app: my-app 且 status.phase 为 Running 并且所有容器的就绪探针通过的 Pod。
  • 对于每个匹配的 Pod,控制器会创建一个 Endpoint 记录(注意,这里是 EndpointSlice 里的一个条目,不是旧的 Endpoints 对象)。

4.创建 EndpointSlice 对象:这些端点的集合被组织成一个或多个 EndpointSlice 对象。每个 EndpointSlice 包含最多 100 个端点(这是可配置的),以避免单个对象过大。

2. 为 kube-proxy 提供高效的数据源

这是 EndpointSlice 最重要的消费者端。

  • kube-proxy 在每个节点上运行,它负责配置节点上的 iptables、ipvs 或 nftables 规则,以实现 Service 的负载均衡和流量转发。

  • kube-proxy 监听(Watch)EndpointSlice 的 API,而不是旧的 Endpoints。

  • 当 EndpointSlice 发生变化时(例如,一个新的 Pod 被创建并就绪),kube-proxy 会立即收到通知。

  • kube-proxy 根据新的 EndpointSlice 数据,更新本地的负载均衡规则,将新的 Pod IP 加入转发目标,或将不可用的 Pod IP 移除。

换个概念讲,EndpointSlice 就是Pod 的“生死簿”。Pod集合内有新增、死亡都会更新到EndpointSlice那里,然后再给Service和kube-proxy提供分发、路由策略。


三、k8s中创建Service的命令

当每个 Service 创建时,会被分配一个唯一的 IP 地址(也称为 clusterIP)。 这个 IP 地址与 Service 的生命周期绑定在一起,只要 Service 存在,它就不会改变。

假设有一组在一个扁平的、集群范围的地址空间中运行 Nginx 服务的 Pod。

可以使用 kubectl expose 命令为 2 个 Nginx 副本创建一个 Service:

kubectl expose deployment/my-nginx
service/my-nginx exposed

这等价于使用 kubectl create -f 命令及如下的 yaml 文件创建:

apiVersion: v1
kind: Service
metadata:name: my-nginxlabels:run: my-nginx
spec:ports:- port: 80protocol: TCPselector:run: my-nginx

上述命令将创建一个 Service,该 Service 会将所有具有标签 run: my-nginx 的 Pod 的 TCP 80 端口暴露到一个抽象的 Service 端口上(targetPort:容器接收流量的端口;port: 可任意取值的抽象的 Service 端口,其他 Pod 通过该端口访问 Service)。

查看你的 Service 资源:

kubectl get svc my-nginx
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
my-nginx   ClusterIP   10.0.162.149           80/TCP    21s

一个 Service 由一组 Pod 提供支撑。这些 Pod 通过 EndpointSlices 暴露出来。 Service Selector 将持续评估,结果被 POST 到使用标签与该 Service 连接的一个 EndpointSlice。 当 Pod 终止后,它会自动从包含该 Pod 的 EndpointSlices 中移除。 新的能够匹配上 Service Selector 的 Pod 将被自动地为该 Service 添加到 EndpointSlice 中。

kubectl describe svc my-nginx
Name:                my-nginx
Namespace:           default
Labels:              run=my-nginx
Annotations:         
Selector:            run=my-nginx
Type:                ClusterIP
IP Family Policy:    SingleStack
IP Families:         IPv4
IP:                  10.0.162.149
IPs:                 10.0.162.149
Port:                 80/TCP
TargetPort:          80/TCP
Endpoints:           10.244.2.5:80,10.244.3.4:80
Session Affinity:    None
Events:              

你应该能够从集群中任意节点上使用 curl 命令向 <CLUSTER-IP>:<PORT> 发送请求以访问 Nginx Service。 注意 Service IP 完全是虚拟的。。

kubectl get endpointslices -l kubernetes.io/service-name=my-nginx
NAME             ADDRESSTYPE   PORTS   ENDPOINTS               AGE
my-nginx-7vzhx   IPv4          80      10.244.2.5,10.244.3.4   21s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么做义工网站去河南省住房和城乡建设厅网站查

下载ssh https://github.com/PowerShell/Win32-OpenSSH/releases 然后把它放入 C:\Program Files 中 添加环境变量 高级系统设置-》高级-》环境变量-》 是用户变量 不是系统变量 选择 path- 然后点击编辑&#xff0c;然后新建&#xff0c; 把刚才的地址放进去 C:\Program F…

2025西安品牌新房,西安刚需新房,陕西优质新房住宅推荐,地建嘉信臻境,超2000㎡高端会所,满足多元化生活需求

2025西安品质新房推荐:地建嘉信臻境,开启理想人居新篇章 在西安这座充满活力与机遇的城市,寻找一处理想的新房成为许多人的梦想。今天,为大家推荐一个备受瞩目的项目——地建嘉信臻境,它将为您带来前所未有的居住…

公司网站主页设计网络销售怎么做才能做好

思科设备参考&#xff1a;路由引入实验&#xff08;思科&#xff09; 技术简介 路由引入技术在网络通信中起着重要的作用&#xff0c;能够实现不同路由协议之间的路由传递&#xff0c;并在路由引入时部署路由控制&#xff0c;实现路径或策略的控制 实验目的 不同的路由协议之…

2025年未央区高端楼盘,西咸新区品质楼盘,西安高新品牌楼盘住宅口碑推荐,地建嘉信臻境周边配套丰富,教育医疗商业齐全

地建嘉信臻境:沣东文商板块的品质之选 地建嘉信臻境项目由拥有二十余年地产开发经验的团队运营,作为地建嘉信深耕陕西6年、布局6城8盘的第八座作品,以国企担当为依托,致力于革新沣东区域的生活范本。项目位于沣东文…

copyparty.exe 怎么用?局域网文件共享工具安装与运行教程

copyparty.exe 怎么用?局域网文件共享工具安装与运行教程​一、什么是 copyparty?​copyparty​ 是一个开源的小工具,主要用来快速在局域网里共享文件,比如你可以用手机、电脑通过浏览器访问,直接上传或下载文件,…

2025西安高端新房,西安优质新房,西安品牌新房住宅推荐,地建嘉信臻境,沣东文商板块门户,享双地铁便利

2025西安高端新房推荐:地建嘉信臻境引领品质人居新风尚 在西安这座充满魅力与活力的城市中,寻找一处理想的居住之所成为众多购房者的追求。而地建嘉信臻境项目,无疑是众多优质新房中的一颗璀璨明星。地建嘉信臻境项…

2025年西安洋房楼盘,陕西优质楼盘,西咸新区现房楼盘住宅口碑推荐,地建嘉信臻境超2000㎡高端会所,功能多样

2025年西安洋房楼盘——地建嘉信臻境的魅力所在 在西安房地产市场中,地建嘉信臻境项目犹如一颗璀璨的明珠,闪耀着独特的光芒。它由拥有二十余年地产开发经验的团队运营,作为地建嘉信深耕陕西6年、布局6城8盘的第八座…

Python 闭包的应用场景与实战案例

在 Python 中,闭包是一种非常强大的功能,它允许我们创建私有的作用域,并在函数外部访问函数内部的变量。闭包在实际开发中有着广泛的应用,从简单的数据隐藏到复杂的装饰器实现,闭包都能大显身手。今天,就让我们一…

STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南

STM32 智能垃圾桶项目笔记(二):超声波测距功能实现 - 指南2025-10-01 12:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…

做电影网站要几G空间的网站开发商业秘密保密协议

Part 1 制图综述 1.1 制图的目的 随着GIS在各行各业的深入应用&#xff0c;各信息化部门和生产单位都逐渐建立起自己的GIS的应用&#xff0c;同时积累了大量的地理数据。随着应用深度和广度的推进&#xff0c;针对数据建立专题应用越来越迫切&#xff0c;对行业专题制图的需…

通过配置 GitLab 自动触发项目自动化构建与部署 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

双网卡服务器校园网访问故障排查与解决​ - 教程

双网卡服务器校园网访问故障排查与解决​ - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

黄页网站建设建筑公司网站封面图片

1、下载vscode 官网地址:https://code.visualstudio.com/ 针对ubuntu点击下载deb安装包,默认下载地址如下,下载速度很慢,而且会下载失败,解决方法如下: 将“https://az764295.vo.msecnd.net”改为“https://vscode.cdn.azure.cn”后,下载会很快。 例如,将: https:…

怎么实现网站建设报价方案手机免费在线搭建网站

一页有三栏&#xff1a;主栏、副栏、思考栏。主栏主要是在右上角&#xff0c;主要记录学到的内容。副栏在左边&#xff0c;主要是简单概括重点。思考栏在底部&#xff0c;主要是记录收获、感悟。 主栏&#xff1a;在听讲或阅读时把重要的内容或知识的要点记录在右侧的区域&…

详述网站建设的过程简答题二次元网站开发的意义

SPI相关基础知识 SPI基本概念请自行百度&#xff0c;参考&#xff1a;百度百科SPI简介.我们讲重点和要注意的地方。 master模式下要关注的地方 接线一一对应 也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连&#xff0c;不交叉&#xff0…

US$9.99 Cheap Galletto 1260 ECU Chip Tuning Interface EOBD Tuning Tools

Galletto 1260 ECU Chip Tuning Interface With Multi LanguagesTop 4 Reasons to Get Galletto 12601. Supported Languages: English, Spanish, French, German, Italian, Portuguese2. EOBD2 Flasher 1260 is an ea…

万网主机怎么上传网站吗网站建设的简历制作

在我之前的文章 “Elasticsearch&#xff1a;对 Java 对象的 ES|QL 查询”&#xff0c;我详细介绍了如何使用 Java 来对 ES|QL 进行查询。对于不是很熟悉 Elasticsearch 的开发者来说&#xff0c;那篇文章里的例子还是不能单独来进行运行。在今天的这篇文章中&#xff0c;我来详…

房产网站模板程序在线oa

内容摘要 我国推动的工业互联网是更加广义的工业互联网&#xff0c;不仅包括设备的联网。其核心是提升我国工业能力和工业水平&#xff0c;是我国制造业转型升级的重要推手和抓手。我们把工业互联网分为六个层级&#xff0c;包括设备层、网络层、平台层、软件层、应用层和安全…

US$9 TF Card 4GB Flash Memory Card Can Work on Ksuite

TF Card 4GB Flash Memory Card Can Work on KsuitePackage List:1pc x 4GB TF Card Pictures of TF Card 4GB Flash Memory Card Can Work on KsuiteTF Card 4GB Flash Memory Card Can Work on Ksuite, now only nee…

详细介绍:MySQL备份策略核心知识点总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …