漫話docker的衰落與kubernetes的興起

本文首發在OPPO互聯網公眾號,歡迎點擊轉載 //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的發展與各個公司的實踐經驗了,這時候的docker真的是風頭無兩。

生來巨人——kubernetes

時間到了2015年,此時我轉而負責進行CaaS(Container as a Service)服務的調研。這時候大家都在說CaaS,但是每個人說的都不一樣,其實大家都是摸著石頭過河。在此期間,以研究OpenStack的magnum為契機,我接觸到了swarm和kubernetes。

swarm

swarm是docker公司力推的集群管理方案。docker、swarm和compose組成的三劍客完整覆蓋了運行時、集群管理與編排,構成了一個看起來牢不可摧的生態系統。特別是別出心裁的將swarm的api與docker的api進行了拉齊,將集群的管理複雜度與單節點的管理複雜度向用戶進行屏蔽,倒是有一種如臂使指的快感。這個設計直到現在我都還覺得立意真的很精巧。

kubernetes

而初出茅廬的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等標準則顯得曲高和寡。

k8s

與此同時,kubernetes並沒有放棄主動的進攻。kubernetes的強勢和扶植其他容器運行時加速了docker的衰落。在1.6版本棄用docker manager直連docker,轉向CRI + dockershim的組合時,就註定了kubernetes會走到完全解耦docker,也就是今天這一步。與此同時,其他容器運行時也開始了瓜分市場份額。如果說gVisor、Kata只是嘗試挑戰docker在部分場景中的地位,那麼紅帽的Podman則已經吹響了全面進攻的號角。再結合前兩年docker的一些融資和收購傳聞,平添了一種英雄末路、美人遲暮的傷感。

世間多少英雄戲,每到收場總傷神

六年回望,其實無論是在當時還是現在來看,docker都是一個革命性的產品。docker的衰落並不是意味著容器運行時不重要了,而是大家越來越習以為常了。時至今日,容器運行時作為一個大部已經被解決的問題,一個相對成熟的模組,已經成為了整個基礎架構體系的一部分。而作為上層的平台和更為上層的用戶來說,對此將會給予越來越少的關注。這就像現在大多數用戶並不會去關心內核了一樣。甚至在未來,我預測運行時都有可能會成為一個內核級別的附屬模組,會預裝到許多的發行版上,其運行也逐漸對大多數用戶變得更加透明(實際紅帽已經開始向這個方向做了)。而越來越多的用戶則會將更多的注意力集中在上層的交付、管理、編排上。至於kubernetes會不會衰落,我覺得在中短期內(五年內)不會。kubernetes已經成為了一個平台級的項目。在這點上,kubernetes作為平台將比工具性質的docker具有更強的生命力。