《CodePicnic的Docker Swarm之路》要點:
本文介紹了CodePicnic的Docker Swarm之路,希望對您有用。如果有疑問,可以聯系我們。
在CodePicnic,Docker很早就成了基礎設施的核心部分.從0.11版本開始,我們不但看到了Docker的成長,更看到了一整個相關生態的建立.
與此同時,CodePicnic也在發展,我們有了不同于其他基于容器平臺的特性.這也導致我們開始考慮在可擴展并且控制成本的前提下,(使之成為)一個穩定且高效的平臺.
我們的應用負責以一種簡單高效的方式來管理容器平臺.通過一系列規則,節點(裝有Docker引擎的AWS EC2實例)被選擇來部署新的容器.另一方面,當需求上升時,我們會通過AWS終端來增加節點,并提供給新客戶.為此,我們開始尋找一些容器編排系統來替換我們自身的解決方案.
我們首先選擇的是Kubernetes,這是一個由Google開發的編排平臺.
對于管理Docker集群而言,Kubernetes是一個復雜但是健壯的方案(可以選擇自動擴展節點、容器、監視器、日志等).
Kubernetes使用Pod作為容器的通訊層.這就意味著,我們的應用和Docker通訊的方式發生了改變.這里最大的挑戰在于,讓我們的架構適應Kubernetes的哲學.這可以用書中的短語(http://kubernetes.io/docs/user-guide/services/)來概括:
我們的平臺依賴于持久化組件,這個事實促使我們尋找一個替代方案.
和Kubernetes相比,Docker Swarm是簡單的:它為一組Docker引擎提供集群能力,并且它能在單個引擎中管理容器的編排.你可以向Swarm添加自己的Docker基礎架構,并且它們的API和Docker的API是兼容的,因此我們并不需要對應用有較大的變動以開始使用它來管理容器.
如此一來,我們就有了獨特的關于Swarm Master的接口,而不是管理N個Docker實例.Swarm作為容器化的應用運行,并負責調度在哪里部署新的容器.策略、約束和親和性共同決定了哪一個節點會被選擇.
雖然遷移簡單,但是讓Docker Swarm管理集群中成千上萬的容器和鏡像會有性能問題,這使得我們修改Swarm的源碼以優化容器的創建時間并避免調度器上的并發鎖.在未來的文章中,我們將會繼續討論我們的優化.
編排和調度工作得不錯,但是監控和擴展性并不是方案的一部分.
我們的基礎架構工作于AWS上,AWS本身已經提供了這些問題的解決方案.因此,我們開始將系統和容器的度量數據發往AWS Cloudwatch.當這些數據超過閾值后,一個警告就會被發往AWS Auto Scaling,它會提供一個或一個以上的新實例.一旦一個實例啟動,它便會在Docker Compose的協助下,自動注冊到Docker Swarm.
另一個集成進我們架構的Docker特性是多host網絡.這個特性使得AWS彈性負載均衡能夠和所有容器通信,無論它們在哪個節點上.
Docker v1.1包含了一個嵌入DNS,它允許提供基于容器名和別名的服務發現.在早期實現中,我們需要在host上為新創建的容器開啟端口.這樣,應用就能和容器通信以告訴終端用戶在哪里工作.如此實現存在幾個缺點,我們需要記錄端口的使用,并且端口數量也受每個節點自身的限制(大約65535或更少一點).如今,我們有Nginx容器在內部將請求路由到正確的容器和端口,這樣就不需要通過節點開放多端口了.
圍繞著這個基礎設置,我們添加了額外的組件來自動管理任務.我們用來提供給不同終端的所有基礎鏡像(Ruby、Python、PHP、Swift等)都存儲在Docker Registry.
我們使用Jenkins來構建鏡像并上傳到Registry.我們通過Jenkins使用的Ansible腳本,來更新AWS Auto Scaling提供新實例時所使用的AWS鏡像.
關于監控方案,cAdvisor運行在所有的節點中以收集來自容器的狀態.我們使用InfluxData來收集度量信息,例如正在運行的容器,執行Docker命令的時間消耗等.這些度量信息反過來由Grafana顯示.
想象一下!未來會如何?我們已經嘗試了新的Docker發行版,但是惡心的bug使得我們無法升級自己的平臺,因此我們目前正在等待Docker v1.12以及未來的發行版.我們開始向自己的Swarm集群添加基于Windows的Docker引擎.不久前,Docker發布了Swarmkit(https://github.com/docker/swarmkit),這是一個用于提供Kubernetes類似特性的編排平臺.
正如我們之前說過,Docker和我們一樣正在發展.我們將會繼續添加最好的工具來改進我們的平臺,并向用戶盡可能提供更好的體驗.
文章出處:Docker(公眾號ID:Dockerone)
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4475.html