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