你可能已經聽說過Docker容器這項新技術。開發人員很喜歡它,因為可以用腳本來構建容器,添加一層層服務,并直接從MacBook Pro將它們推送到服務器進行測試。容器之所以切實可行,是因為它們超輕量級,不像那些現在已經過時的虛擬機。容器以及交付服務的其他輕量級方法正在改變操作系統、應用程序及管理工具的格局。這份榜單上的最佳數據中心和云計算軟件更是其中的佼佼者。
Docker Machine、Compose和Swarm
Docker的開源容器技術已經得到了各大公有云的采用,正內置到Windows Server的下一個版本中。Docker是一款功能強大的數據中心自動化工具,讓廣大開發人員和運營團隊得以將應用程序與基礎設施分開來。
然而,容器只是Docker生態系統的一部分。Docker還提供了一系列工具,讓你可以使用Docker API,讓容器的整個生命周期實現自動化,另外可自動處理應用程序的設計和編排。
Machine讓你可以實現Docker容器配置自動化。從命令行開始入手,你可以使用一行代碼,鎖定一個或多個主機,部署Docker引擎,甚至將它加入到Swarm集群。支持大多數虛擬機管理程序和云平臺,你只需要自己的訪問憑據。
Swarm處理集群和調度,還可以與Mesos整合起來,提供更高級的調度功能。你可以使用Swarm建立容器主機池,那樣需求增加時,應用程序可以相應擴展。應用程序及所有依賴項都可以用Compose來定義,它讓你可以把諸容器連接起來,連入到一個分布式應用程序,作為一個組來啟動。Compose描述可適用于諸平臺,那樣拿來開發人員的配置后,可迅速部署到生產環境中。
CoreOS和RKT
CoreOS是一種瘦薄的輕量級服務器操作系統,基于谷歌的Chromium OS。它旨在與Linux容器結合使用,而不是使用程序包管理器來安裝功能。通過使用容器來擴展瘦薄的核心,CoreOS讓你可以快速部署應用程序,在云基礎設施上順暢運行。
CoreOS的容器管理工具fleet旨在把CoreOS服務器集群當作單個部件來對待,相應工具可用來管理高可用性,并根據資源可用性,將容器部署到集群。跨集群鍵/值存儲系統etcd負責處理設備管理,并支持服務發現。如果某個節點出現故障,etcd就能在新的副本上迅速恢復狀態,提供一個連接到CoreOS自動化更新服務的分布式配置管理平臺。
雖然CoreOS也許因支持Docker而家喻戶曉,但CoreOS的團隊正在開發自己的容器運行時環境rkt,有自己的容器格式:應用容器映像(App Container Image)。rkt還與Docker容器兼容,采用了模塊化架構,允許不同的容器化系統(甚至硬件虛擬化系統)可以插入。然而,rkt仍處于發展的早期階段,所以還沒有完全準備好用于生產環境。
RancherOS
由于我們使用容器從底層操作系統抽取越來越多的服務,開始隨之考慮未來的操作系統會是什么樣子。類似我們的應用程序,未來的操作系統將會是在瘦薄內核上運行的一組模塊化服務,可以自我配置,只提供應用程序所需的服務。
我們可以從RancherOS領略未來操作系統的模樣。RancherOS結合了Linux內核和Docker,是一種極簡操作系統,適合將基于容器的應用程序托管在云基礎設施中。RancherOS利用Docker,將Linux用戶空間服務和應用程序托管在不同的容器層中,而不是使用標準的Linux包裝技術。低級別的Docker實例先啟動,將系統服務托管在各自的容器中。用戶的應用程序在較高級別的Docker實例中運行,獨立于系統容器。即使其中一個容器崩潰了,主機照樣正常運行。
RancherOS只有20MB大小,所以很容易在整個數據中心中進行復制。它還旨在使用自動化工具加以管理,而不是人工管理,API級訪問既適用于Docker的管理工具,又適用于Rancher Labs自己的云基礎設施和管理工具。
Kubernetes
谷歌的Kubernetes容器編排系統旨在管理和運行用Docker和Rocket容器構建的應用程序。Kubernetes專注于管理微服務應用程序,讓你可以跨主機群集分發容器,同時處理擴展問題,確保托管的服務可靠地運行。
由于容器提供了應用程序抽象層,Kubernetes是一種以應用程序為中心的管理服務,支持許多現代開發模式,側重于用戶意圖。這意味著你啟動應用程序后,Kubernetes會管理容器,以便容器在你設定的參數范圍內運行,并使用Kubernetes調度器,確保它獲得所需的資源。容器被分成了一個個pod,由復制引擎加以管理。該引擎可以恢復出現故障的容器,或者應用程序增加時,添加更多的pod。
Kubernetes支持谷歌自己的容器引擎(Container Engine),它可以在一系列其他的云和數據中心服務上運行,包括AWS和Azure,以及vSphere和Mesos。容器可以松散耦合或緊密耦合,那樣不是為云平臺即服務(PaaS)運營環境設計的應用程序可以作為一組緊密耦合的容器,遷移到云端。Kubernetes還支持將應用程序快速部署到群集,為你提供了實現持續交付過程的端點。
Mesos
將數據中心變成私有云或公有云不僅僅需要虛擬機管理程序,還需要一種新的操作層,可以管理數據中心資源,就好像它們是單一計算機,處理資源和調度。Apache Mesos被稱為是一種“分布式系統內核”,讓你可以管理成千上萬臺服務器,使用容器來托管應用程序和API,支持應用程序并行開發。
Mesos的核心是一組守護進程,將資源暴露在中央調度程序面前。任務跨節點分發,充分利用可用的處理器和內存資源。一個關鍵方法是,要是提供的資源滿足不了要求,應用程序可以拒絕這些資源。這種方法很適用于大數據應用,你可以使用Mesos運行Hadoop和Cassandra分布式數據庫,還有Apache自己的Spark數據處理引擎。還支持Jenkins持續集成服務器,讓你可以在服務器集群上并行運行構建worker和測試worker,并根據工作負載的大小,動態調整任務。
Mesos設計成可在Linux和Mac OS X上運行,最近還被移植到Windows上,以支持在Azure平臺上開發可擴展的并行應用程序。
SmartOS和SmartDataCenter
Joyent的SmartDataCenter是一款運行其公有云的軟件,在SmartOS瘦服務器操作系統上面添加了一個管理平臺軟件。SmartOS是OpenSolaris的后續版本,結合了Zones容器和KVM虛擬機管理程序,這是一種內存中的操作系統,可從U盤快速啟動,可以在裸機服務器上運行。
使用SmartOS,你可以快速部署一組輕量級服務器,這些服務器可通過一組JSON API,以編程的方式加以管理,而功能通過虛擬機來交付,由內置的映像管理工具來下載。通過使用虛擬機,所有用戶空間(userland)操作與底層操作系統隔離開來,減小了主機和訪客的安全隱患。
SmartDataCenter在SmartOS服務器上運行,一臺服務器作為專用管理節點來運行,集群的其余服務器作為計算節點來運行。可以從筆記本電腦上的云版本(這是一種VMware虛擬設備)開始入手,因而可以試用管理服務器。在實際數據中心,你將把SmartOS部署到服務器上,使用ZFS來處理存儲――這包括本地映像庫。服務作為映像來部署,而各組件存儲在對象庫中。
SmartDataCenter和SmartOS這個組合改善了Joyent公有云的體驗,提供了一套屢試不爽的工具,可以幫助你啟動自己的云數據中心。這個基礎架構專注于如今的虛擬機,但也為明天的虛擬機奠定了基礎。一個相關的Joyent項目sdc-docker將整個SmartDataCenter集群暴露為單單一個Docker主機,受原生Docker命令的控制。
Sensu
管理大規模數據中心的關鍵不是使用服務器的圖形用戶界面(GUI),而是根據來自監控工具和服務的信息,自動編制腳本,轉發來自傳感器和日志的信息,然后將操作/行動告知應用程序。Sensu就是開始提供這種功能的一個工具,它常常被稱為“監控路由器”。
在數據中心中運行的腳本將信息發送給Sensu,然后Sensu再將信息發送給相應的處理程序,使用一種基于RabbitMQ的發布/訂閱架構。服務器可以呈分布式,將發布的檢查結果發送給負責處理的代碼。你可以在電子郵件、Slack房間或Sensu自己的儀表板中查看結果。消息格式由JSON文件來定義,變異器(mutator)被用來實現數據實時格式化,消息經過濾后交給一個或多個事件處理程序。
Sensu仍是一種比較新興的工具,但是大有希望。如果你想實現數據中心自動化,就需要這樣一款工具,不僅用來表明數據中心出現的情況,還可用來在最需要的時候提供這方面信息。一款商業版本增加了支持與第三方應用程序集成的功能,但是開源版本含有管理數據中心所需的大部分功能。
Prometheus
管理現代數據中心是項復雜的任務。一排排服務器需要小心對待,你還需要旨在處理成千上萬個節點的監控系統。監控應用軟件帶來了特殊的挑戰,這時候Prometheus可以發揮用場。作為一種旨在向操作人員提供警報的服務監控系統,Prometheus可以在各系統上運行,無論是一臺筆記本電腦,還是多臺監控服務器組成的高可用性集群。
時間序列數據捕獲后存儲起來,然后與模式進行比對,識別故障和問題。你需要暴露HTTP端點上的數據,使用YAML文件來配置服務器。基于瀏覽器的報告工具可處理數據顯示,還有一個表達式控制臺,你可以試用查詢。儀表板可以用GUI構建器來構建,或使用一系列模板來編寫,那樣你可以提供應用程序控制臺,這些控制臺可使用Git等版本控制系統來加以管理。
比如說,捕獲的數據可使用表達式加以管理,因而很容易聚合來自幾個數據源的數據,比如說可以將來自一系列Web端點的數據集中到一個存儲區。一個試驗性的警報管理模塊將警報發送給常見的協作和開發運營工具,包括Slack和PagerDuty。提供了面向Go和Java等常見語言的官方客戶軟件庫,這意味著很容易為應用程序和服務添加支持Prometheus的功能,而第三方選件可以將Prometheus擴展到Node.js和.Net。
Elasticsearch、Logstash和Kibana
運行現代數據中心會生成大量數據,還需要從這些數據中獲取信息的工具。這時候,Elasticsearch、Logstash和Kibana這對組合(常常被稱為ELK架構)可以發揮作用。
Elasticsearch旨在處理可擴展的搜索任務,對多種類型的內容執行搜索,包括結構化和非結構化文檔。它基于Apache的Lucene信息檢索工具,還有一組充分利用REST的JSON API。它用來為維基百科和GitHub等網站提供搜索服務,使用分布式索引,具有自動化負載平衡和路由功能。
現代云架構的基礎是物理服務器陣列,作為虛擬機主機來運行。監控成千上萬臺服務器需要集中式日志。Logstash負責采集和過濾那些服務器(以及在服務器上運行的應用程序)生成的日志,并使用每一臺物理機和虛擬機上的轉發器。然后,Logstash格式的數據發送給Elasticsearch,為你提供了搜索索引:添加更多的服務器后,搜索引擎可以迅速擴展。
在更高層面上,Kibana為Elasticsearch添加了可視化層,提供Web儀表板,用于探究和分析數據。儀表板可以圍繞定制搜索來構建,并與團隊共享,提供了一種快速、易于理解的開發運營信息源。
Ansible
管理服務器配置是管理現代數據中心或云基礎設施的任何開發運營方法的一個關鍵部分。配置管理工具采用了期望狀態的方法,簡化云級別系統管理,使用服務器和應用程序的描述來處理服務器和應用程序的部署。
Ansible提供了極簡的管理服務,使用SSH來管理Unix節點,使用PowerShell與Windows服務器協同運行,無需部署代理。Ansible Playbook用YAML描述服務器或服務的狀態,將Ansible模塊部署到處理配置的服務器,一旦服務運行起來,就刪除模塊。你可以使用Playbook來編排任務,比如說使用一個腳本來部署多個Web端點。
可以讓模塊創建和Playbook交付成為持續交付過程的一部分,并使用構建工具來提供配置、實現部署自動化。 Ansible可以匯集來自云服務提供商的信息,簡化虛擬機和網絡的管理。Ansible中的監控工具能夠自動觸發額外的部署,幫助管理和控制云服務,還竭力管理Hadoop等大規模數據平臺所使用的資源。
Jenkins
做好持續交付不僅僅需要一種井然有序的方法來處理開發,還需要管理測試和構建的工具。這時候,Jenkins持續集成服務器應運而生。Jenkins與你選擇的源代碼控制、測試工具以及構建服務器協同運行。它是個靈活的工具,最初用來與Java協同運行,現在已擴大到可支持Web開發和移動開發,甚至可以構建Windows應用程序。
把Jenkins比作交換網絡可能最恰當,讓文件通過測試和構建過程,并回應來自所使用的各個工具的信號――這歸功于1000多個插件組成的龐大庫。這些包括將Jenkins與本地Git實例和GitHub整合起來的工具,那樣可以將持續開發模式擴展到你的構建和交付過程。
使用Jenkins之類的自動化工具不僅要奉行一種理念,還要實施構建過程。一旦你致力于持續集成作為持續交付模式的一部分,只要代碼分發給源代碼控制版本分支,你就要運行測試和構建周期,一旦代碼進入到主分支,就要分發給用戶。
Node.js和io.js
現代云應用程序使用不同于我們熟悉的n層企業和Web應用程序的設計模式構建而成。它們是分布式、事件驅動的服務組合,這些服務可迅速擴展,并支持成千上萬個并發用戶。Node.js就是采用這種新模式的一項關鍵技術,它被許多主要的云平臺所使用,易于安裝,成為云基礎設施上瘦服務器或容器的一部分。
Node.js大獲成功,關鍵是Npm程序包格式,它讓你可以迅速安裝核心Node.js服務的擴展件。這包括Express和Seneca等框架,這些框架有助于構建可擴展的應用程序。中央注冊中心處理程序包分發,依賴項自動安裝。
雖然io.js分支暴露了項目管理方面的問題,但是它也讓一組開發人員得以積極地將ECMAScript 6支持功能添加到與Npm兼容的引擎中。兩支團隊協調后,Node.js的和io.js代碼庫已合并,現在新版本來自io.js代碼庫。
明年,其他分支可能會重新并入到主分支,比如微軟的io.js分支增加了對64位Chakra JavaScript引擎以及谷歌V8的支持,從而讓Node.js的平臺不斷發展,鞏固其作為云級別微服務首選主機的地位。
Seneca
Seneca微服務框架的開發人員有句座右銘:“現在構建,以后擴展”。對任何想開發微服務的人來說,這句格言再恰當不過了,因為它讓你可以從小處做起,然后隨著服務增多,逐步添加功能。
從本質上講,Seneca實施了對象/消息(actor/message)設計模式,專注于使用Node.js作為交換引擎:獲取消息后,處理其內容,然后發送適當的響應,無論是發給消息始發者還是另一個服務。由于專注于與業務用例相對應的消息模式,拿來Seneca后,比較容易為你的應用程序迅速構建極簡的可行產品。插件架構讓你很容易將Seneca與其他工具集成起來,迅速為服務添加功能。
應用程序的要求提高或有變時,可以迅速為代碼庫添加新的模式,或者把現有模式分解成不同的服務。一個模式還可以調用另一模式,以便迅速重復使用代碼。還很容易將Seneca添加到消息總線,那樣可以把它用作一個框架,處理來自物聯網設備的數據,因為你只需要定義監聽端口,監視JSON數據在哪里提供。
服務可能不具有持續性,Seneca為你提供了這個選擇:使用內置的對象關系映射層來處理數據抽象,并提供了常用數據庫的插件。
.Net Core和ASP.Net vNext
微軟開放了.Net的源代碼,此舉無異于公開了該公司的這個Web平臺的大部分代碼。新的.Net Core版本可以在Windows、OS X和Linux上運行。.Net Core目前從微軟的Codeplex代碼庫遷移到了GitHub,為.Net提供了一種更模塊化的方法,讓你可以在需要時,安裝所需的功能。
ASP.Net 5目前處于開發之中,這個Web平臺的開源版本可在.Net Core上運行。你可以使用微軟的MVC 6框架,將它作為Web應用程序的基礎。還支持新的SignalR庫,這些庫增添了對WebSockets及其他實時通信協議的支持。
如果你計劃使用微軟的新款Nano服務器,就要使用.Net Core編寫代碼,因為它是為瘦環境設計的。新的DNX是.Net執行環境,簡化了將ASP.Net應用程序部署到眾多平臺上的任務,還有用于包裝代碼、在主機上啟動運行時環境的工具。特性可使用NuGet程序包管理器來添加,讓你可以只要使用所需的庫。
微軟的開源.Net還很年輕,但是微軟已承諾確保它取得成功。微軟自己的下一代服務器操作系統支持開源.Net,這意味著它在數據中心和云都有一席之地。
GlusterFS
GlusterFS是一個分布式文件系統。Gluster把各種存儲服務器聚合到一個龐大的并行網絡文件系統。你甚至可以用它來代替Hadoop集群中的HDFS,或者代替成本高昂的存儲區域網(SAN)系統,或者同時代替兩者。雖然HDFS很適合Hadoop,但有一個不需要將數據傳輸到另一處來分析的通用分布式文件系統是一大優勢。
在當下商品化硬件、商品化計算以及對性能和延遲要求更高的時代,購買又大又貴的EMC SAN,希望它能滿足所有要求(自然滿足不了)不再是你唯一切實可行的選擇。GlusterFS在2011年被紅帽收購。