Joyent最近發(fā)布的3.0版ContainerPilot是一種可在容器內(nèi)部運(yùn)行多個(gè)進(jìn)程的Init系統(tǒng)。該系統(tǒng)可自動(dòng)實(shí)現(xiàn)服務(wù)注冊(cè),服務(wù)發(fā)現(xiàn)、運(yùn)行狀況檢查,以及進(jìn)程的生命周期管理任務(wù)。它提供了一種基于HTTP的全新API,簡化的配置語言,目前僅支持Consul。
通過處理隨后啟動(dòng)的子進(jìn)程,容器中的Init系統(tǒng)可順利應(yīng)對(duì)PID-1問題。ContainerPilot最初在構(gòu)建時(shí)采用了單一“主”應(yīng)用程序的概念,在第3版中,它可以充當(dāng)容器內(nèi)多個(gè)進(jìn)程的控制器,這一改進(jìn)主要來自用戶反饋,因?yàn)楹芏嘤脩魧?duì)進(jìn)程間依賴性的不同選項(xiàng)感到困惑。在本次發(fā)布的新版本中,每個(gè)進(jìn)程都有自己的運(yùn)行狀況檢查、依賴性、運(yùn)行頻率,以及啟動(dòng)和關(guān)閉過程中的生命周期鉤子等機(jī)制。
如果諸如服務(wù)發(fā)現(xiàn)代理等支撐進(jìn)程獨(dú)立于主應(yīng)用運(yùn)行,通常就會(huì)導(dǎo)致容器中運(yùn)行多個(gè)進(jìn)程。此類進(jìn)程的配置方法可能與主應(yīng)用有所不同,同時(shí)主要還取決于同一個(gè)容器或外部容器中運(yùn)行的其他服務(wù)。這些因素導(dǎo)致編排任務(wù)變得復(fù)雜無比。
對(duì)此Joyent提出了一種名為“Autopilot”的概念,借此可將編排方面的所有工作轉(zhuǎn)移給應(yīng)用程序本身,這樣就不再需要外部的編排程序了。此時(shí)的編排通常涉及服務(wù)端點(diǎn)在注冊(cè)表中的注冊(cè)操作,注冊(cè)后才能被其他服務(wù)查找,此外還提供了運(yùn)行狀況檢查的相關(guān)定義,以及依賴項(xiàng)的定義和生命周期管理。在ContainerPilot的產(chǎn)品中,目前的最新版僅支持使用Hashicorp的Consul作為服務(wù)發(fā)現(xiàn)機(jī)制。原本對(duì)etcd的支持已取消。
圖片來源:https://www.joyent.com/blog/containerpilot-hello-world
ContainerPilot中基于HTTP的全新API可供用戶向控制應(yīng)用程序及其環(huán)境發(fā)送信號(hào)。HTTP請(qǐng)求可發(fā)送至容器內(nèi)部的Socket中,借此更新環(huán)境變量,切換維護(hù)模式,記錄Prometheus端點(diǎn)的度量指標(biāo),或重載ContainerPilot配置。這種方式取代了原本基于信號(hào)的機(jī)制,原先的機(jī)制只能切換狀態(tài),但無法提供結(jié)果反饋。
第3版中的配置語言整合了用戶定義服務(wù)生命周期事件之間依賴性的方法。例如,可以定義nginx僅在內(nèi)部的Consul代理啟動(dòng)之后再啟動(dòng)。這種依賴性可以通過啟動(dòng)或停止其他服務(wù)的方式定義,或針對(duì)服務(wù)的任何中間狀態(tài)來定義。該版本還將之前定義的所有“行為”鉤子進(jìn)行了整合,組成了一種名為作業(yè)(Job)的抽象。不同作業(yè)可相互綁定,借此創(chuàng)建由依賴應(yīng)用組成的鏈條。
ContainerPilot是由Joyent原有的一個(gè)名為ContainerBuddy的產(chǎn)品發(fā)展而來的,目前該產(chǎn)品也已成為一個(gè)開源項(xiàng)目,可訪問這里獲取。
閱讀英文原文:ContainerPilot 3.0 Released with Multiprocess Container Support