k8s-List机制及resourceVersion语义

news2024/10/7 18:26:56

kube-apiserver 核心职责

提供Restful API;代理集群组件,如dashboard、流式日志、kubectl exec 会话;缓存全量的etcd 数据且无状态服务可水平扩展。

kube-List操作

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

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

2、apiserver 本地缓存还没建好

请求举例

1、LIST apis/cilium.io/v2/ciliumendpoints?limit=500&resourceVersion = 0

resourceVersion=0 表示会从apiserver缓存中获取数据resourceVersion=""表示从etcd获取数据,但因为apiserver的cache不支持limit/continue,etcd是 KV 存储,虽没有按 label/field 过滤功能但能处理 limit/continue,所以 resourceVersion=0 会导致 limit=500被忽略,导致客户端拿到的是全量 ciliumendpoints 数据。

2、LIST api/v1/pods?filedSelector=spec.nodeName%3Dnode1

%3D 是 = 的转义,这个请求是根据 nodename 做过滤,获取 node1 上的所有 pods,感觉数据量不太大,但其实背后要比看上去复杂:

(1)没有指定 resourceVersion=0会导致 apiserver 跳过缓存,直接去 etcd 读数据;

(2)etcd 只是 KV 存储,没有按 label/field 过滤功能(只处理 limit/continue),因此apiserver 是从 etcd 拉全量数据,然后在内存做过滤,再返回给客户端,开销是很大的。

3、LIST api/v1/pods?filedSelector=spec.nodeName%3Dnode1&resourceVersion = 0

resourceVersion=0表示 apiserver 会从缓存读数据,性能会有量级的提升,但是apiserver需要在内存做过滤再返回给客户端, apiserver 需要处理的数据量可能会非常大。

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

//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、resourceVersionMatch=exact(即同时resourceVersion=非零值)、有limit/continue都会直接从etcd读数据。

部署和调优建议

1、Get/List 请求设置 ResourceVersion=0, client-go 的 ListWatch/Informer 接口默认已经设置了 ResourceVersion=0

2、优先使用 namespaced API;

3、Restart backoff,对于kubelet、cilium-agent、daemonsets等需要通过有效的 restart backoff 降低大面积重启时对kube-apiserver的压力;

4、频繁的list操作尤其是带筛选条件的list建议使用informer的 ListWatch 机制,将数据拉到本地,业务逻辑根据需要自己从 local cache 过滤。如果只是一次性的 list操作,并且有筛选条件, 那显然应该通过设置 label 或字段过滤器,让 apiserver 帮我们把数据过滤出来。同时不要忘记在请求中同时带上 resourceVersion=0。

resourceVersion的语义

1、对于Get resourceVersion的语义

任何版本指的是最新可用资源版本优先,但不要求强一致性。

2、对于List resourceVersion的语义

从 v1.19 版本开始,apiserver支持list在resourceVersion=<非零值>的同时携带 resourceVersionMatch参数,来确定如何解析 resourceVersion。

 

resourceVersionMatch=Exact,表示精确匹配resourceVersion,如果resourceVersion找不到则返回 HTTP 410 (Gone)的响应。

resourceVersionMatch=NotOlderThan,不表示老于指定版本的resourceVersion,最新可用资源版本优先。

3、对于Watch resourceVersion的语义

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

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

相关文章

MybatisX插件 逆向工程

MybatisX插件 逆向工程 目录MybatisX插件 逆向工程安装插件使用插件安装插件 File->Settings->Plugins 使用插件 点击DataSource->点击“” 点击DataSource->点击MySQL 驱动选择MySQL for 5.1 输入主机IP、端口号、数据库的用户名和密码->点击Test Connec…

浅谈系统架构设计-从架构设计原理、架构设计原则、架构设计方法展开

我们工作中一直强调要做架构设计、系分&#xff0c;最近前端同学在追求前端质量提升的时候&#xff0c;也在进行架构设计、前端系分的推广&#xff0c;那到底什么是架构设计和系分&#xff1f;该怎么做架构设计和系分&#xff1f;本文尝试对架构设计进行全面的介绍和分享&#…

【机器学习】SVM入门-硬间隔模型

本站原创文章&#xff0c;转载请说明来自《老饼讲解-机器学习》ml.bbbdata.com 目录 一. SVM的目标和思想 1.1 SVM硬间隔模型的原始目的 1.2 SVM的直接目标 1.3 什么是支持向量 二. SVM的支持平面的表示方式 2.1 支持面表示方式的初步思路 2.2 初步思路的缺陷与改进 2…

基于Vue+ElementUI+MySQL+Express的学生管理系统(2)

2.搭建Express Web服务器 1.在E:\vue\shiyan9路径下创建score-server的文件夹放置Express Web服务器的相关文件。 图3 初始化package.json的信息 2.用Vscode打开score-server。并创建如图4所示的项目结构图。 以下目录中的文件依次为&#xff1a; 考试信息增删改查的接口。…

【BP回归预测】改进的鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 2184期】

⛄一、鲸鱼算法优化BP神经网络简介 1 鲸鱼优化算法&#xff08;Whale Optimization Algorithm&#xff0c;WOA&#xff09;简介 鲸鱼优化算法(WOA)&#xff0c;该算法模拟了座头鲸的社会行为&#xff0c;并引入了气泡网狩猎策略。 1.1 灵感 鲸鱼被认为是世界上最大的哺乳动物…

DBCO-mPEG,5 kDa,二苯并环辛炔-MPEG, 5 KDA白色结晶状

●外观以及性质&#xff1a; DBCO-mPEG,5 kDa白色结晶状&#xff0c;其的分子量有多种&#xff0c;10kDa&#xff0c;20kDa&#xff0c;30kDa等一系列的。DBCO活化的聚乙二醇化试剂通过无铜“点击化学”反应与叠氮化物反应&#xff0c;形成稳定的三唑&#xff0c;不需要铜催化剂…

evpp mingw64编译过程

evpp是奇虎360的基于libevent的网络通讯库&#xff0c;源代码不错&#xff1a; https://github.com/Qihoo360/evpp/blob/master/readme_cn.md 它提供vs的编译结构&#xff0c;我用的是mingw64cmake&#xff0c;使用gnu12&#xff0c;把修改过程分享给大家。 步骤1. 修改CMake…

软考中级系统集成项目管理工程师自学好不好过?

可以试试&#xff0c;中级系统集成算是比较好考的一科目&#xff0c;每天的通过率都有30%的&#xff01;是软考中通过率比较高的。 至于是否自学&#xff0c;有时间有精力就可以自学&#xff0c;在校生一般学习时间多&#xff0c;可以各个渠道搜集信息资料&#xff0c;可以自学…

高分子PEG点击试剂DBCO-PEG20K-OMe,二苯并环辛炔-PEG20K-甲基

DBCO-PEG20K-OMe​产品描述&#xff1a; DBCO-PEG20K-OMe属于高分子PEG点击试剂&#xff0c;DBCO 试剂是一类点击化学标记试剂&#xff0c;含有非常活泼的 DBCO&#xff08;&#xff08;二苯并环辛炔&#xff09;基团&#xff0c;​DBCO 试剂可以通过无铜点击化学与叠氮化物标…

vscode连接远程服务器进行cmake调试

一、cmake安装 cmake cmake-3.17.4.tar.gz : https://cmake.org/files/v3.17/cmake-3.17.4.tar.gz sudo apt-get install libssl-dev tar xvf cmake-3.17.4.tar.gz cd cmake-3.17.4 ./configure --prefix/usr make -j18 && sudo make install测试 二、配置 准备两…

如何找回删除的文件?数据恢复,看这几个方法

如果您的电脑出现了问题&#xff0c;或者是因为使用不当而删除了一些文件&#xff0c;那么您需要了解一下如何找回删除的文件。想要清理电脑文件数据&#xff0c;很多人会将其直接删除。其实这种做法是不可取的&#xff0c;因为这种做法可能会造成损失。如何找到已经删除的文件…

怎么把开源项目放到自己的github,gitee,gitea上

一、创建仓库&#xff08;大部分可以不填&#xff09; 二、删除.git文件夹 三、执行初始化命令&#xff08;初始出.git文件夹&#xff09; 在本地项目下执行命令 git init 四、与远程仓库建立关系 git remote add origin ssh://gitxx.xx.xx.xx:61022/shengbaitong/inst_ops…

IOC和DI入门案例

IOC案例 创建BookDao接口、BookDaoImpl类和BookService接口、BookServiceImpl类 1.BookDao package dao;public interface BookDao {public void save(); }2.BookDaoImpl类 package dao;public class BookDaoImpl implements BookDao{public void save(){System.out.printl…

Invisible Backdoor Attack with Sample-Specific Triggers 论文笔记

1. 论文信息 论文名称Invisible Backdoor Attack with Sample-Specific Triggers作者Yuezun Li&#xff08;香港大学&#xff09;出版社ICCV 2021pdf在线pdf 本地pdf代码TensorFlow简介提出了 sample-specific 以及 invisible 的 trigger。使用数字水印技术生成看不见的后门 …

MCE | 肿瘤微环境在癌症中的作用

在过去数十年中&#xff0c;通过使用免疫疗法、靶向疗法和联合方案&#xff0c;癌症治疗领域取得了很大的进步。但这些治疗方案中的绝大多数最终都无法治愈患者&#xff0c;甚至对治疗有显著初始反应的肿瘤也经常复发为耐药恶性肿瘤。另一方面&#xff0c;越来越多的证据表明&a…

A-Level经济例题解析及练习Budget Constraint

知识点&#xff1a;Budget Constraint例题 Question: Budget Constraint Hurley’s income: $1200, Prices: PF $4 per fish, PM $1 per mango A. If Hurley spends all his income on fish, how many fish does he buy? B. If Hurley spends all his income on mangos…

Java开发基础_04

六. 集合框架 #mermaid-svg-g9w5yNcJQzio5Xvm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-g9w5yNcJQzio5Xvm .error-icon{fill:#552222;}#mermaid-svg-g9w5yNcJQzio5Xvm .error-text{fill:#552222;stroke:#55222…

【总结】Idea 编译maven项目报错NoSuchMethodError DefaultModelValidator

从网上git clone了一个项目&#xff0c;本地编译compile、打包package都没问题。 但是启动服务&#xff0c;启动不了&#xff0c;且查看Dependency Analyzer 没有任何依赖信息。执行Reimport时&#xff0c;报错如下。 错误信息 org.codehaus.plexus.component.repository.exc…

Git的简单使用

Git的简单使用一、关于版本控制1、文件的版本2、版本控制软件1.本地版本控制系统2.集中化的版本控制系统3.分布式的版本控制系统二、Git的简介1、什么是Git2、SVN的差异比较3、Git的记录快照4、Git中的三个区域5、使用Git的基本流程三、Git的基本操作1、配置Git1. 配置用户信息…

集合~List

List List集合概述和特点 List集合概述 有序集合&#xff08;也称为序列&#xff09;&#xff0c;用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素&#xff0c;并搜索列表中的元素与Set集合不同&#xff0c;列表通常允许重复的元素 List集合特点 …