【博客681】k8s list机制与resourceVersion语义

news2024/11/26 20:39:06

k8s list机制与resourceVersion语义

K8s 架构:环形层次视图

在这里插入图片描述

对于 K8s 集群,从内到外的几个组件和功能:

  • etcd:持久化 KV 存储,集群资源(pods/services/networkpolicies/…)的唯一的权威数据(状态)源;

  • apiserver:从 etcd 读取(ListWatch)全量数据,并缓存在内存中;无状态服务,可水平扩展;

  • 各种基础服务(e.g. kubelet、-agent、-operator):连接apiserver,获取(List/ListWatch)各自需要的数据;

  • 集群内的 workloads:在 1 和 2 正常的情况下由 3 来创建、管理和 reconcile,例如 kubelet 创建 pod、cilium 配置网络和安全策略。

1、k8s list机制

kube-apiserver LIST 请求处理逻辑:
在这里插入图片描述

k8s在两级 List/ListWatch(但数据是同一份):

  • 1、apiserver List/ListWatch etcd;

  • 2、基础服务 List/ListWatch apiserver;

apiserver 就是挡在 etcd 前面的一个代理(proxy)
在这里插入图片描述

绝大部分情况下,kube-apiserver 都会直接从本地缓存提供服务(因为它缓存了etcd全量数据),某些特殊情况,apiserver 就只能将请求转发给 etcd,例如:

  • 1、客户端明确要求从 etcd 读数据,追求最高的数据准确性,客户端 LIST 参数设置不当也可能会走到这个逻辑;

  • 2、apiserver 本地缓存还没建好

如何判断是否必须从 etcd 读数据:

//https://github.com/kubernetes/kubernetes/blob/v1.24.0/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go#L591
​
func shouldDelegateList(opts storage.ListOptions) bool {
    resourceVersion := opts.ResourceVersion
    pred            := opts.Predicate
    pagingEnabled   := DefaultFeatureGate.Enabled(features.APIListChunking)      // 默认是启用的
    hasContinuation := pagingEnabled && len(pred.Continue) > 0                   // Continue 是个 token
    hasLimit        := pagingEnabled && pred.Limit > 0 && resourceVersion != "0" // 只有在 resourceVersion != "0" 的情况下,hasLimit 才有可能为 true
​
    // 1. 如果未指定 resourceVersion,从底层存储(etcd)拉去数据;
    // 2. 如果有 continuation,也从底层存储拉数据;
    // 3. 只有 resourceVersion != "0" 时,才会将 limit 传给底层存储(etcd),因为 watch cache 不支持 continuation
    return resourceVersion == "" || hasContinuation || hasLimit || opts.ResourceVersionMatch == metav1.ResourceVersionMatchExact
}
  • 客户端未设置 ListOption{} 中的 ResourceVersion 字段,会对应到这里的 resourceVersion == ""从而导致从 etcd 拉全量数据;

  • 客户端设置了 limit=500&resourceVersion=0 不会导致下次 hasContinuation==true,因为resourceVersion=0 将导致 limit 被忽略仍会返回全量数据,因为resourceVersion=0就不会去拉取etcd了

  • 因此,未指定resourceVersion、resourceVersionMatch=exact(即同时resourceVersion=非零值)、有limit/continue都会直接从etcd读数据。

2、resourceVersion语义

参考链接:官方文档

etcd默认保留5分钟以内的变更记录,每个资源发生变更都会更新一个更大的资源版本ResourceVersion,ResourceVersion是一个所有资源类型共享的全局变量。

  • 对于watch请求来说,你可以指定一个resourceVersion=0来获取5分钟以内的任意变更记录及其之后,这种表现很奇怪,所以不建议指定0。可以指定一个resourceVersion来获取这个资源版本之后的变更记录,但这个资源版本早于5分钟以内保留的最小版本,则会回复一个410状态码,如果大于最大版本,则可能会一直等下去,直到超时。

  • 对于list,请求后会返回一个Kind=XXList的资源类型,XXList这种资源类型是按照惯例附带创建的,比如Pod和PodList;其中items字段内包含资源列表,metadata包含的了resourceVersion,但这个resourceVersion是PodList的资源版本,而不是Pod的资源版本,指定resourceVersion=0来获取任意的PodList,也可以指定一个resourceVersion来获取这个资源版本或之后的PodList,如果指定的resourceVersion小于当前最新资源版本,它总是返回最新的PodList,如果大于则返回504状态码。

    但如果你指定了limit参数或resourceVersionMatch=Excat,就意味着apiserver必须精准匹配你填写的resourceVersion,这时候就和watch一样了,如果找不到指定的resourceVersion(可能是超过了5分钟),则会返回410状态码。

  • 变更事件有四种:ADD, DELETE, MODIFY, BOOKMARK。前面三个容易看懂,但第四个BOOKMARK是干什么的?正如前面所说etcd只保留5分钟的变更记录,万一客户端很长时间内都没有watch到变更,然后断连之后又重连到apiserver时,客户端可能按常规的把上次收到的resourceVersion传到url里,但这个resourceVersion已经是一个过期的资源版本,apiserver找不到资源版本,就会回复一个410状态码。那么这时客户端为了能获取最新的资源版本号就不得不先list一次。为了防止这种情况,apiserver会定期发送BOOKMARK事件,BOOKMARK将包含一个当前最新的资源版本号,尽管这个版本号对应的资源类型并不是你监听的那种,但这样是为了客户端能更新最新的资源版本号。

resourceVersion与resourceVersionMatch:

get、list 和 watch 操作支持 resourceVersion 参数。 从 v1.19 版本开始,Kubernetes API 服务器支持 list 请求的 resourceVersionMatch 参数。

API 服务器根据你请求的操作和 resourceVersion 的值对 resourceVersion 参数进行不同的解释。 如果你设置 resourceVersionMatch 那么这也会影响匹配发生的方式。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

实例023 建立字体形状窗体

实例说明 大家都见过不规则形状的窗体吧,那么如何制作一个文字形的窗体呢?文字形窗体一般应用在屏幕提示中,如收款机屏幕等。运行本例,效果如图1.23所示。 技术要点 以前,创建字体形窗体是一个既费时又费人力的过程&…

K8S初级入门系列之七-控制器(Job/CronJob/Daemonset)

一、前言 前一章节我们介绍了RC,RS控制器,其主要针对在线业务Pod部署,比如nginx,这些业务是需要确保7*24持续运行的,还有一类离线业务,比如定时任务,大数据离线计算等,在有任务的才需…

在命令行模式、eclipse console下执行Java程序输入中文的几种情况尝试

介绍 在命令行模式下执行Java程序,如果输入中文,经常会出现和代码中的解码字符集不匹配的情况,导致结果不正确。 在命令行模式下执行Java程序,输入中文,其实是用某种字符集编码成字节流,Java程序读取该字节…

rk3588 双HDMI冲突问题与HDMI不能热插拔问题

问题一:HDMI不能热插拔问题 现象 rk3588在开发时现在发现只能在插入HDMI时上电才能输出信号,而当开机之后,再插入HDMI显示器则无信号。 分析 通过kernel显示,在开机后,插拔HMDI是有log提示的,说明内核能够检测到HDMI的插拔动作。 首先先排查软件问题,尝试重启显示进…

ssm项目配置,不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本。

ssm项目启动报错&#xff1a; 不再支持源选项 5。请使用 6 或更高版本。 不再支持目标选项 1.5。请使用 1.6 或更高版本 1.模块语言级别 2.设置模块目标字节码版本 3.pom文件指定jdk版本 <properties><project.build.soutceEncoding>UTF-8</project.build.sout…

SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter

1. 自动配置流程 导入starter依赖导入autoconfigure寻找类路径下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件启动&#xff0c;加载所有 自动配置类 xxxAutoConfiguration 给容器中配置功能组件组件参数绑定到 属性类中。xxxPrope…

运维高级学习---MySQL主从复制

MySQL内建的复制功能是构建大型&#xff0c;高性能应用程序的基础 通过将MySQL的某一台主机 (master)的数据复制到其他主机(slaves)上&#xff0c;并重新执行一遍来执行复制过程中一台服务器充当主服务器&#xff0c;而其他一个或多个其他服务器充当从服务器 为什么要做主从复…

用eNSP搭建一个最简单的网络系统

要求搭建如下网络系统&#xff1a; 相关知识&#xff1a; 路由器命令界面&#xff1a; 所有的设备进入后均名字为Huawai&#xff1b; < >代表了当下所在的配置模式&#xff1b; 不同模式具有不同的管理权限&#xff0c;可以完成不同的配置要求&#xff1b; 第一级模式 …

Excel 端口操作指南

通过将 EDI 报文可视化为 Excel&#xff0c;企业可以更好地了解和处理数据&#xff0c;提高工作效率&#xff0c;减少错误率。在未实现 EDI 系统和内部业务系统集成之前&#xff0c;Excel 方案则是一项可供选择的临时替代方案。 Excel方案的优点在于&#xff0c;无需对业务系统…

【深度学习笔记】随机梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

Qt图片编辑 - 在直线添加文字

在绘制一条直线时&#xff0c;比如说在直线中间输出文字&#xff0c;如下图所示 本质上不难&#xff0c;定位到位置&#xff0c;然后drawText就可以了 难就难在 文字要跟随线的斜率&#xff0c;例如 还有&#xff0c;文字最好保证在线的“上方” 首先是角度问题 这个角度跟线…

C#WinForm获取当前活动子窗体使用鼠标滚轮事件改变窗体大小

获取当前活动子窗体使用鼠标滚轮事件改变窗体大小&#xff0c;实例在文末&#xff0c;可下载。 这个主要分三个重点 第一步 我们需要让子窗体显示在父窗体中 Form22 new Form2(); Form22.TopLevel false; // 不是顶级窗体 //Form22.Parent this;// 设置父窗体 一定不要…

索引使用——SQL提示、覆盖索引、回表查询

1. SQL提示 use index是给MySQL一个提示&#xff0c;在执行的时候尽量使用该索引&#xff0c;至于MySQL最后会不会接收该建议&#xff0c;则不一定。 ignore index是mysql忽略某个索引。 force index则强制mysql使用该索引。mysql别无选择。 2.覆盖索引 覆盖索引和回表查…

MQ消息介绍

1、同步通讯 立即发出&#xff0c;立即回复。 同步通讯过程中&#xff0c;若有消息失败&#xff0c;一直重试&#xff0c;会造成阻塞&#xff0c;影响其它功能。 优点&#xff1a;时效性高 2、异步通讯 3、什么是MQ 稳定性、可用性、并发性极为重要。 MQ&#xff1a;消息即…

RocketMQ教程-(4)-领域模型-消费者(Consumer)

本文介绍 Apache RocketMQ 中消费者&#xff08;Consumer&#xff09;的定义、模型关系、内部属性、行为约束、版本兼容性及使用建议。 定义​ 消费者是 Apache RocketMQ 中用来接收并处理消息的运行实体。 消费者通常被集成在业务系统中&#xff0c;从 Apache RocketMQ 服务…

钉钉和MySQL接口打通对接实战

钉钉和MySQL接口打通对接实战 对接系统钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台&#xff0c;提供PC版&#xff0c;Web版和手机版&#xff0c;有考勤打卡、签到、审批、日志、公告、钉盘、钉邮等强大功能。 目标系统…

docker基础5——数据存储卷

文章目录 一、基本了解二、存储卷2.1 docker挂载卷2.2 绑定挂载卷2.3 设置容器挂在卷权限 三、数据卷容器四、数据卷容器迁移数据 一、基本了解 为什么会有存储卷&#xff1f; Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像…

【杂谈理解】STM32定时器启动模式

STM32定时器启动方式 前言 事情的起因本来是探究为什么在中断模式下的回调中函数中&#xff0c;我不小心加了延时函数为什么会导致崩溃&#xff0c;很遗憾啊&#xff0c;没看出来&#xff0c;不过需要在中断事件中延时的话&#xff0c;倒是可以用轮询模式下的配置。本文探究HA…

Aurix TC3xx系列MCU ADC采集时间计算方法(四)

文章目录 1 前言2 各阶段时间的计算方法2.1 计算公式2.2 采样阶段2.3 转换阶段2.4 降噪阶段2.5 校准阶段3 采集时间示例>>返回总目录<< 1 前言 在项目开发前期评估阶段,会比较关注ADC的采集时间,我们可以给出一个大概的采样的时间0.5us~1.2us左右,但是对于精确…

Python爬虫-贝壳二手房

前言 本文是该专栏的第3篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某二手房网为例,如下图所示,采集对应城市的二手房源数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly9zei5rZS5jb20vZXJzaG91ZmFuZy8= 目标:…