一、初始化阶段
- 创建Pod:用户通过kubectl或其他API客户端提交Pod的创建请求给apiServer。apiServer接收到请求后,会生成Pod对象的信息,并将其存入etcd,然后返回确认信息至客户端。
- 调度Pod:scheduler监控到新的Pod对象后,会为其分配主机节点,并将结果信息更新至apiServer。
- 启动容器:node节点上的kubelet发现Pod被调度到本节点后,会尝试调用Docker(或其他容器运行时)启动容器。在这个阶段,Pod可能会包含初始化容器(Init Containers),这些容器在主容器启动之前运行,主要用于做一些前置工作,如配置环境变量、拉取配置文件等。
二、运行阶段
- 容器启动:Pod中的所有容器(包括初始化容器和主容器)启动后,Pod进入运行状态。在这个阶段,Pod可能会经历一些钩子事件,如容器启动后钩子(postStart)和容器终止前钩子(preStop)。
- 健康状态诊断:Kubernetes会对Pod的健康状态进行持续诊断,包括启动探测(StartupProbe)、存活性探测(LivenessProbe)和就绪性探测(ReadinessProbe)。这些探测用于确保Pod中的容器能够正常运行并准备好接受流量。
- 重启策略:如果Pod中的容器因为某些原因退出,kubelet会根据Pod的重启策略(restartPolicy)来决定是否重启容器。重启策略包括Always(总是重启)、OnFailure(仅在失败时重启)和Never(从不重启)。
三、终止阶段
- 删除Pod:用户通过kubectl或其他API客户端提交删除Pod的请求给apiServer。apiServer接收到请求后,会更新Pod对象的状态,并将其标记为terminating。
- 宽限期:在Pod被标记为terminating后,会进入一个宽限期(默认为30秒)。在这个宽限期内,Pod中的容器会尝试优雅地终止。如果定义了preStop钩子,它会在容器接收到终止信号之前执行。
- 强制终止:如果宽限期结束后,Pod中仍有容器在运行,kubelet会请求apiServer将Pod的宽限期设置为0,从而强制终止剩余的容器。此时,Pod对象也会被从etcd中删除,对于用户来说,Pod已经不可见。