100個容器周邊項目,點亮你的容器集群技能樹
大規模的容器技術運用從來不是一項獨立工程,而是一個匯集虛擬化技術、容器編排、任務調度、操作系統、容器倉庫、跨節點網絡、分布式存儲、動態擴縮、負載均衡、日誌監控、故障自恢復等系統性難題的復雜有機體。隨著Docker的誕生和Google等互聯網公司的推波助瀾,這個領域出現了一大批優秀的開源項目,它們在簡化容器技術使用成本的同時,也經常使得剛剛接觸容器時間不太長的開發者和企業用戶感到不知所措。
將知識分類是梳理零散信息的一種有效方式。對於容器技術的生態圈來說,其中涉及領域眾多,有的項目橫跨多個細分領域,有的項目則是針對特定場景需求定制的,難以對其功能類型做精確定義。不過,若僅考慮通用領域裏的相關產品和工具,大致來說可以劃分成14種主要類別。
以下將圍繞容器生態,分別舉例介紹這些類別中的典型開源項目,以及部分雖未開源但比較常用的100個周邊產品。
1. 容器引擎
容器引擎是容器集群生態圈的核心部分,它是與內核Namespace和CGroup等功能直接交互,並提供相應API使得外部能夠與之集成的工具或服務。Docker無疑是目前為止最成功、廣泛最使用的容器引擎之一。實際上從1.12版本以後,Docker的容器化功能已經由獨立的項目RunC來實現,但Docker仍作為一個開源產品為用戶提供完整的容器化解決方案。此外,社區中還有許多容器引擎項目,例如:
001. Docker:https://www.docker.com
002. Rkt:https://coreos.com/rkt
003. Systemd-nspawn:https://www.freedesktop.org/wiki/Software/systemd
004. Hyper:https://hyper.sh
005. Garden:https://github.com/cloudfoundry/garden
006. LXC:https://linuxcontainers.org
007. Photon:https://github.com/vmware/photon
008. Vagga:https://github.com/tailhook/vagga
009. gVisor:https://github.com/google/gvisor
010. Pouch:https://github.com/alibaba/pouch
這些項目只是眾多支持不同平臺和具有不同特性的容器引擎的冰山一角。例如Google曾經主導的lmctfy(http://lmctfy.io/)項目也是個十分優秀的容器引擎,然而該項目自2015年以後就不再被維護了。而最近Google剛剛開源的gVisor則是該領域中的新秀。另外值得一說的是,Hyper采用虛擬機的方式對環境進行隔離,並不是一種基於容器的隔離方案,但它能很好地與Docker或Kubernetes等容器集群技術相結合,取代其環境隔離的功能,因此也歸屬此列。
2. 監控和數據收集
由於容器基於內核的特殊隔離方式,對容器性能和狀態的監控與虛擬機存在一些差別。傳統的虛擬機監控工具,例如Nagios和Zabbix等,對容器監控的原生支持並不十分易用。而一些新起的開源項目對這種場景具有更友好的體驗,例如:
011. cAdvisor:https://github.com/google/cadvisor
012. Sysdig:http://sysdig.org
013. Prometheus:https://prometheus.io
014. TICK-Stack:https://influxdata.com
015. Docker-Alertd:https://github.com/deltaskelta/docker-alertd
016. Grafana:https://grafana.com
其中的TICK-Stack指的是Influxdata推出的Telegraf、InfluxDB、Chronograf、Kapacitor四款開源工具,不過從1.0以後,這些工具在開源版基礎上提供了企業版本,後者提供了例如高可用、雲端存儲等企業級功能。
3. 容器管理和界面工具
可視化是用戶友好性十分重要的一部分,Shipyard和Decking是Docker早期時十分受歡迎的可視化工具,之後Docker也收購了Kitematic作為官方的容器管理UI。但隨著容器應用集群化,早期的UI工具不再流行,一些針對特定集群平臺定制的新型管理UI開始出現。例如Kubernetes官方推出了Dashboard項目用於可視化的管理集群,Cockpit則是紅帽公司推出的Kubernetes集群管理界面。以下是其中一些開源的容器管理UI項目:
017. Kitematic:https://kitematic.com
018. DockerUI:https://github.com/crosbymichael/dockerui
019. Panamax:http://panamax.io
020. Rapid Dashboard:https://github.com/ozlerhakan/rapid
021. Cockpit:http://cockpit-project.org
022. Portainer:https://www.portainer.io
023. Shipyard:http://shipyard-project.com
024. Seagull:https://github.com/tobegit3hub/seagull
025. Dockeron:https://github.com/dockeron/dockeron
026. DockStation:https://dockstation.io
4. 基礎設施集成
容器集群的實施是需要以硬件基礎設施作為依托的,有些輔助工具能夠簡化這個過程。這些項目往往與具體的底層平臺相關,例如:
027. Nova-docker:https://github.com/stackforge/nova-docker
028. Magnum:https://github.com/openstack/magnum
029. Machine:https://docs.docker.com/machine
030. Boot2Docker:https://github.com/boot2docker/boot2docker
031. Clocker:https://github.com/brooklyncentral/clocker
032. MaestroNG:https://github.com/signalfuse/maestro-ng
Nova-docker和Magnum都是在OpenStack集成容器集群的項目,不過目前OpenStack官方正在嘗試通過讓Kubernetes直接創建虛擬機的方式來統一它在IaaS層和CaaS層的差異,其中的Nova-docker已經被廢棄了。Machine是Docker公司推出的基礎設施管理工具,Boot2Docker曾經是在Windows和Mac上使用Docker的官方方案,但隨著Docker 1.12版本發布了多種操作系統的發行版後,已經不再被推薦使用了。
5. 編排和調度
編排和調度是容器集群的基本功能,因此選擇編排和調度工具實際上就是在選擇容器集群的方案。以下是一些開源的容器任務編排調度工具:
033. SwarmKit:https://github.com/docker/swarmkit
034. Kubernetes:http://kubernetes.io
035. Marathon:https://github.com/mesosphere/marathon
036. Rancher:http://www.rancher.io
037. Nomad:https://github.com/hashicorp/nomad
038. OpenShift:https://www.openshift.com
039. Crane:https://github.com/michaelsauter/crane
040. Nebula:https://github.com/nebula-orchestrator
041. GearD:http://openshift.github.io/geard
其中的OpenShift主要是指其3.0之後的發行版,它是紅帽公司基於Kubernetes二次開發的集持續集成和交付於一體的容器集群方案,具有開源和商業兩個版本。
6. 容器鏡像倉庫
鏡像倉庫是基於容器的在軟件發布流程中必要的組成部分,Docker開源了其鏡像倉庫的最小實現,但對於企業級應用來說,它缺少了高可用、權限控制、管理界面等必要功能。Docker Hub和國內的許多容器雲平臺都提供了公有雲的企業級倉庫服務,社區中也有一些容器倉庫的開源或免費的實現,例如:
042. Repository:https://github.com/docker/distribution
043. Nexus:http://www.sonatype.org/nexus
044. Habor:http://vmware.github.io/harbor
045. Portus:https://github.com/SUSE/Portus
046. Docker Registry UI:https://github.com/atcol/docker-registry-ui
047. Dragonfly:https://github.com/alibaba/Dragonfly
其中的Nexus是一種通用的軟件包倉庫解決方案,支持包括Maven、NPM、PIP、RPM等許多主流打包格式的分發和管理,它是在3.0以後的版本中開始支持作為Docker鏡像倉庫的。VMWare推出的Habor是目前相對常用的企業級開源Docker倉庫解決方案。Portus和Docker Registry UI是基於官方Repository鏡像倉庫的界面化管理工具。Dragonfly是一款P2P協議的鏡像分發工具,並非直接提供鏡像存儲功能,但也屬於倉庫輔助類的工具。
7. 服務發現和容器域名服務
服務發現和域名服務實際上是微服務架構和容器集群的調度工具所需的組件,它們在容器集群中十分常見,也是這個生態圈中舉足輕重的一部分,以下是其中一些在實際工程中被提及較多的工具:
048. Etcd:https://github.com/coreos/etcd
049. Consul:http://www.consul.io
050. ZooKeeper:https://zookeeper.apache.org
051. Eureka:https://github.com/Netflix/eureka
052. Traefik:https://traefik.io
053. Muguet:https://github.com/mattallty/muguet
054. Registrator:https://github.com/gliderlabs/registrator
055. SkyDNS:https://github.com/skynetservices/skydns
8. 容器日誌收集處理
和容器集群的監控一樣,收集容器中的服務運行日誌與虛擬機中的方式同樣存在許多差異。目前Docker直接通過插件能夠支持的日誌收集工具包括Rsyslog、Splunk和Fluentd,雖然FileBeat不在此列,但由於其小巧便捷的部署機制,也得到了許多用戶青睞。一些過去用於虛擬機的日誌收集器,比如LogStash或Flume,同樣能夠使用與容器中的服務,但它們都不再是首選的方案。
056. Splunk:https://www.splunk.com
057. Fluentd:https://www.fluentd.org
058. ElasticStack:https://www.elastic.co
059. Flume:https://flume.apache.org
060. Rsyslog:https://www.rsyslog.com/
ElasticStack是Beats、Logstash、ElasticSearch和Kibana四款開源項目的統稱,這是一套十分流行的日誌匯聚、處理、存儲和展示的工具組合。其中的ElasticSearch和Kibana也可以與Fluentd配合,形成端到端日誌處理方案。另外值得指出的是,Splunk並不是開源或免費的,但它在企業級日誌處理方案中的應用十分廣泛。
9. 容器相關的系統發行版
有些Linux發行版是為容器運行而優化的,Atomic和ClearLinux系統都屬於此類。另一些Linux發行版在設計之初就充分地將容器機制融入了系統的架構理念,例如CoreOS。有的系統甚至將Docker作為系統的核心服務來管理其他用戶進程,例如RancherOS和Hyper容器引擎所使用的操作系統。類似的項目還有許多,它們都是架設容器集群時十分稱手的基礎設施,例如:
061. Container Linux:http://coreos.com
062. Project Atomic:http://www.projectatomic.io
063. RancherOS:http://rancher.com/rancher-os
064. ClearLinux:https://clearlinux.org
065. Photon OS:https://vmware.github.io/photon
066. CargoOS:https://cargos.io
067. SmartOS:https://www.joyent.com/smartos
10. 容器平臺
容器平臺是大規模容器運用的產物,它通常會與持續集成、持續交付的工具結合,成為連接上層應用服務和底層基礎設施、幫助使用者快速實現從代碼提交到產品上線全過程的端到端交付過程。以下是其中一些相關的開源項目:
068. Deis:https://deis.com
069. Flynn:http://flynn.io
070. Dokku:https://github.com/progrium/dokku
071. Fabric8:http://fabric8.io
072. Kel:http://www.kelproject.com
073. Nanobox:https://nanobox.io
074. Tsuru:https://tsuru.io
除了這些開源的容器平臺服務實現之外,互聯網上還有許多在線按量付費的容器即服務平臺,它們也是整個容器集群生態的一部分。
11. 容器網絡
容器技術在解決環境隔離和配額問題的同時,也引入了網絡層面的復雜性。由於使用了Network Namespace,每個容器都可以獲得獨立的IP地址,這對於單個主機的情況並無大礙,但對於容器集群的情況,IP地址的分配和互聯就成為了新的問題。因此在設計容器集群時,通常需要專門為網絡的連接方式加以考慮。常用的開源方案例如:
075. Libnetwork:https://github.com/docker/libnetwork
076. Flannel:https://github.com/coreos/flannel
077. Calico:http://www.projectcalico.org
078. Weave:https://github.com/zettio/weave
079. Romana:http://romana.io
080. Canal:https://github.com/projectcalico/canal
081. Open vSwitch:http://openvswitch.org
082. Pipework:https://github.com/jpetazzo/pipework
這些網絡方案大多采用了七層網絡的Overlay Network方式,也就是在容器之間通信的網絡包上封裝了用於路由尋址的額外包頭,這種方式會導致網絡通信效率的下降,具體影響程度與所封裝的額外數據大小有關。而Calico采用修改每個主機節點上的IPtables和路由表規則實現容器間數據路由和訪問控制,屬於三層網絡的方式,這種方案在節點規模不太大(最多幾百個節點)時的效率優勢十分明顯,是一種比較受推薦的容器網絡工具。除了這些較常用的方案外,一些條件允許的企業也會結合MacVLAN等二層網絡方案實現容器的互聯,以獲得更好的網絡性能。
12. 容器安全
容器安全性問題的根源在於容器和宿主機共用內核,因此受攻擊的面特別大。另外,如果容器裏的應用導致Linux內核崩潰,整個宿主機系統都會崩潰,這一點與虛擬機是不同的。此外,鏡像的安全性也是容器安全的一部分,如何保障用戶下載的鏡像是可信的、未被篡改過的,以及如何保證鏡像中不會意外包含具有大量漏洞的老舊軟件都是需要考慮的問題。目前這些安全課題主要在一些企業級應用中引起較多重視,下面是一些相關的開源工具和項目:
083. Notary:https://github.com/docker/notary
084. Clair:https://github.com/coreos/clair
085. AppArmor:http://wiki.apparmor.net/index.php/Main_Page
086. SELinux:https://selinuxproject.org
087. Twistlock:https://www.twistlock.com
088. OpenSCAP:https://github.com/OpenSCAP/container-compliance
13. 容器數據持久化
容器是一種不可變的基礎設施,容器的數據應該通過Volume的方式保存到外部的介質上,容器持久化存儲本質上就是要解決如何簡便地將外部存儲掛載到容器中使用的問題。Docker在1.9版本後提供了存儲的插件,這也為許多存儲方案提供了便利,以下列舉幾個例子:
089. Flocker :https://github.com/clusterhq/flocker
090. Convoy:https://github.com/rancher/convoy
091. REX-Ray:https://github.com/codedellemc/rexray
092. Netshare:https://github.com/ContainX/docker-volume-netshare
093. OpenStorage:https://github.com/libopenstorage/openstorage
其中Ceph是通用的網絡存儲工具,同時提供塊存儲和對象存儲能力,對容器化場景下的應用數據持久化具有良好的支持。
14. 容器相關開發流程工具
容器的鏡像可以被看作一種新型的應用打包方式,因此容器常常與軟件的開發和持續集成、持續交付流程相結合,提供不同環境一致性部署能力。以下是一些利用容器改善軟件開發和交付的工具或平臺:
094. Drone.io:https://drone.io
095. Shippable:http://shippable.com
096. Cyclone:https://github.com/caicloud/cyclone
097. Screwdriver:http://screwdriver.cd
098. WatchTower:https://github.com/v2tec/watchtower
099. Wercker:http://wercker.com
100. Totem:http://totem.github.io
以上內容節選自近期剛剛面市的新書《容器即服務:從零構建企業級容器集群》,這是一本迄今為止最完整闡述容器集群技術及其周邊生態體系的著作。其作者是來自阿裏巴巴的一線技術專家,也一名從Lxc-Docker(最早的Docker 0.x版本)時期就開始在項目中運用容器的一線技術咨詢師,目睹了容器技術從興起到成熟的整個過程,在一次次的技術選型和實踐裏,親身經歷各類相關開源項目的大坑小窪,並多次在技術大會上進行過演講分享(比較大型的會議包括2015年的CNut全球容器技術大會、2016年的CSDN架構技術實戰峰會、2017年的CNut全球運維技術大會等)。全書分為8個章節,不僅囊括當前排名最靠前的4大主流開源容器集群方案,同時介紹了許多容器相關項目的技術選型和原理細節,具體目錄列舉如下:
第1章 容器集群綜述
第2章 SwarmKit 集群解決方案
第3章 Kubernetes 集群解決方案
第4章 Mesos 集群解決方案
第5章 Rancher 集群解決方案
第6章 容器集群的網絡和存儲
第7章 容器服務的基礎設施
第8章 容器技術新風向
學會一項技術很快,但學懂一門技術則需要時間的積累,做到知其然並知其所以然是一段辛苦而快樂的過程。願《容器即服務:從零構建企業級容器集群》能夠為你的容器學習之路鋪上一塊穩固的基石。
原文鏈接
100個容器周邊項目,點亮你的容器集群技能樹