跳至主要内容

k8s 源码阅读 -- eventf

1 前言

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

1.1 代码参考

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

1.2 代码详解

1.2.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

1.2.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

1.2.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 的依据
Author: Byron.wang
Created: 2019-02-05 Tue 00:00

评论

此博客中的热门博文

在 LSF 中使用 docker 运行任务

LSF + Docker Table of Contents 1. 环境信息 2. 修改配置文件在 lsf 上启用 docker 3. 验证 4. 部署常见问题 5. 部署参考链接 1  环境信息 docker 18.09.5 Kernel Version: 3.10.0-862.11.6.el7.x86_64 lsf 10.1.0.6 OS CentOs 7.6.1810 2  修改配置文件在 lsf 上启用 docker 1.conf/lsf.conf 添加/修改 LSF_PROCESS_TRACKING=Y LSF_LINUX_CGROUP_ACCT=Y LSB_RESOURCE_ENFORCE="cpu memory" 2.conf/lsf.shared 添加 docker Boolean () () (Docker container) 3.conf/lsf.cluster 添加 $your-host-name ! ! 1 3.5 () () (docker) 4./conf/lsbatch/$clustername/configdir/lsb.applications 添加 Begin Application NAME = app1 CONTAINER = docker[image(ubuntu:latest) options(--rm --network=host --ipc=host -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group) starter(root)] DESCRIPTION = Test Docker Application Profile 1 End Application 5.badmin reconfig 验证是否可用 3  验证 在非 root 用户下, bsub -app app1 -I cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DES

Python 中的 UUID

python 中的 uuid 代码参考 cpython/Lib/uuid.py 版本 3.7 什么是 UUID UUID 的全称是 Universal Unique Identifier,中文名是 通用唯一标识符; wikipedia 上 UUID 的定义是 a 128-bit number used to identify information in computer systems UUID 需要满足两个条件: 128 bit 具有标识别计算机系统的能力 UUID 的规则 格式 将 16 个 8 位字节表示成 32 个十六进制数 按照 8-4-4-4-12 的格式加上 4 个连字符 “-‘ 版本 UUID 应该是下面的这种格式 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx 其中 M 开始的 4 位表示版本,N 开始的 4 位表示变种 Name                        Length(bytes)    Length(hex digits)                       Contents time_low                         4                             8                  integer giving the low 32 bits of the time time_mid                         2                             4                  integer giving the middle 16 bits of the time| time_hi_and_version      2                              4                  4-bit “version” in the most significant bits,                                                                                               fol

k8s 源码阅读 -- eviction

Table of Contents 1. 前言 2. 资料 3. 代码详解 3.1. 代码参考 3.2. 详细 1  前言 在某些情况下 k8s 会出现 evicted 的 pod, 然而这并不在  pod 的生命周期 中.这就是 k8s 的驱逐机制。 当机器的一些资源(内存、磁盘)过小时,为了保证 node 不会受到影响,会将 pod 驱逐至其他的机器上 2  资料 可以在  这里看到相关资料 来看一下代码中,驱逐策略是怎样实现的 3  代码详解 3.1  代码参考 kubernetes release-1.10 3.2  详细 pkg/kubelet/apis/kubeletconfig/v1beta/default.go 定义了这几个默认值作为阈值 pkg/kubelet/kubelet.go kubelte 初始化了 eviction manager 在 runtime 相关模块被加载时,eviction manager 被加载进来 开始了 evict 相关的控制循环 接下来是 evict 真正工作的代码 代码目录是 pkg/kubelet/eviction/ 主要看该目录下的两个文件 eviction manager.go  helpers.go pkg/kubelet/eviction/eviction manager.go Start 是 evict manager 的入口 这里是一个死循环 循环中的主要函数是 synchronize 用来清理 pod、同步信息。这个就是今天的主角 先看一下 synchronize 的参数 diskInfoProvider podFunc diskInfoProvider 是一个接口,用来提供磁盘的信息,作为是否发生驱逐的依据。实际函数在  pkg/kubelet/stats/  下 synchronize 中仅用到了 HasDedicatedImageFs podFunc 用来获取一个待检查的 pod 列表,实际函数在 pkg/kubelet/kubelet pods.go 首先检查 imagesfs, 数据从 cadvisor 中获取 获得容器