【博客542】k8s使用EndpointSlices扩展大规模service后端服务数量

news2025/7/20 13:00:22

k8s使用EndpointSlices扩展大规模service后端服务数量

EndpointSlices

端点切片(EndpointSlices) 提供了一种简单的方法来跟踪 Kubernetes 集群中的网络端点(network endpoints)。 它们为 Endpoints 提供了一种可扩缩和可拓展的替代方案。

出现背景:Endpoint API在大规模service后端的情况下存在较大限制

Endpoint API 可伸缩性限制:

如果使用 Endpoint API,Service 只有一个 Endpoint 资源。这意味着它需要为 Service 的每个 Pod 都存储好 IP 地址和端口(网络端点),这需要大量的 API 资源。另外,kube-proxy 会在每个节点上运行,并监控 Endpoint 资源的任何更新。如果 Endpoint 资源中有一个端口发生更改,那么整个对象都会分发到 kube-proxy 的每个实例。

Endpoint API 另一个局限:

它会限制跟踪 Service 的网络端点数量。一般存储在 etcd 中的对象默认大小限制为 1.5MB。在某些情况下,它会将 Endpoint 资源限制为 5000 个 Pod IP。对于大多数用户而言,这没什么关系,但是对于接近这个大小的 Service 而言,就有大问题了。

举例:

如果一个 Service 有 5000 个 Pod,它如果有 1.5MB 的 Endpoint 资源。当该列表中的某个网络端点发生了变化,那么就要将完整的 Endpoint 资源分发给集群中的每个节点。在具有 3000 个节点的大型集群中,这会是个很大的问题。每次更新将跨集群发送 4.5GB 的数据(1.5MB3000,即 Endpoint 大小 节点个数),并且每次端点更新都要发送这么多数据。想象一下,如果进行一次滚动更新,共有 5000 个 Pod 全部被替换,那么传输的数据量将超过 22 TB。

EndpointSlice API 拆分 Endpoint

ndpointSlice API 旨在通过类似于分片的方法来解决该问题。我们不跟踪 Service Pod IP 的单个 Endpoint 资源,而是将它们拆分为多个较小的 EndpointSlice。

举个例子,现在有 15 个 Pod 在支持一个 Service,那么就有跟踪这些的一个 Endpoint 资源。如果将 EndpointSlice 配置为每个 EndpointSlice 存储 5 个端点,就得到了 3 个不同的 EndpointSlice:在这里插入图片描述默认情况下,EndpointSlice 每个存储能多达 100 个端点,我们可以使用 kube-controller-manager 的 --max-endpoints-per-slice 标签进行配置。

EndpointSlice优势

EndpointSlice API 大大提高了网络的可伸缩性:

因为现在添加或删除 Pod 时,只需更新 1 个小的 EndpointSlice。尤其是成百上千个 Pod 支持单个 Service 时,差异将非常明显。更重要的是,既然 Service 的所有 Pod IP 都不需要存储在单个资源中,那么我们就不必担心 etcd 中存储对象的大小限制。EndpointSlice 可以用于扩展到超过 10 万个网络端点的 Service。

EndpointSlice 相关新功能

  • Dual-stack Service:是一项与 EndpointSlice 一起开发的新功能。它们利用 IPv4 和 IPv6 地址提供 Service,并依靠 EndpointSlice 上的 addressType 字段按 IP 系列跟踪这些地址。
  • Topology aware routing: 会更新 kube-proxy 以 prefer 同一区域或区域内的路由请求。这使用了为 EndpointSlice 端点存储的拓扑字段。另外,目前还在探索 endpoint subsetting 的潜力,未来 kube-proxy 将只允许观察 EndpointSlice 的子集。这可以与 topology aware routing 结合使用,这样 kube-proxy 只需要监控包含同一区域内端点的 EndpointSlice,这将提供另一个非常显着的可伸缩性改进。

属主关系

在大多数场合下,EndpointSlice 都由某个 Service 所有, (因为)该端点切片正是为该服务跟踪记录其端点。这一属主关系是通过为每个 EndpointSlice 设置一个属主(owner)引用,同时设置 kubernetes.io/service-name 标签来标明的, 目的是方便查找隶属于某 Service 的所有 EndpointSlice。

不同控制器对端点切片的管理

控制面(尤其是端点切片的控制器) 会创建和管理 EndpointSlice 对象。EndpointSlice 对象还有一些其他使用场景, 例如作为服务网格(Service Mesh)的实现。这些场景都会导致有其他实体 或者控制器负责管理额外的 EndpointSlice 集合。

为了确保多个实体可以管理 EndpointSlice 而且不会相互产生干扰,Kubernetes 定义了标签 endpointslice.kubernetes.io/managed-by,用来标明哪个实体在管理某个 EndpointSlice。端点切片控制器会在自己所管理的所有 EndpointSlice 上将该标签值设置 为 endpointslice-controller.k8s.io。 管理 EndpointSlice 的其他实体也应该为此标签设置一个唯一值。

拓扑信息

EndpointSlice 中的每个端点都可以包含一定的拓扑信息。 拓扑信息包括端点的位置,对应节点、可用区的信息。 这些信息体现为 EndpointSlices 的如下端点字段:

nodeName - 端点所在的 Node 名称;
zone - 端点所处的可用区。

这些拓扑信息可以成为流量转发时的优先匹配依据,也成为了kube-proxy组件生成流量转发拓扑的iptables的依据

端点切片中的每个端点信息

我们知道 Endpoint 通常情况下是由 Service 资源自动创建和管理的,但是随着 Kubernetes 集群的规模越来越大和管理的服务越来越多,Endpoint API 的局限性变得越来越明显。 端点切片(EndpointSlices)提供了一种简单的方法来跟踪 Kubernetes 集群中的网络端点。它们为 Endpoint 提供了一种可伸缩和可拓展的替代方案,同时还可以被用到拓扑感知路由中。

EndpointSlices 示例如下:

apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: example-hints
  labels:
    kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
  - name: http
    protocol: TCP
    port: 80
endpoints:
  - addresses:
      - "10.127.2.3"
    conditions:
      ready: true
    hostname: pod-1
    nodename: node-a
    zone: zone-a

EndpointSlice 中的每个端点都可以包含一定的拓扑信息。 拓扑信息包括端点的位置,对应节点、可用区的信息。 这些信息体现为 EndpointSlices 的如下端点字段:

nodeName - 端点所在的 Node 名称
zone - 端点所处的可用区
hostname - 端点的 pod 名称

拓扑感知

启用 kube-apiserver、kube-controller-manager、和 kube-proxy 的特性门控 TopologyAwareHints。通过把 Service 中的注解 service.kubernetes.io/topology-aware-hints 的值设置为 auto, 来激活服务的拓扑感知提示功能。 这告诉 EndpointSlice 控制器在它认为安全的时候来设置拓扑提示。kube-proxy 组件依据 EndpointSlice 控制器设置的提示,过滤由它负责路由的端点。

由 EndpointSlice 控制器提供提示信息后 EndpointSlice 的示例如下:

apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
  name: example-hints
  labels:
    kubernetes.io/service-name: example-svc
addressType: IPv4
ports:
  - name: http
    protocol: TCP
    port: 80
endpoints:
  - addresses:
      - "10.1.2.3"
    conditions:
      ready: true
    hostname: pod-1
    zone: zone-a
    hints:
      forZones:
        - name: "zone-a"

我们看到其中已注入了 hints 信息,对于上面这个示例,zone-a 的客户端访问会优先路由到该端点上。

示例:为nginx service生成endpointslice,包含三个后端pod,带有hostname的topo键

addressType: IPv4
apiVersion: discovery.k8s.io/v1beta1
endpoints:
- addresses:
  - 10.244.1.45
  conditions:
    ready: true
  targetRef:
    kind: Pod
    name: nginx-deployment-pdhhz
    namespace: default
  topology:
    kubernetes.io/hostname: 10.1.2.20
- addresses:
  - 10.244.2.51
  conditions:
    ready: true
  targetRef:
    kind: Pod
    name: nginx-deployment-j5wfx
    namespace: default
    resourceVersion: "15352701"
    uid: 67b97b7a-7829-420b-b5e3-2182c2ebd785
  topology:
    kubernetes.io/hostname: 10.1.2.21
- addresses:
  - 10.244.5.70
  conditions:
    ready: true
  targetRef:
    kind: Pod
    name: nginx-deployment-x2fgf
    namespace: default
    resourceVersion: "15352705"
    uid: 7332ace0-c080-4570-8f8e-c8e114aad287
  topology:
    kubernetes.io/hostname: 10.1.2.22
kind: EndpointSlice
metadata:
  labels:
    app: nginx
    endpointslice.kubernetes.io/managed-by: endpointslice-controller.k8s.io
    kubernetes.io/service-name: nginx
  name: nginx-ncf2b
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Service
    name: nginx
ports:
- name: ""
  port: 80
  protocol: TCP

默认情况下,控制面创建和管理的 EndpointSlice 将包含不超过 100 个端点。 你可以使用 kube-controller-manager 的 --max-endpoints-per-slice 标志设置此值,最大值为 1000。
当涉及如何路由内部流量时,EndpointSlice 可以充当 kube-proxy 的决策依据。

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

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

相关文章

长时间序列模型DLinear(代码解析)

前言 今年时间序列SOTA,DLinear模型,论文下载链接,也可以看我写的论文解析当然最好是读原文。Dlinear,NLinear模型Github项目地址,下载项目文件这里提供我写过注释的项目文件,下载地址 参数设定模块(run_…

图神经网络之预训练大模型结合:ERNIESage在链接预测任务应用

1.ERNIESage运行实例介绍(1.8x版本) 本项目原链接:https://aistudio.baidu.com/aistudio/projectdetail/5097085?contributionType1 本项目主要是为了直接提供一个可以运行ERNIESage模型的环境, https://github.com/PaddlePaddle/PGL/blob/develop/e…

笔记redis

redis特点: 1.这些数据类型都支持 push/pop. add/remove 及取交集并集和差集及更丰富的操作 2.Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中进行持久化 3.单线路IO多路复用 4.redis操作是原子性操作 redis 单线程模型: Redis 内…

chrome插件开发(manifest_version版本V3 + Ant Design Vue)

1.什么是 Chrome 插件 谷歌浏览器插件是一种小型的定制浏览器体验的程序,通过插件可以自定义浏览器的一些行为来适合个人的需求,例如上面的查看服务器状态插件。 在应用商店中下载下来的插件基本上都是以.crx 为文件后缀,该文件其实就是一个…

Word2Vec

Word2Vec 在自然语言发展的早期阶段,词的表示经历了不断地发展和改进,直到后来有一种word vector的思想被提出以及后续的实现,才极大地促进了NLP的发展。 word vector的核心思想: 为每个单词构建一个密集向量,选择后…

傻白入门芯片设计,先进封装技术(五)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作,封装对芯片来说是必不可少的,随着IC生产技术的进步,封装技术也不断更新换代,每一代IC都与新一代的IC封装技术紧密相连。 一、什么是封装&#xf…

什么蓝牙耳机颜值高音质好?颜值高音质好的蓝牙耳机推荐

朋友让我推荐蓝牙耳机的时候,总是喜欢问哪款蓝牙耳机的性能更强,想要直接入手那款性能更强的蓝牙耳机,以此节省对比的时间。但是用户自行进行对比的步骤,显然是不能省的,所以今天我给四款蓝牙耳机做了横向对比&#xf…

C语言tips-NULL指针和void指针

0.写在最前 最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路 1. void指针 1.1 解释 void 用在函数定义中可以表…

身份安全风险分析

摘要 从勒索软件到 APT,身份风险是重要的攻击向量。 管理 Active Directory 的复杂性,导致所有组织都存在1/6的可利用的特权身份风险。 这些身份风险包括使用过时密码的本地管理员、具有不必要权限的错误配置用户、在终端上暴露的缓存凭据等。 当攻击者…

让学前端不再害怕英语单词(四)

|| 欢迎关注csdn前端领域博主: 前端小王hs || email: 337674757qq.com || 前端交流群: 598778642前三章直通车↓↓↓ 让学前端不再害怕英语单词(一) 让学前端不再害怕英语单词(二) 让学前端不再害怕英语单词&#xff0…

单目标应用:最有价值球员算法(Most Valuable Player Algorithm,MVPA)求解旅行商问题TSP

一、最有价值球员算法 最有价值球员算法(Most Valuable Player Algorithm,MVPA)由Bouchekara 等人于2017年提出,该算法受到体育比赛的启发,球员们为了赢得冠军而组成队伍进行队伍竞争,他们也为了赢得最有价…

使用VMware安装系统Window、Linux操作系统

使用VMware安装系统Window、Linux操作系统 下载镜像文件打开VMware 下载镜像文件地址或链接: Windows全家桶镜像文件下载网站:msdn.itellyou.cnWindows 10 种子文件 ed2k://|file|cn_windows_10_business_editions_version_1803_updated_aug_2019_x64_dv…

Js逆向教程-14反调试

Js逆向教程-14反调试 一、检测是否在调试 键盘监听(F12)检测浏览器的高度插值检测开发者人员工具变量是否为true利用console.log调用次数利用代码运行的时间差利用toString检测非浏览器 二、显性 2.1 debugger: function xx() {debugger;…

盘点re:Invent历年重磅创新:今年亚马逊云科技又将有哪些重磅发布?

“云计算春晚”re:Invent即将开幕,这一次亚马逊云科技会带来哪些重磅发布? 一年一度的亚马逊云科技re:Invent大会即将在下周开幕。作为云计算行业的顶级盛事,亚马逊云科技re:Invent大会看出云计算领域创新的风向标,也…

QQ小程序——无法正常创建项目与uniapp联动问题

目录 一、使用QQ小程序开发者工具无法创建项目 情境引入 检查原因 解决方法 总结: 二、QQ小程序开发者工具无法与uniapp联动 情境导入 问题排错 解决方法 三、QQ小程序开发者工具无法正常上传 情境导入 错误分析 解决方法 心得分享 分清工作和学习的区别…

运动耳机什么牌子的好,推荐几款排行靠前的耳机

骨传导耳机近些年在耳机界迅速燃起,其设计原理是由贝多芬含棍棒发声所启发,而佩戴骨传导耳机主要是为了防止细菌在耳道内的滋生,除此之外骨传导耳机的佩戴方式也是直接将耳机套在头骨处即可完成佩戴,不用进入耳道,能够…

【torch-sparse及pytorch-geometric 安装】

torch-sparse及pytorch-geometric 安装 pip安装完pytorch-geometric之后,报错No module named torch_sparse 然后安装pip安装torch-sparse,结果报错,百度一下怎么安装,无果,转战官方文档,成功! …

实验讲解-线程池停止执行任务 Executor.execute shutdown awaitTermination shutdownNow()

1 Executor.execute public interface Executor { 在将来的某个时间执行给定的可运行的任务。该可运行的任务可以在新线程、池线程或调用线程中执行,由Executor实现决定。 参数: command–可运行的任务 投掷: RejectedExecutionException–…

Kafka生产者之分区

一、分区好处 (1)便于合理使用存储资源,每个Partition在一个Broker上存储,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果; (2&…

【畅购商城】购物车模块之查看购物车

目录 分析 接口 后端实现 前端实现:显示页面 前端实现:显示购物车信息 分析 用户如果没有登录,购物车存放在浏览器端的localStorage处,且以数组的方式进行存储。用户如果登录了,购物车存放在redis中&#xff0c…