K8S controller编写之Informer的原理+使用[drift]

概念

核心思想(重点)watch-list 机制

Watch 通过 HTTP 协议与 Kubernetes API Server 建立长连接,接收 Kubernetes API Server 发来的资源变更事件。Watch 操作的实现机制使用 HTTP 协议的分块传输编码——当 client-go 调用 Kubernetes API Server 时,Kubernetes API Server 在 Response 的 HTTP Header 中设置 Transfer-Encoding 的值为 chunked,表示采用分块传输编码,客户端收到消息后,与服务端进行连接,并等待下一个数据块。因此得以不断地获取到各个资源的update.

client-go 中informer的概括图.

  1. Reflector:用于 Watch 指定的 Kubernetes 资源,当 watch 的资源发生变化时,触发变更的事件,比如 Added,Updated 和 Deleted 事件,并将资源对象存放到本地缓存 DeltaFIFO;
  2. DeltaFIFO:拆开理解,FIFO 就是一个队列,拥有队列基本方法(ADD,UPDATE,DELETE,LIST,POP,CLOSE 等),Delta 是一个资源对象存储,保存存储对象的消费类型,比如 Added,Updated,Deleted,Sync 等;
  3. Indexer:Client-go 用来存储资源对象并自带索引功能的本地存储,Reflector 从 DeltaFIFO 中将消费出来的资源对象存储到 Indexer,Indexer 与 Etcd 集群中的数据完全保持一致。从而 client-go 可以本地读取,减少 Kubernetes API 和 Etcd 集群的压力。

图来源(CloudNativeCommunity)

实现辅助:FIFO 队列,缓存机制

Controller实线部分(黄色,实用)

clientset, err := kubernetes.NewForConfig(config)
stopCh := make(chan struct{})
defer close(stopch)
sharedInformers := informers.NewSharedInformerFactory(clientset, time.Minute)
informer := sharedInformer.Core().V1().Pods().Informer()
informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
  AddFunc: func(obj interface{} {
    // ...
  },
  UpdateFunc: func(obj interface{} {
    // ...
  },
  DeleteFunc  : func(obj interface{} {
    // ...
  })
  informer.Run(stopCh)
})
  • Informer 需要通过 ClientSet 与 Kubernetes API Server 交互;
  • 创建 stopCh 是用于在程序进程退出前通知 Informer 提前退出,Informer 是一个持久运行的 goroutine;
  • NewSharedInformerFactory 实例化了一个 SharedInformer 对象,用于进行本地资源存储;
  • sharedInformer.Core().V1().Pods().Informer() 得到了具体 Pod 资源的 informer 对象;
  • AddEventHandler 即图中的第 6 步,这是一个资源事件回调方法,上例中即为当创建/更新/删除 Pod 时触发事件回调方法;
  • 一般而言,其他组件使用 Informer 机制触发资源回调方法会将资源对象推送到 WorkQueue 或其他队列中,具体推送的位置要去回调方法里自行实现。

...[inprogress]
 

相关推荐

  1. K8s Informer Resync 机制

    2024-05-01 00:44:01       56 阅读
  2. K8s client go 合并informer

    2024-05-01 00:44:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-01 00:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-01 00:44:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-01 00:44:01       82 阅读
  4. Python语言-面向对象

    2024-05-01 00:44:01       91 阅读

热门阅读

  1. Golang中的Json标签(持续更新...)

    2024-05-01 00:44:01       27 阅读
  2. 重要数据的识别因素

    2024-05-01 00:44:01       32 阅读
  3. 人工智能入门:你需要掌握哪些基础知识?

    2024-05-01 00:44:01       29 阅读
  4. 【设计模式】14、strategy 策略模式

    2024-05-01 00:44:01       30 阅读
  5. 你用过最好用的AI工具有哪些?【模板】

    2024-05-01 00:44:01       25 阅读
  6. 如何在React中实现状态钩子

    2024-05-01 00:44:01       29 阅读
  7. 剧情游戏如何制作?

    2024-05-01 00:44:01       27 阅读
  8. 跟我学C++中级篇——内联

    2024-05-01 00:44:01       29 阅读
  9. pytest.ini配置文件

    2024-05-01 00:44:01       25 阅读
  10. Three CSS2D 渲染器 月球绕地球旋转

    2024-05-01 00:44:01       31 阅读