Pod的创建过程
第一步:不管是通过ctl还是api的方式我们执行命令行以后提交pod给apiserver
第二步:APIServer接收请求后会将pod对象的相关信息存到ETCD里面去,ETCD接收到请求等待写入完成,APIServer会返回一个确认信息给客户端
第三步:一旦APIServer返回信息给客户端以后,scheduler调度器会实时监控ETCD,他监控不了ETCD,scheduler监控APIServer,scheduler在APIServer在有个watcher机制(监控机制)实时监控APIServer有没有变化,scheduler调度器会通过watcher机制监控APIServer有没有变化,创建pod也算是个变化,scheduler调度器一旦收到创建pod请求于是会为该pod挑选一个工作节点,通过节点选择器挑选一个工作节点并将结果更新至APIServer 因为我们前面只是把状态写到ETCD里面还不知道你这个pod调度在哪里呢,通过scheduler调度器把这个pod确定好绑定到那个节点以后再告诉APIServer,APIServer再把对应的结果写到ETCD里面去
第四步:调度器信息由APIServer写入到ETCD里面,ETCD会通过APIServer把这个信息告诉给schedule告诉我已经写入完成了
第五步:scheduler调度器会到对应节点的kubelet调用kubelet,告诉kubelet,kubelet检测到,kubelet是自己监控,检测到由调度器绑定本节点的pod后读取配置信息,kubelet他会通过APIServer 读取配置信息 并由本地的容器运行时(containers run time) 创建相应的容器并且启动pod,一旦创建完成以后kubelet会把结果返回给APIServer
第六步:APIServer接收到kubelet的发来的pod状态信息后更新到ETCD,APIServr和kubelet之间会不停的交互,然后状态会写入到etcd,然后等待最终写入完成同时ETCD更新完成,整个pod就创建完成了
所有的组件都是和APIServer交互的,任何的修改创建更新删除这种操作都会有一个状态的修改,状态修改需要存入到ETC的里面来
APIServer会不停的和ETCD有交互,同时这些节点是怎么来收到ETCD有东西变更的呢,他是通过一种监控机制,scheduler和kubelet都实时监控APIServer的变化一般是1秒检测一次
整合一下:Pod的创建过程
1)用户通过kubectl或其他API客户端提交 Pod Spec给 APIServer。
2)API Server尝试着将Pod对象的相关信息存入eted中,待写入操作执行完成,API Server 即会返回确认信息至客户端。
3)Scheduler(调度器)通过其watcher监测到API Server创建了新的Pod对象,于是为该 Pod 对象挑选一个工作节点并将结果信息更新至 API Server。
4)调度结果信息由 API Server更新至 etcd存储系统,并同步给 Scheduler。
5)相应节点的 kubelet 监测到由调度器绑定于本节点的 Pod后会读取其配置信息,并由本地容器运行时(CRI)创建相应的容器启动 Pod 对象后将结果回存至 API Server。
6)API Server将 kubelet发来的 Pod状态信息存入 etcd系统,并将确认信息发送至相应的 kubelet。
Pod的删除过程
第一步:发送删除请求
第二步:APIServer接受到这个删除请求,Pod对象会随着时间推移宽限时期30秒,正常不是立马删除有个宽限期这个期限之间pod会被设置dead状态
第三步:一旦pod被设置dead状态后,pod状态会被标为Terminating状态,Terminating是等待被删除
第四步(与第三步同时运行):kubelet会监控到pod状态的为Terminating,会启动pod的一个关闭过程,
第五步(与第三步同时运行):端点控制器监控到 Pod 对象的关闭行为时将其从所有匹配到此端点的 Service资源的端点列表中移除。
第六步:如果说pod里面定义了preStop钩子配置,在其标记为Terminating后 那么先执行preStop 如果preStop执行完成,如果宽限期(30秒)到了preStop也结束了刚好到30秒宽限期了,那就结束了,如果30秒宽限期到了preStop还未执行完成,那重新执行第二步并获取2秒钟的一个小宽限期,然后继续执行preStop
第七步:Pod对象容器进程收到 关闭信号(TETM)
第八步:宽限结束以后,若存在任何一个任在运行的进程,pod对象会直接kill掉 强制kill掉
第九步:kubelet请求APIServer 将此pod资源宽限期限设置为0 从而完成删除操作,pod变得对用户不再可见,宽限期设置为0就是完整删除了,
总结一下:Pod删除过程
1)用户发送删除 Pod 对象的命令。
2)API服务器中的 Pod 对象会随着时间的推移而更新,在宽限期内(默认为30秒),Pod 被视为dead。
3)将 Pod 标记为 Terminating 状态。
4)(与第 3步同时运行)kubelet 在监控到 Pod 对象转为 Terminating 状态的同时启动Pod 关闭过
程。
5)(与第 3 步同时运行)端点控制器监控到 Pod 对象的关闭行为时将其从所有匹配到此端点的 Service
资源的端点列表中移除。
6)如果当前 Pod 对象定义了preStop 钩子句柄,在其标记为 terminating 后即会以同步方式启动执
行;如若宽限期结束后,preStop 仍未执行完,则重新执行第 2步并额外获取一个时长为2 秒的小宽限期。
7 )Pod 对象中的容器进程收到 TERM 信号。
8)宽限期结束后,若存在任何一个仍在运行的进程,Pod对象即会收到 SIGKILL信号。
9)Kubelet 请求 API Server 将此 Pod 资源的宽限期设置为 0从而完成删除操作,它变得对用户不再
可见。
默认情况下,所有删除操作的宽限期都是 30秒,不过kubectl delete命令可以使用--grace•period=<seconds>选项自定义其时长,使用0值则表示直接强制删除指定的资源,不过此时需要同时为命令
使用 --force 选项
下面是pod被删除的状态记录
[root@k8s-master1 pod]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx-4 1/1 Running 0 82m
nginx-4 1/1 Terminating 0 82m
nginx-4 1/1 Terminating 0 82m
nginx-4 0/1 Terminating 0 82m
nginx-4 0/1 Terminating 0 82m
nginx-4 0/1 Terminating 0 82m