kubernetes eventf

Table of Contents

1 前言

k8s 是如何记录事件的

在 k8s 中 event 的记录追根溯源都是来自 client-go/tools/record/event.go 下的 EventRecorder 接口

2 代码参考

v1.14-alpha.2 k8s.io/kubernetes/staging/src/k8s.io/client-go/tools/record/

3 代码详解

3.1 结构定义

在 event.go 中定义了 Eventsink EventRecorder EventBroadcaster 这三个接口

46069316025_23614aab6f_b.jpg

eventBroadcasterImpl 和 recorderImpl 这两个结构体

46983274621_51f5c5860c_b.jpg 46983274881_39609369a1_b.jpg

在 recorderImpl 下实现了几个函数

46983275531_452a0d2cc4_b.jpg

在 eventBroadcasterimpl 下实现了几个函数

46983276761_dd2c85dc18_b.jpg

3.2 实际使用时的流程

在 kubelet 启动时逐层调用

Newkubeletcommand => Run => run

这段代码可以在 /cmd/kubelet/app/server.go 下找到

这里我们不关心 kubelet 启动时做了什么,直接来看 event 相关的工作逻辑

在 629 行, 使用了 makeEventrecorder 这个函数

46983277121_0963f0632e_b.jpg

先初始化 eventBroadcasterImpl

然后 recorderImpl 初始化,并赋值给 kubeDeps.Recorder

如果需要记录日志,则直接使用 Eventf 记录日志;如下图

46983277591_248991453b_b.jpg

3.3 Event 在 kubelet 内部的工作流程

内部的工作流程发生在初始化 eventBroadcasterImpl 的时候

默认的参数如下

46983277891_7c5ffc51da_b.jpg]

watch.NewBroadcaster(maxQueuedEvents, watch.DropIfChannelFull)

NewBroadcaster 用来创建一个新的 Broadcaster

Broadcaster 开了一个 goroutine 用来将对应的所有的 Broadcasterwatcher 注册进来,而且并不会结束

这样保证 Broadcasterwatcher 可以接收到 Broadcaster 发过来的所有事件

46983278181_d6ff5f4bee_b.jpg

m.loop m.distribute 定义如下

46983278471_2d7df634ce_b.jpg

m.distributing.Add 定义如下

46983278741_6109587fb3_b.jpg

m.distributing.Add 用于将 Broadcaster 加入到队列当中

在这里 k8s 将高 32 位作为计数器,然后将低 32 位作为等待计数器

这个 64 位的数是 k8s waitgroup 的依据

Created: 2021-01-10 Sun 16:12

Emacs 25.2.2 (Org mode 8.2.10)

Validate