因为最近在工作中遇到一个问题,业务pod 没创建失败,但是检测cni 的日志发现新创建的pod 已经被分配了IP地址,但是通过docker ps 和 kubectl get pod 均没有发现对应的容器,遂重温了下pod 创建的流程,查到得大部分都比较简单,到kubelet之后就是一笔带过,没有明确给出拉起pod时的具体操作,所以简单过了一下kubelet 的代码,发现是拉起业务容器时出现的问题,因为问题比较有通用性,所以简单的记录下。
- 用户通过kubectl或者k8s官方提供的client库,向api-server 发起请求
- api-server接受请求,并将数据写入etcd
- kube-scheduler通过watch检测到未绑定node 的pod,调度pod到某一node上,并通知给api-server,api-server将其写入etcd
- kubelet通过watch 检测到有新的pod调度过来,通过container runtime 运行新pod
- kubelet 通过cri 拉起pause 容器
- kubelet 通过cni 为pause容器创建网络(虚拟网络设备,ip地址)
- kubelet 拉起业务容器,业务容器和pause容器共享同一个网络空间
由于网上的流程图实在太多了,这里就不贴图了(主要是我太懒了,不想画图)