K8s 源码分析 Pod的创建和驱逐
Contents
上篇 K8s 源码分析 Deployment 和ReplicaSet 的创建流程 最后replicaSet通过client-go调用pod 创建的api。
创建流程
初始化
pod的调度主要有scheduler负责,创建scheduler源码路径:kubernetes/pkg/scheduler/scheduler.go 上代码:
|
|
createFromProvider 负责scheduler真正的初始化操作
|
|
addAllEventHandlers 初始化的handler比较多,主要包括:pod、node、PersistentVolumes、PersistentVolumeClaims、service、StorageClasses 因本文只关心pod部分,所以以下代码只展示pod 相关handler。pod的handler分为scheduled和unscheduled.
|
|
Pod Informer EventHandler的实现, 就是将pod加入到podQueue等待消费
|
|
Run Scheduler逻辑执行
初始化完成,就开始了熟悉的Run方法,和deployment、replicaSet的流程一致。
|
|
bind 的具体流程分析
|
|
以上通过bind 调用k8s的client将请求发送给api-server,api-server收到请求后,先落库etcd,然后发送给kubelet。
pod的容忍和驱逐
那么为什么有的pod会被返回创建销毁,什么情况下被销毁?
销毁的原因之一就是pod的toleration策略。
k8s中具体实现此功能的struct为:NoExecuteTaintManager
负责监听Taint/Toleration 的改变,并删除Pods
源码路径:kubernetes/pkg/controller/nodelifecycle/scheduler/taint_manager.go
初始化
|
|
Run 执行taint逻辑
|
|
woker负责同时消费 nodeUpdateChannels 和 podUpdateChannels ,因为node变更,会影响pod的分布:驱逐、分配、新建等等 所以需要先将 nodeUpdateChannels 中的数据消费完成后,才会处理 podUpdateChannels 的数据。
|
|
AddWork
|
|
podUpdateQueue Add在哪里
到这里还要明确一个问题,podUpdateQueue中的数据是谁set进去的?
controller在初始化时,会初始化一个NodeLifecycleController,new NodeLifecycleController 之后,也会调用NodeLifecycleController的Run方法。
|
|
PodUpdated 负责将pod 加入到 podUpdateQueue 中
|
|