本文首發在OPPO網際網路公眾號,歡迎點選轉載 https://mp.weixin.qq.com/s/wBC4CgAzXeTNURa1YdYmIQ。
伴隨著kubernetes 1.20中對於docker的棄用,關於docker的滅亡與kubernetes的興起的話題再度熱了起來。討論中關於docker滅亡的觀點我不敢苟同。docker還遠未到達滅亡的程度。相較而言,我覺得更恰當的說法應該是docker的衰落。本文我也就我個人的角度,聊聊我所經歷的docker的衰落與kubernetes的興起。
橫空出世——docker的興起
第一次接觸docker,是2014年。當時OpenStack的主要負載還是kvm。而我們也嘗試過了更為輕量的lxc,但是以失敗而告終了。docker這個集裝箱的小圖示配上docker container的理念,一下子就吸引住了大家的目光。經歷過製作lxc映象的痛苦,你就會更體會到docker的可貴。繁瑣的lxc映象製作與精簡的Dockerfile相比,孰高孰低、孰優孰劣可謂是一目瞭然。
docker成功的將cgroup、union filesystem、namespace這些較為穩定和成熟的技術結合了起來,輔以docker image的製作工藝,實現了集裝箱式的標準交付。這時候的docker,頗有種“舉天下之豪傑而莫能與之爭”的氣勢。雖然在生產環節還是或多或少,還有這樣那樣的問題,但是docker已經跨過了POC(Proof of concept)階段,進入了pre-product的行列了。在對docker深度定製後,最終我們團隊也將OpenStack + docker的組合成功推向了生產。
那兩年,知不知道docker、會不會做映象、懂不懂docker原理成為基礎架構領域面試的常見話題。雖然只有少數幾個公司敢為天下先,將docker搬上了生產,但是已經沒有人可以忽略這顆冉冉升起的新星了。那兩年,活躍在各個會議、論壇上的都是docker的話題。大家熱衷於討論生產上docker遇到的坑。大家各出奇招,修修補補,跌跌撞撞,docker總算也是被搬上了生產。而在這時,即使是技術保守、持徘徊觀望態度的公司,也都會安排一些人力著手跟進docker的發展與各個公司的實踐經驗了,這時候的docker真的是風頭無兩。
生來巨人——kubernetes
時間到了2015年,此時我轉而負責進行CaaS(Container as a Service)服務的調研。這時候大家都在說CaaS,但是每個人說的都不一樣,其實大家都是摸著石頭過河。在此期間,以研究OpenStack的magnum為契機,我接觸到了swarm和kubernetes。
swarm是docker公司力推的叢集管理方案。docker、swarm和compose組成的三劍客完整覆蓋了執行時、叢集管理與編排,構成了一個看起來牢不可摧的生態系統。特別是別出心裁的將swarm的api與docker的api進行了拉齊,將叢集的管理複雜度與單節點的管理複雜度向使用者進行遮蔽,倒是有一種如臂使指的快感。這個設計直到現在我都還覺得立意真的很精巧。
而初出茅廬的kubernetes也來勢洶洶。背靠Google的大旗,有Borg的背書,kubernetes在氣勢上一點不輸swarm + compose的組合。伴隨著kubernetes 1.0的釋出,kubernetes也從幕後走向了臺前,開始大規模接受來自全世界的PR提交,在功能、效能和穩定性上快速提升。
到kubernetes 1.2版本,經過我們內部評估,已經具備生產級的品質。而宣告式API、簡潔的架構、靈活的標籤等優秀的設計,在做選型時已經讓我們完全沒有理由拒絕。而後經過數月緊張的開發,kubernetes + docker的組合被搬上了舞臺,並且以極快的速度侵蝕OpenStack + docker的份額。此時的docker已經開始被限制為了容器的執行時和映象製作工具。捆住了docker的手腳,kubernetes已經沒有了可以掰手腕的對手,一統江湖的路上kubernetes再無障礙。
美人遲暮——docker的衰落
時至今日,docker的衰落已經成為了不爭的事實。而docker的衰落我覺得是多方面的原因。一部分是docker自身的封閉和固執己見。我曾經記得在當時參與了當時社群多個PR的討論。新增一個feature的超長的週期,已經可以磨掉多數人的耐心。docker社群在多個觀點上略顯保守的方式,讓大家逐漸失去了參與的熱情。
另一方面,也是更為重要的一點,是容器技術本身的門檻已經被突破,已經無法形成技術上的護城河。而對於容器技術之爭,已經轉化為標準之爭。而對於標準上更有發言權的一方,無疑是具有更多使用者、更龐大社群和更強大的平臺的一方。在短短兩三年的時間內,天平就快速地向kubernetes傾斜,其主導的CRI、CNI、CSI標準已經成為了事實上的通行標準。而相較之下,docker力推的CNM等標準則顯得曲高和寡。
與此同時,kubernetes並沒有放棄主動的進攻。kubernetes的強勢和扶植其他容器執行時加速了docker的衰落。在1.6版本棄用docker manager直連docker,轉向CRI + dockershim的組合時,就註定了kubernetes會走到完全解耦docker,也就是今天這一步。與此同時,其他容器執行時也開始了瓜分市場份額。如果說gVisor、Kata只是嘗試挑戰docker在部分場景中的地位,那麼紅帽的Podman則已經吹響了全面進攻的號角。再結合前兩年docker的一些融資和收購傳聞,平添了一種英雄末路、美人遲暮的傷感。
世間多少英雄戲,每到收場總傷神
六年回望,其實無論是在當時還是現在來看,docker都是一個革命性的產品。docker的衰落並不是意味著容器執行時不重要了,而是大家越來越習以為常了。時至今日,容器執行時作為一個大部已經被解決的問題,一個相對成熟的模組,已經成為了整個基礎架構體系的一部分。而作為上層的平臺和更為上層的使用者來說,對此將會給予越來越少的關注。這就像現在大多數使用者並不會去關心核心了一樣。甚至在未來,我預測執行時都有可能會成為一個核心級別的附屬模組,會預裝到許多的發行版上,其執行也逐漸對大多數使用者變得更加透明(實際紅帽已經開始向這個方向做了)。而越來越多的使用者則會將更多的注意力集中在上層的交付、管理、編排上。至於kubernetes會不會衰落,我覺得在中短期內(五年內)不會。kubernetes已經成為了一個平臺級的專案。在這點上,kubernetes作為平臺將比工具性質的docker具有更強的生命力。