將pod對(duì)象從創(chuàng)建至終的這段時(shí)間范圍稱(chēng)為pod的生命周期容贝,它主要包含下面的過(guò)程:
- pod創(chuàng)建過(guò)程
- 運(yùn)行初始化容器(init container)過(guò)程
- 運(yùn)行主容器(main container)
- 容器啟動(dòng)后鉤子(post start)、容器終止前鉤子(pre stop)
- 容器的存活性探測(cè)(liveness probe)、就緒性探測(cè)(readiness probe)
- pod終止過(guò)程
在整個(gè)生命周期中讹语,Pod會(huì)出現(xiàn)5種狀態(tài)甫题,分別如下:
- 掛起(Pending):apiserver已經(jīng)創(chuàng)建了pod資源對(duì)象符欠,但它尚未被調(diào)度完成或者仍處于下載鏡像的過(guò)程中
- 運(yùn)行中(Running):pod已經(jīng)被調(diào)度至某節(jié)點(diǎn)蛹批,并且所有容器都已經(jīng)被kubelet創(chuàng)建完成
- 成功(Succeeded):pod中的所有容器都已經(jīng)成功終止并且不會(huì)被重啟
- 失敗(Failed):所有容器都已經(jīng)終止荆陆,但至少有一個(gè)容器終止失敗滩届,即容器返回了非0值的退出狀態(tài)
- 未知(Unknown):apiserver無(wú)法正常獲取到pod對(duì)象的狀態(tài)信息,通常由網(wǎng)絡(luò)通信失敗所導(dǎo)致
1 創(chuàng)建和終止
1.1pod的創(chuàng)建過(guò)程
用戶(hù)通過(guò)kubectl或其他api客戶(hù)端提交需要?jiǎng)?chuàng)建的pod信息給apiServer
apiServer開(kāi)始生成pod對(duì)象的信息被啼,并將信息存入etcd帜消,然后返回確認(rèn)信息至客戶(hù)端
apiServer開(kāi)始反映etcd中的pod對(duì)象的變化,其它組件使用watch機(jī)制來(lái)跟蹤檢查apiServer上的變動(dòng)
scheduler發(fā)現(xiàn)有新的pod對(duì)象要?jiǎng)?chuàng)建浓体,開(kāi)始為Pod分配主機(jī)并將結(jié)果信息更新至apiServer
node節(jié)點(diǎn)上的kubelet發(fā)現(xiàn)有pod調(diào)度過(guò)來(lái)泡挺,嘗試調(diào)用docker啟動(dòng)容器,并將結(jié)果回送至apiServer
apiServer將接收到的pod狀態(tài)信息存入etcd中
1.2pod的終止過(guò)程用戶(hù)向apiServer發(fā)送刪除pod對(duì)象的命令
apiServcer中的pod對(duì)象信息會(huì)隨著時(shí)間的推移而更新命浴,在寬限期內(nèi)(默認(rèn)30s)娄猫,pod被視為dead
將pod標(biāo)記為terminating狀態(tài)
kubelet在監(jiān)控到pod對(duì)象轉(zhuǎn)為terminating狀態(tài)的同時(shí)啟動(dòng)pod關(guān)閉過(guò)程
端點(diǎn)控制器監(jiān)控到pod對(duì)象的關(guān)閉行為時(shí)將其從所有匹配到此端點(diǎn)的service資源的端點(diǎn)列表中移除
如果當(dāng)前pod對(duì)象定義了preStop鉤子處理器,則在其標(biāo)記為terminating后即會(huì)以同步的方式啟動(dòng)執(zhí)行
pod對(duì)象中的容器進(jìn)程收到停止信號(hào)
寬限期結(jié)束后生闲,若pod中還存在仍在運(yùn)行的進(jìn)程媳溺,那么pod對(duì)象會(huì)收到立即終止的信號(hào)
kubelet請(qǐng)求apiServer將此pod資源的寬限期設(shè)置為0從而完成刪除操作,此時(shí)pod對(duì)于用戶(hù)已不可見(jiàn)