【博客682】k8s apiserver bookmarks机制以更高效检测变更

news2024/11/23 1:28:50

k8s apiserver bookmarks机制以更高效检测变更

list-watch背景:

List-Watch 是kubernetes中server和client通信的最核心的机制, 比如说api-server监听etcd, kubelet监听api-server, scheduler监听api-server等等,其实其他模块监听api-server相当于监听etcd,因为在k8s的设计中,只有api-server能跟etcd通信,其他模块需要etcd的数据就只好监听api-server了。

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

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

  • 对于list,请求后会返回一个Kind=XXList的资源类型,XXList这种资源类型是按照惯例附带创建的,比如Pod和PodList,如果你写过CRD应该能明白了;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将包含一个当前最新的资源版本号,尽管这个版本号对应的资源类型并不是你监听的那种,但这样是为了客户端能更新最新的资源版本号,而不至于需要发起list请求

bookmarks机制出现背景以及解决了什么问题:

先提List-Watch,简单来讲就是先list当前时间点为止的全量变化,然后watch增量变化。
实现这个逻辑的模块就是go-client中的Reflector。

这一机制很好,减轻了workload,但是有一个场景有问题: 断开重连(watch因为某些原因断开,然后reconnect)

因为有可能在断开期间resource有更新,但是没watch到,这样就丢失了event(断开期间),怎么解决这个问题呢,kubernetes给resource添加了resourceversion,这样当reconnect的时候,client只要发送断开前的resourceversion, server就会把这个resourceversion之后的所有event发给client,这样就避免了丢失event。

但是还有一个问题,etcd保存历史变更时间太短,默认etcd3仅仅保存5分钟的变更。 另外resourceversion是一类资源共用一个自增长的数列,举例来讲:所有的pod都使用同一个自增数列,而List-Watch机制是带filter的,比如说某一个kubelet就只关心位于自己node上的pod,所以在该kubelet看来,resourceversion只是增长的,但是并不连续, 比如改kubelet看到的resourceversion是(1,3,8, 23, 44), 没有的resourceversion因为该pod并不在该kubelet所在的node上,所以该kubelet并不关心。

想象一个场景,某kubelet的watch connection断开了,reconnect的时候上次断开前的resourceversion是5,但是此时api-server保存的历史变更已经是resourceversion = 10了, 并不是说这个reconnct花了超过5分钟,而是resourceversion = 5之后的几个版本该kubelet并不关心,比如:由于pod调度到别的node,kubelet不关心别的node上的pod,所以没有更新version,一直保持resourceversion=5,一旦reconnect只能拿着5来找server(这段要好好理解), server也没办法啊,只要返回一个错:too old version error,然后client(kubelet)看到这个错只好清空自己之前的积累(cache),重新List,如果累计了太多的历史变更,这得花较长的时间。

bookmark其实就是server到client的一个通知机制,不管你关心不关心(由于filter),一旦发生变更我通知你,但是因为你不关心,所以我仅仅通知你变更的resourceversion,至于变更是什么内容,不告诉你,这样client就有了最新的resourceversion,下次断掉重连可以拿着新的resourceversion来发起watch,这样就大大减少了需要发起List的几率。

k8s apiserver高效检测变更

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

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

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

相关文章

Paragon NTFS2023最新版Mac读写NTFS磁盘工具

Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具,可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区,因为在Mac OS X 系统上,默认状态下我们只能读取NTFS 分区&a…

152. 乘积最大子数组

152. 乘积最大子数组 原题链接:完成情况:解题思路:参考代码: 原题链接: 152. 乘积最大子数组 https://leetcode.cn/problems/maximum-product-subarray/ 完成情况: 解题思路: 看好题目&…

Nginx 301重定向分析

参考; 404 - 墨天轮 深度硬核文:Nginx的301重定向处理过程分析 - 知乎 Nginx的301状态码处理逻辑设计 HTTP协议中3xx开头的状态响应码都是表示重定向的响应。根据RFC的定义: 301 Moved Permanently 302 Found 303 See Other 307 Temporary Redirect 301是永…

STL——String类(2)成员函数详解

目录 前言 一.String的成员函数: 1.基本成员函数 代码实验: 实验结果: 类对象每次扩容后的capacity数据展示: 1.2. resize():调整字符串大小 1.3reserve():请求更改该对象的容量capacity值 代码实验…

分组密码模式的填充

分组加密 在密码学中,分组加密(Block cipher),又称分块加密或块密码,是一种对称密钥算法。 它将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。 常见的分组加密算法有: DES、3DES、AES、IDEA。 …

Ubuntu虚拟机部署配置

目录 虚拟机镜像下载 VirtualBox7下载 VirtualBox7安装镜像流程 创建虚拟机 虚拟机挂单独硬盘 网络设置 检查虚拟机配置 启动虚拟机 ubuntu配置 查询虚拟机IP地址 修改ROOT密码 更新apt NTP同步 挂载磁盘&关闭swap 虚拟机镜像下载 目前国内操作系统镜像源非常…

2023-07-19力扣今日二题

链接: 2737. 找到最近的标记节点 题意: 给一个n节点有向图,求节点s和点集marked中的最短距离,没有可以的到达的点则返回-1 解: 摇了一题困难过了2/3,搞不定了 没有负权边的单源最短距离,迪…

代码-【2 单链表A、B交集存放到C】

1)基本思想: A、B两个链表的元素均递增有序,所以可以按顺序,同时从A中和B中各取一个结点的值来对比;如果A中结点的值比较小,则A中的指针右移;如果B中的结点的值比较小,则B中的指针右…

优思学院|工程师学习六西格玛有什么用?

很久以前,世上没有当今盛行的各种简单易用的统计软件,那时复杂的统计分析只能依靠公司的统计顾问。而和他们在一起工作时,工程师必须知道怎样进行提问。 如果工程师缺乏对统计工具的认识,即使拿到正确的工具也于事无补。当顾问遇…

2. Makefile之目标、依赖(附示例)

一、本节概要 本专栏所有内容围绕Makefile官方文档进行刨析,给出详细具体示例做辅助理解手撕Makefile官方手册 二、Makefile中的目标和依赖 在一个简单的Makefile中,每条规则通常由以下几个部分组成: target ... : prerequisites ...rec…

修改虚拟机ip为静态ip

在使用虚拟机的时候,默认情况下使用的DHCP协议分配的动态IP地址,使得每次打开虚拟机后当前的IP地址都可能会发生变化,这样不方便管理。为了能够给当前虚拟机设置一个静态IP地址,方便后期使用XShell等连接工具进行连接,…

C/C++内存分布

C/C内存管理 1.C/C内存分布2.C语言中动态内存管理方法2.1 malloc/calloc/realloc/free 3.C内容管理方法3.1new/delete操作内置类型3.2 new和delete操作自定义类型 4.operator new与operator delete函数5.new和delete的实现原理5.1内置类型5.2自定义类型 6定位new表达式&#xf…

Libtorch 在x86_64的Linux 上部署时的版本问题

1. ubuntu 上安装了cuda12.1 和cuda 12.2 ,但是NVCC 指向的是10.1,但是10.1 又没有安装, 所以版本很混乱 ./usr/bin/nvcc -> 10.1./usr/lib/nvidia-cuda-toolkit/bin/nvcc-> 10.1./usr/local/cuda-12.1/bin/nvcc -> 12.1./usr/local/cuda-12.2…

RT-Thread快速入门-线程管理

在 RT-Thread 中,最基本的调度单位是线程,其他 RTOS 也叫任务。如果学习过或者了解过 RTOS,任务这种叫法是最为熟知的。 本篇文章来学习一下 RT-Thread 线程方面的内容。对于初学者来说,转换一下思维,建立多任务&…

Docker部署Redis集群详解【主从复制 + 哨兵模式】

前言 注意:该文章不会讲解Redis集群搭建的原理,只讲述如何通过Docker容器快速部署搭建Redis主从 哨兵模式的集群 准备工作: 一台云服务器 or 本地虚拟机(CentOS和Ubuntu都可以)安装好Docker环境(Docker、…

ROS框架——发布者功能包和订阅者功能包进行bool类型数据结构的topic通讯

ROS框架——发布者功能包和订阅者功能包进行bool类型数据结构的topic通讯 code review! 文章目录 ROS框架——发布者功能包和订阅者功能包进行bool类型数据结构的topic通讯零.同时运行两个功能包一.发布者功能包1.1.文件结构1.2.bool\_publisher\_node.cpp1.3.CMakeLists.txt…

SpringBoot实战(二十一)集成 TLog 日志

目录 一、简介二、Maven依赖三、启动类集成四、测试1.服务简介2.服务A代码DemoController.javaDemoFeignClient.java 3.服务B代码4.测试结果 补充一:自定义日志标签模板补充二:SpanId的生成规则补充三:业务标签1.打印入参2.指定连接符3.打印常…

【深度学习-卷积神经网络CNN-基础】

文章目录 发展历史卷积神经网络的应用领域卷积的原理和作用卷积和传统的神经网络的区别 卷积网络的整体架构输入层卷积层池化层全连接层卷积和池化叠加多层卷积可以处理什么类型的数据卷积的超参数卷积最大的优势 卷积的细节卷积的原理卷积的参数卷积的次数步长 卷积核尺寸 边缘…

成为UI设计高手:如何规划和创建UI设计组件库!

今天给大家分享一篇关于组件化设计的总结,希望可以带给大家更多设计思考。 什么是组件化 组件化化是构成界面的最基础元素和重复出现控件的集合体,也就是常说的组件库。通过对基础元素和控件的规范命名与排列组合,最终形成一个可快速调用与便…

每日一题——地下迷宫(迷宫问题II)

迷宫问题(地下迷宫)——II 题目链接 前言: 这题是在昨天迷宫问题——I的基础上进行的变形,因此,如果昨天的题目没看或者对迷宫问题不怎么了解,建议先看看昨天的解析。 迷宫问题——I源代码: …