informer

2023-05-16

 list-watch机制

list-watch有两部分组成,分别是listwatchlist非常好理解,就是调用资源的list API罗列资源,基于HTTP短链接实现;watch则是调用资源的watch API监听资源变更事件,基于HTTP 长链接实现

Watch APIapiserver保持一个长链接,接收资源的状态变更事件并做相应处理。如果仅调用watch API,若某个时间点连接中断,就有可能导致消息丢失,所以需要通过list APIresourceversion(根据版本)解决消息丢失的问题。

watch失败后会自动调用list,list返回全量数据,每次watch失败都会relist。在大规模场景,如果所有client同时发生relist,那server肯定受不了。为了应对这种情况,提供了EtcdResync

List-watch的问题:

watch请求时http streaming方式,当服务端挂了后,客户端是感知不到网络断开,以为服务端没有数据,所以客户端不会主动关闭长连接。

处理:

1.Watch请求需要 带一个超时参数(默认是5-10min之间的随机数),时间一到,断开连接。

2.kube-proxy增加连接超时的参数

 

workqueue机制

client-go中抽象了几种队列,包括通用队列、限速队列、延时队列等

通用队列:防止两个相同类型的item同时处理

增加dirty set,当item正在处理,又来一个同类的item,为了保证不能同时有两个相同的item正在被处理,将后面的item加入dirty,等前面的item执行完,才将后面的item加入queue。

限速队列:防止短时间内处理失败的item再次处理,陷入循环

增加AddAfter方法, 可以允许用户告诉DelayingInterface过多长时间把该item加入队列中

延时队列:

根据元素错误次数逐渐累加等待时间,然后加入到延时队列

 

workqueue 提供的一个保障就是,如果是同一个object,比如同一个 pod,被多次加到 workqueue 里,在 dequeue 时,它只会出现一次。防止会有同一个 object 被多个 worker 同时处理。

普通队列workqueue:

防止 hot loop:它保证了一个 item 被 reenqueued 后,不会马上被处理

限速队列RateLimitingQueue,它相比普通的 workqueue 多了以下的功能:

  • 限流:可以限制一个 item 被 reenqueued 的次数。(维护了一个delaying_queue,并用heap将等待时间最小的item加入到 workqueue去处理)

  • 防止 hot loop:它保证了一个 item 被 reenqueued 后,不会马上被处理,(processing存在正在处理的item)

延时队列RateLimiter:

  • 根据元素错误次数逐渐累加等待时间,然后加入到延时队列


 

informer核心


 

0.kube-apiserver通过etcd自身的watch机制获取变化的资源,并将资源分类存入watchCache中,封装成pod/service Storage

0.1.客户端通过http长连接监听kube-apiserver的pod资源的变化,即从pod storage的缓存中获取kube-apiserver从etcd watch到的数据

1.ListWatch监听apiserver的资源变化,Lister一般用于首次获取某资源(如Pod)的全量信息,而Watcher用于持续获取该资源的增量变化信息
2.reflector使用listerWatcher获取资源,并将其保存在队列DeltaFIFO
3.DeltaFIFO是一个生产者-消费者队列,生产者为Reflector,消费者为Pop()函数,消费的数据一方面存储到Indexer中,另一方面可以通过informer的handler进行处理
4.Local Store是本地缓存,Indexer是含有索引能力的本地缓存,本质是能根据id、名字等key获取对象的map
5.workqueue用于保存DeltaFIFO中增量变化的对象,由worker将当前状态的对象处理成期望状态的对象。

*注:SharedInformer.Run启动了两个chan,s.c.Run为controller的入口,s.c.Run函数中会Pop DeltaFIFO中的元素,并根据DeltaFIFO的元素的类型(Sync/Added/Updated/Deleted)进两类处理,一类会使用indexer.Update,indexer,Add,indexer.Delete对保存的在Store中的数据进行处理;另一类会根据DeltaFIFO的元素的类型将其封装为sharedInformer内部类型updateNotification,addNotification,deleteNotification,传递给s.processor.Listeners.addCh,后续给注册的pl.handler处理。

 

informer工作流程


1.reflector通过ListWatch的list获取资源的全量信息,包括监听对象最新的resourceVersion。将获取的资源信息存入indexer
2.reflector通过ListWatch的watch监听对象resourceVersion之后的所有变化,并将变化存入DeltaFIFO。
3.Informer的controller不断地pop DeltaFIFO的变化,根据变化更新indexer对应的数据,根据变化调用回调函数handler去处理,即将变化的对象放入workqueue
4.controller不断地从workqueue取出对象,通过sync方法将对象从当前状态处理成期望状态。

 

使用informer创建controller

1.与kube-apiserver建立连接client

2.创建sharedInformerFactory对象informer,并关联要监听的资源

3.定义回调函数并关联到informer

4.启动informer,并等待资源信息同步到本地缓存

5.informer监听变更事件,并将事件存入workqueue,

6.controller从workqueue去除object,并通过调用sync方法将对象从当前状态处理成期望状态。

 

    1. Informer 首先会 list/watch apiserver,Informer 所使用的 Reflector 包负责与 apiserver 建立连接,Reflector 使用 ListAndWatch 的方法,会先从 apiserver 中 list 该资源的所有实例,list 会拿到该对象最新的 resourceVersion,然后使用 watch 方法监听该 resourceVersion 之后的所有变化,若中途出现异常,reflector 则会从断开的 resourceVersion 处重现尝试监听所有变化,一旦该对象的实例有创建、删除、更新动作,Reflector 都会收到"事件通知",这时,该事件及它对应的 API 对象这个组合,被称为增量(Delta),它会被放进 DeltaFIFO 中。
    1. Informer 会不断地从这个 DeltaFIFO 中读取增量,每拿出一个对象,Informer 就会判断这个增量的时间类型,然后创建或更新本地的缓存,也就是 store。
    1. 如果事件类型是 Added(添加对象),那么 Informer 会通过 Indexer 的库把这个增量里的 API 对象保存到本地的缓存中,并为它创建索引,若为删除操作,则在本地缓存中删除该对象。
    1. DeltaFIFO 再 pop 这个事件到 controller 中,controller 会调用事先注册的 ResourceEventHandler 回调函数进行处理。
    1. 在 ResourceEventHandler 回调函数中,其实只是做了一些很简单的过滤,然后将关心变更的 Object 放到 workqueue 里面。
    1. Controller 从 workqueue 里面取出 Object,启动一个 worker 来执行自己的业务逻辑,业务逻辑通常是计算目前集群的状态和用户希望达到的状态有多大的区别,然后孜孜不倦地让 apiserver 将状态演化到用户希望达到的状态,比如为 deployment 创建新的 pods,或者是扩容/缩容 deployment。
    1. 在worker中就可以使用 lister 来获取 resource,而不用频繁的访问 apiserver,因为 apiserver 中 resource 的变更都会反映到本地的 cache 中。

Informer 在使用时需要先初始化一个 InformerFactory,目前主要推荐使用的是 SharedInformerFactory,Shared 指的是在多个 Informer 中共享一个本地 cache,即共同使用一个SharedIndexer。

建议使用 RateLimitingQueue,它相比普通的 workqueue 多了以下的功能:

  • 限流:可以限制一个 item 被 reenqueued 的次数。
  • 防止 hot loop:它保证了一个 item 被 reenqueued 后,不会马上被处理。


 

参考:https://www.jianshu.com/p/1e2e686fe363

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

informer 的相关文章

随机推荐

  • 【问题解决】python报错 IndexError: list index out of range

    问题 list 遍历时报错 xff1a IndexError list index out of range 分析 可能是 xff1a list 下标 index 超出范围list 为空 解决 try span class token pu
  • 机械+固态双硬盘时机械硬盘卡顿问题解决

    机械 43 固态双硬盘时机械硬盘卡顿问题解决 参考文章 xff1a xff08 1 xff09 机械 43 固态双硬盘时机械硬盘卡顿问题解决 xff08 2 xff09 https www cnblogs com xia weiwen p
  • IDM下载百度资源出现403的解决方法

    IDM下载百度资源出现403的解决方法 参考文章 xff1a xff08 1 xff09 IDM下载百度资源出现403的解决方法 xff08 2 xff09 https www cnblogs com aucy p 9567375 html
  • _tcsrchr 的用法

    tcsrchr 查找字符串中某个字符最后一次出现的位置 两个参数 第一个参数 xff1a 字符串 第二个参数 xff1a 查找的字符 返回值 xff1a 指向最后一次在字符串中出现的该字符的指针 xff0c 如果要查找的字符再串中没有出现
  • 航模无人机中PWM信号频率浅谈

    航模中执行机构 xff1a 动力电调 xff0c 舵机等基本都是通过PWM信号来驱动的 xff0c 但不同的电机或电调输入的信号频率和占空比又是不一样的 xff0c 这个是由什么决定的呢 xff1f 今天就以我的理解来简单讲一讲 最早的航模
  • 公网IP TCP服务器调试

    在MCU上调试4G等模块时 xff0c 为了验证和平台TCP通信是否顺畅 xff0c 很多时候需要一个公网的IP环境能够直接和4G模块通信 xff0c 一些网络调试工具只能提供局域网内的TCP Server 博主找到一个好的网站提供这个功能
  • windows环境下安装opendr

    pip install opendr会报下面的错误 应该先安装glfw glfw是opengl的一个框架 xff0c pip install glfw 即可安装 下载 https github com polmorenoc opendr 后
  • DockerFile创建及案例

    DockerFile dockerfile是用来构建docker镜像的文件 xff0c 命令脚本参数脚本 xff01 构建步骤 编写一个dockerfile文件docker build 构建成为一个对象docker run 运行镜像dock
  • 结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程 一 xff0c 实验目标 以fork和execve系统调用为例分析中断上下文的切换分析execve系统调用中断上下文的特殊之处分析fork子进程启动执行时进程上下文的特殊之
  • SPI、UART、RS232、RS485、IIC 5种嵌入式经典通信总线协议

    文章目录 一 UART1 通信基础 并行和串行并行通信串行通信 2 通信基础 单工和双工3 通信基础 比特率4 通讯基础 异步和同步5 UART硬件连接6 UART控制器串口控制器工作原理介绍 xff1a FIFO模式及其作用 7 IO操作
  • 基于Modbus协议的C#串口工具开发

    xff08 Tips 本人纯萌新小白一枚 xff0c 文章只为记录自己的编程历史 xff0c 温故而知新 xff0c 能帮助到大家倍感荣幸 xff0c 有错误的地方劳烦指点 xff01 xff09 不多废话直接进入主题 xff01 本文旨在
  • MySQL中的mysqldump命令使用详解

    MySQL 有很多可以导入数据的方法 xff0c 然而这些只是数据传输中的一半 xff0c 另外的一般是从 MySQL 数据库中导出数据 有许多的原因我们需要导出数据 一个重要的原因是用于备份数据库 数据的造价常常是昂贵的 xff0c 需要
  • xrdp完美实现Windows远程访问Ubuntu 16.04【包括多人桌面与原生桌面】

    xrdp完美实现Windows远程访问Ubuntu 16 04 前言 xff1a 在很多场景下 xff0c 我们需要远程连接到Linux服务器 本文是Ubuntu xff0c 传统的连接主要分为两种 第一种 xff1a 通过SSH服务 xf
  • 蓝牙协议栈(Bluetooth stack)简介

    1 前言 本文只要对蓝牙协议栈做一个简单介绍 xff0c 包含hci层 acl链路 1 l2cap层 xff0c sdp服务及几个常见的profile xff0c 让初学蓝牙协议栈的人 对整个蓝牙协议栈有一个整体框架的了解 2 HCI层 H
  • 树莓派新手入门教程

    原文 xff1a http www ruanyifeng com blog 2017 06 raspberry pi tutorial html 作者 xff1a 阮一峰 日期 xff1a 2017年6月15日 树莓派 xff08 Rasp
  • 数据结构实训之学生信息管理系统

    Copyright c 2016 烟台大学计算机与控制工程学院 All rights reserved 文件名称 xff1a 项目1 cpp 作 者 xff1a 泮春宇 完成日期 xff1a 2016年1月1日 版 本 号 xff1a v1
  • echart图表之highcharts

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 HighCharts是什么 xff1f 二 使用步骤1 引入库2 前端代码3 展现结果4 后台自动截图 总结 前言 提示
  • web登陆退出测试点总结

    根据自己的测试经历 xff0c 又阅读了一些关于登陆测试的资料 xff0c 对web 登陆退出测试点做了一下总结 xff1a 界面测试 xff1a 1 登陆页面显示是否正常 xff1a 文字和图片能否正常显示 xff0c 相应的提示信息是否
  • 异常值检测算法

    闲话 xff1a 最近总是特别嗜睡 xff0c 不知为何床对我的引力总是让我死死的赖在上面 xff0c 大概是懒癌又犯了 要改 异常值分析是检验数据是否有录入错误以及含有不合常理的数据的过程 xff0c 忽视异常值的存在是十分危险的 xff
  • informer

    list watch机制 list watch有两部分组成 xff0c 分别是list和watch list非常好理解 xff0c 就是调用资源的list API罗列资源 xff0c 基于HTTP短链接实现 xff1b watch则是调用资