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 这三个接口
eventBroadcasterImpl 和 recorderImpl 这两个结构体
在 recorderImpl 下实现了几个函数
在 eventBroadcasterimpl 下实现了几个函数
3.2. 实际使用时的流程
在 kubelet 启动时逐层调用
Newkubeletcommand => Run => run
这段代码可以在 /cmd/kubelet/app/server.go 下找到
这里我们不关心 kubelet 启动时做了什么,直接来看 event 相关的工作逻辑
在 629 行, 使用了 makeEventrecorder 这个函数
先初始化 eventBroadcasterImpl
然后 recorderImpl 初始化,并赋值给 kubeDeps.Recorder
如果需要记录日志,则直接使用 Eventf 记录日志;如下图
3.3. Event 在 kubelet 内部的工作流程
内部的工作流程发生在初始化 eventBroadcasterImpl 的时候
默认的参数如下
]
watch.NewBroadcaster(maxQueuedEvents, watch.DropIfChannelFull)
NewBroadcaster 用来创建一个新的 Broadcaster
Broadcaster 开了一个 goroutine 用来将对应的所有的 Broadcasterwatcher 注册进来,而且并不会结束
这样保证 Broadcasterwatcher 可以接收到 Broadcaster 发过来的所有事件
m.loop m.distribute 定义如下
m.distributing.Add 定义如下
m.distributing.Add 用于将 Broadcaster 加入到队列当中
在这里 k8s 将高 32 位作为计数器,然后将低 32 位作为等待计数器
这个 64 位的数是 k8s waitgroup 的依据