Categories
程式開發

解讀容器的2019:把“以應用為中心”進行到底


2019 年,整個IT 領域發生了許多深刻而又復雜的變化,InfoQ 策劃了“解讀2019”年終技術盤點系列文章,希望能夠給讀者清晰地梳理出技術領域在這一年的發展變化,回顧過去,繼續前行。本文是 InfoQ“解讀 2019”年終技術盤點系列文章之一。

2019 年,雲原生生態少了以往的“劍拔弩張”與“針鋒相對”;但這一年,卻也是雲原生最蓬勃發展的一年。

解讀容器的2019:把“以應用為中心”進行到底 1

在這一年,這個生態具有標誌性意義的KubeCon,史無前例的吸引到了一萬兩千人湧入聖地亞哥,整個會議的讚助商列表,多到一張十餘米長的巨幅海報才堪堪放下。在這一年,Kubernetes 終於成為了廣受認可的基礎設施領域工業標準,而這個標準的確立,則以 AWS 的重量級投入畫上了圓滿的句號。在這一年,在社區頭部參與者的持續推進下,“規模”與“性能”終於成為了Kubernetes 項目的重要關鍵詞,這不僅真正意義上打通了Kubernetes 在企業生產環境中大規模落地的最後一公里,也讓Kubernetes 第一次成為了“雙十一”等頂級互聯網規模化場景中實實在在的技術主角。

在下一個十年交替之際,你是否知道,這個看似波瀾不驚的雲原生技術生態,又在孕育和經歷著哪些全新的變革呢?

規模:Kubernetes 項目的新名片

如果要提名 2019 年的雲原生技術演進的重要節點,那麼“規模”一定是其中最當仁不讓的關鍵詞。

出於設計理念上的側重點考慮,Kubernetes 項目在過去乃至到 2019 年之前的很長一段時間內,也並不把“規模”作為整個項目演進的核心優先級來對待。這裡的主要原因在於Kubernetes 的設計思想是“以應用為中心”的基礎設施,所以相比於傳統作業編排調度管理項目(比如Mesos 和Yarn 等)關注的資源效能問題,Kubernetes 的核心競爭力則一直放在工作負載描述、服務發現、容器設計模式等更高緯度的應用基礎設施構建上。當然,另一方面的原因在於,對於Kubernetes 服務提供商,比如 GKE 來說,他們對於規模與性能訴求也是比較有限的。

這個狀態,隨著 2019 年初頂級互聯網公司對 Kubernetes 社區的重量級投入而被打破。事實上,Kubernetes 本身的規模與性能優化並不是一個“不可解”的問題,但是整個社區長期以來欠缺大規模場景和專門的工程力量投入,最終使得發現、診斷和修復整個容器編排與管理鏈路中各個性能障礙成了一個遙不可及的事情。

在這條關鍵鏈路當中, Kubernetes 的規模性問題又可以細分為:以etcd 為代表的“數據面”、以kube-apiserver 為代表“管控面”和以kubelet 及各種Controller 組成的“生產/消費面”三個問題域。在場景的推動下,Kubernetes 以及 etcd 社區在過去的一年裡,正是圍繞這三個問題域進行了大量的優化,例如:

數據面:通過優化 etcd 底層數據庫的數據結構和算法,將 etcd 百萬鍵值對隨機寫性能提升 24 倍;

管控面:為 kube-apiserver 添加 Bookmark 機制,將 APIServer 重啟時需要重新同步的事件降低為原來的 3%,性能提高了數十倍;

生產/消費面:將 Kubernetes 節點向 APIServer 的心跳機制從“定時發送”修改為“按需發送”,從而大大減少了規模化場景下 kubelet 對 APIServer 帶來的巨大壓力,大幅提高了 Kubernetes 所能支持的節點數目上限。

除此之外,在規模化 Kubernetes 落地的具體場景中,圍繞著上述三個問題域、在生產環境中經歷了充分驗證的規模與性能優化實踐也在 KubeCon 等技術演講中浮出水面。比如:如何讓多個kube-apiserver 更均衡的處理生產/消費請求、避免性能熱點;如何通過合理的設置主備Controller,讓升級Controller 時無需大量重新同步數據,從而降低controller 恢復時對API Server 的性能衝擊等等。

這些 Kubernetes 規模與性能領域的“全鏈路優化”工作,幾乎全部源自於真實的互聯網級規模化場景,而它們最終完成的得益於頂級開源社區的協同與所有參與者的共同努力。而規模化與性能問題的逐步解決不僅僅帶來了為 Kubernetes 項目帶來了充足的底氣,也正在迅速改變著整個基礎設施領域的基本格局。

2019 年 5 月,Twitter 公司在舊金山總部正式宣布 Twitter 的基礎設施將從 Mesos 全面轉向 Kubernetes。這個新聞彷彿給當時略顯沉悶的技術社區里扔進了一顆重磅炸彈一般,一時間傳言四起。

事實上,早在一年前,Twitter 公司的工程師就已經成為了灣區“大規模集群管理小組( CMWS, Cluster Mgmt at Web Scale)”裡的重要成員和分享常客。 CMWS 是一個專門針對大規模場景下的集群管理問題而成立的閉門組織,其創始成員包括了阿里巴巴、Pinterest、Linkedin、Netflix、Google、Uber、Facebook、Apple 等一大批全球頂級技術公司。該小組成員會在每個月舉行閉門 Meetup,圍繞具體的議題進行深度技術分享和交流,推動小組成員更快更好的在互聯網場景中落地 Kubernetes 技術體系。眾所周知,出於規模和性能的考慮,灣區的互聯網公司一直以來都是 Mesos 項目的重度用戶,而此次 Twitter 的轉變,實際上只是 CMWS 小組成員中的一位而已。

雲原生的本質與誤區

儘管一路高歌猛進,但其實哪怕在 2019 年,還是有很多人對“雲原生”充滿了疑惑甚至誤解。這想必也是為何,我們一直能夠在不同的場合聽到關於雲原生的各種不同的定義。有人說,雲原生就是Kubernetes 和容器;也有人說,雲原生就是“彈性可擴展”;還有人說,雲原生就是Serverless;而後來,有人乾脆做出判斷:雲原生本身就是“哈姆雷特”,每個人的理解都是不一樣的。

實際上,自從這個關鍵詞被 CNCF 和 Kubernetes 技術生態“借用”之初,雲原生的意義和內涵,就是非常確定的。在這個生態當中,雲原生的本質是一系列最佳實踐的結合;更詳細的說,雲原生為實踐者指定了一條低心智負擔的、能夠以可擴展、可複制的方式最大化地利用雲的能力、發揮雲的價值的最佳路徑。

所以說,雲原生並不指代某個開源項目或者某種技術,它是一套指導軟件與基礎設施架構設計的思想。這里關鍵之處在於,基於這套思想構建出來的應用和應用基礎設施,將天然能夠與“雲”天然地集成在一起,將“雲”的最大能力和價值發揮出來。

這種思想,以一言以蔽之,就是“以應用為中心”。

正是因為以應用為中心,雲原生技術體系才會無限強調讓基礎設施能更好的配合應用、以更高效方式為應用“輸送”基礎設施能力,而不是反其道而行之。而相應的, Kubernetes 、Docker、Operator 等在雲原生生態中起到了關鍵作用的開源項目,就是讓這種思想落地的技術手段。

以應用為中心,是指導整個雲原生生態和 Kubernetes 項目蓬勃發展至今的重要主線。

“下沉”的應用基礎設施能力與 Service Mesh

帶著這樣一條主線,我們回過頭來重新審視 2019 年雲原生生態的技術演進,會稍微清晰一些。

大家可能聽說過,在這次以 Kubernetes 為代表的基礎設施領域的演進過程中,總是伴隨著一個重要的關鍵詞,那就是應用基礎設施能力的“下沉”。

在過去,我們編寫一個應用所需要的基礎設施能力,比如,數據庫、分佈式鎖、服務註冊/發現、消息服務等等,往往是通過引入一個中間件庫來解決的。這個庫,其實就是專門的中間件團隊為你編寫的服務接入代碼,使得你可以在不需要深入了解具體基礎設施能力細節的前提下,以最小的代價學習和使用這些基礎設施能力。這其實是一種樸素的“關注點分離”的思想。不過更確切的說,中間件體系的出現,並不單單是要讓“專業的人做專業的事”,而更多是因為在過去,基礎設施的能力既不強大、也不標準。這就意味著,假如沒有中間件來把這些的基礎設施細節給屏蔽掉、把接入方式統一掉,業務研發就必須“被迫營業”,去學習無數晦澀的基礎設施API 和調用方法,對於“生產力就是一切”的研發同學來說,這顯然是不可接受的。

不過,基礎設施本身的演進過程,實際上也伴隨著雲計算和開源社區的迅速崛起。時至今日,以雲為中心、以開源社區為依託的現代基礎設施體系,已經徹底的打破了原先企業級基礎設施能力良莠不齊、或者只能由全世界幾家巨頭提供的情況。

這個變化,正是雲原生技術改變傳統應用中間件格局的開始。更確切的說,原先通過應用中間件提供和封裝的各種基礎設施能力,現在全都被 Kubernetes 項目從應用層“拽”到了基礎設施層也就是 Kubernetes 本身當中。而值得注意的是,Kubernetes 本身其實也不是這些能力的直接提供者, Kubernetes 項目扮演的角色,是通過聲明式 API 和控制器模式把更底層的基礎設施能力對用戶“暴露”出去。這些能力,或者來自於“雲”(比如 PolarDB 數據庫服務);或者來自於生態開源項目(比如 Prometheus 和 CoreDNS)。

這也是為什麼CNCF 能夠基於Kubernetes 這樣一個種子迅速構建起來一個數百個開源項目組成的龐大生態的根本原因:Kubernetes 從來就不是一個簡單的平台或者資源管理項目,它是一個分量十足的“接入層”,是雲原生時代真正意義上的“操作系統”。

可是,為什麼只有 Kubernetes 能做到這一點呢?

這是因為, Kubernetes 是第一個真正嘗試以“應用為中心“的基礎設施開源項目。

以應用為中心,使得 Kubernetes 從第一天開始,就把聲明式 API 、而不是調度和資源管理作為自己的立身之本。聲明式 API 最大的價值在於“把簡單留給用戶,把複雜留給自己”。通過聲明式 API,Kubernetes 的使用者永遠都只需要關心和聲明應用的終態,而不是底層基礎設施比如雲盤或者 Nginx 的配置方法和實現細節。注意,這裡應用的“終態”,不僅僅包括應用本身的運行終態,還包括了應用所需要的所有底層基礎設施能力比如路由策略、訪問策略、存儲需求等所有應用依賴的終態。

這,正是以“應用為中心”的切實體現。

所以說,Kubernetes 並沒有讓中間件消失,而是把自己變成了一種“聲明式的”、“語言無關的”中間件,這正是應用基礎設施能力“下沉”的真實含義。

應用基礎設施能力“下沉”,實際上伴隨著整個雲原生技術體系和 Kubernetes 項目的發展始終。比如, Kubernetes 最早提供的應用副本管理、服務發現和分佈式協同能力,其實就是把構建分佈式應用最迫切的幾個需求,通過Replication Controller,kube-proxy 體系和etcd “下沉”到了基礎設施當中。而 Service Mesh ,其實就更進一步,把傳統中間件里至關重要的“服務與服務間流量治理”部分也“下沉”了下來。當然,這也就意味著 Service Mesh 實際上並不一定依賴於 Sidecar :只要能無感知的攔截下來服務與服務之間的流量即可(比如 API Gateway 和 lookaside 模式)。

隨著底層基礎設施能力的日趨完善和強大,越來越多的能力都會被以各種各樣的方式“下沉”下來。而在這個過程中,CRD + Operator 的出現,更是起到了關鍵的推進作用。 CRD + Operator,實際上把 Kubernetes 聲明式 API 驅動對外暴露了出來,從而使得任何一個基礎設施“能力”的開發者,都可以輕鬆的把這個“能力”植入到 Kubernetes 當中。當然,這也就體現了 Operator 和自定義 Controller 的本質區別:Operator 是一種特殊的自定義 Controller,它的編寫者,一定是某個“能力”對應的領域專家比如 TiDB 的開發人員,而不是 K8s 專家。遺憾的是當前的 Operator Framework 的發展並沒有體現出這個深層含義:太多的 K8s Controller 細節被暴露給了 Operator 的開發者,這是不對的。

在 2019 年,Service Mesh 生態取得了長足的進步,並且從原本 Istio 的絕對統治地位,來到了更接近於“諸侯爭鳴”的局面。畢竟,“中間件”這個生態,在過去也很難出現完全一家獨大的狀態,而Google “一如既往”的宣布Istio 項目暫時不捐贈給任何一個開源社區,其實也只是給這個趨勢增加一個推波助瀾的作用而已。其實,作為這波 Service Mesh 浪潮中應用基礎設施能力“下沉”的集大成者,Istio 項目已經在跟 Kubernetes 項目本身產生越來越多的“局部衝突”(比如跟 kube-proxy 體系的關係)。在未來,具體某種“聲明式中間件”的能力是Kubernetes Core 還是Mesh 插件來提供,可能會有更多的爭論出現,而在這個過程中,我們也會看到Istio 更多的“侵入”到Kubernetes 的網絡甚至容器運行時層面當中,這將使得基礎設施變得越來越複雜、越來越“黑科技”化。

聲明式應用基礎設施的主旋律

所以一個不爭的事實是,Kubernetes 項目的其實會越來越複雜、而不是越來越簡單。

更確切地說,“聲明式基礎設施”的基礎,就是讓越來越多的“複雜”下沉到基礎設施裡,無論是插件化、接口化的 Kubernetes “民主化”的努力,還是容器設計模式,或者 Mesh 體系,這些所有讓人興奮的技術演進,最終的結果都是讓 Kubernetes 本身變得越來越複雜。而聲明式 API 的好處就在於,它能夠在基礎設施本身的複雜度以指數級攀升的同時,至少保證使用者的交互界面複雜度仍然以線性程度上升。否則的話,如今的 Kubernetes 恐怕早就已經重蹈了 OpenStack 的災難而被人拋棄。

“複雜”,是任何一個基礎設施項目天生的特質而不是缺點。今天的 Linux Kernel 一定比 1991 年的第一版複雜不止幾個數量級;今天的 Linux Kernel 開發人員也一定沒辦法像十年前那樣對每一個 Module 都瞭如指掌。這是基礎設施項目演進的必然結果。

但是,基礎設施本身的複雜度,並不意味著基礎設施的所有使用者都應該承擔所有這些複雜度本身。這就好比我們每一個人其實都在“使用” Linux Kernel,但我們並不會抱怨“Linux Kernel 實在是太複雜了”:很多時候,我們甚至並不知道 Linux Kernel 的存在。

為了更好的說明 Kubernetes 的“複雜性”問題,我們需要先闡述一下當前的 Kubernetes 體系覆蓋的三類技術群體:

基礎設施工程師:在公司裡,他們往往稱作“Kubernetes 團隊”或者“容器團隊”。他們負責部署、維護 Kubernetes 及容器項目、進行二次開發、研發新的功能和插件以暴露更多的基礎設施能力。他們是 Kubernetes 與容器領域裡的專家,也是這個生態裡的中堅力量。

運維工程師(含運維研發和SRE):他們以及他們開發的工具和流水線(Pipeline),是保障關鍵業務穩定和正確運行的基石,而 Kubernetes 項目對他們來說,則是供給和研發運維能力的核心基礎依賴。理想情況下,運維工程師是 Kubernetes 項目的最重要使用者。

業務研發工程師:當前的 Kubernetes 項目用戶中,業務研發的比重很小。他們本身對基礎設施並不感冒,但是也有可能被 Kubernetes 的“聲明式中間件”的能力被吸引,逐步接受了依賴 Kubernetes 提供的基礎設施原語來編寫和部署應用。

上述三種使用群體在不同的公司內可能會有重合,而 Kubernetes 與生俱來的“複雜”,卻對上述三種使用者都有著深遠的影響。在 2019 年,雲原生生態也正在從上述三個角度出發,試圖解決 Kubernetes 複雜度對不同使用者帶來的問題。

Serverless Infrastructure 方興未艾

自然的,Kubernetes 生態首先希望解決的是基礎設施工程師面對的複雜度。在這裡聲明式 API 其實已經幫了很大的忙,但是部署和運維 Kubernetes 本身還是一個挑戰。這正是類似 kubeadm 、kops 項目,以及 Kubernetes 託管項目和服務(比如 GKE,ACK,EKS 等)的重要價值點。

另一方面,在幫助基礎設施工程師緩解複雜度問題的過程中,有一部分公有云提供商逐步發現了這樣一個事實:Kubernetes 工程師實際上也不希望關心更底層基礎設施比如網絡、存儲、宿主機的細節和特性。這就好比一個電器工程師,怎麼會去關心發電廠裡的事情呢?

所以很多公有云提供商先後推出了 Serverless Kubernetes 的服務。這種服務保留了Kubernetes 的Control Plane,但是把Kubernetes 中的kubelet 組件、以及相應的網絡、存儲等諸多IaaS 相關概念去掉,然後用Virtual Kubelet 項目把Kubernetes Control Plane 直接對接到一個叫做Serverless Container 的服務上來直接接入IaaS 的能力。所謂 Serverless Container,實際上就是把虛擬機以及相應的網絡存儲等依賴,通過一個容器 API 暴露出來,比如 Microsoft 的 ACI,AWS 的 Fargate 以及阿里雲的 ECI。由於從用戶視角來看,他看到的效果是 Kubernetes 裡面的 Node 被去掉了,所以這種服務方式又被稱作“Nodeless”。

Nodeless 從Kubernetes 中移除最讓人頭疼的節點和資源管理部分,所以它在使用上非常簡單,底層資源的問題也完全不必用戶操心,可謂省心省力無限彈性;而相應的折衷是kubelet 的缺失會為Kubernetes 的功能完整性打上折扣。

在 2019 年底,AWS 在 Re:Intent 大會上宣布的 EKS on Fargate 服務之後,迅速在業界引起了巨大的反響。 EKS on Fargate 去掉底層基礎設施細節的思路跟Serverless Kubernetes 是類似的,但差異點在於它並沒有使用Virtual Kubelet 來直接去掉Node 的概念,而是通過Fargate 服務申請EC2 虛擬機並在裡面安裝kubelet 使之成為Node,然後確保一個Node 里永遠只運行一個Pod(即:Node : Pod = 1:1)。在這個架構裡,kubelet 的存在為更好的保留 Kubernetes 功能完整度打下了基礎。對於這種保留了 Node 的 Serverless Kubernetes 設計,我們可以稱作 Serverless Infrastructure。

在 2019 年中旬,阿里就已經在 Kubernetes 社區提出了 Virtual Cluster 架構。它的核心思想是,在一個“基礎Kubernetes 集群(元集群)”上,可以為每個租戶“虛擬出”一個獨立的該租戶專屬的Kubernetes 集群,這個集群由獨立的Control Plane 和若干個虛擬的租戶Node 組成。可以看到,這個思路跟EKS on Fargate 的設計不謀而合但走的更遠:Fargate 目前需要將同一個租戶的Node 與Pod 1:1 來配置以保證租戶之間的隔離性,而Virtual Cluster則已經做到了租戶Node 與Pod 的1:N 配置,並且在元集群中通過KataContainers 實現不同租戶共享同一個宿主機的目的。不過,我們猜測 EKS on Fargate 最終也會通過 Firecracker 逐步走向 Virtual Cluster 架構。與 Virtual Cluster 類似的另一個商業產品,就是 VMware 的 Project Pacific:它通過“魔改” kubelet,在 vSphere 之上實現了“虛擬出” 租戶 Kubernetes 集群的目的。

作為開源界的 EKS on Farge 和 Project Pacific,Virtual Cluster 目前是 Kubernetes 上游多租工作組的核心孵化項目並且已經進行過多次 PoC,非常值得關注。

構建 “以應用為中心”的運維體系

從 Nodeless 到 Virtual Cluster,2019 年的雲原生生態正在全力以赴的解決基礎設施工程師的煩惱。不過,更加重要的運維工程師和業務研發所面臨的問題,卻似乎一直被忽視至今。要知道,他們其實才是抱怨“Kubernetes 複雜”的主要群體。

這裡的本質問題在於,Kubernetes 項目的定位是“The Platform for Platform”,所以它的核心功能原語服務的對像是基礎設施工程師,而不是運維和研發;它的聲明式API 設計、CRD Operator 體系,也是為了方便基礎設施工程師接入和構建新基礎設施能力而設計的。這就導致作為這些能力的使用者和終端受益者,運維工程師和業務研發實際上跟Kubernetes 核心定位之間存在著明顯的錯位;而現有的運維體系和系統,跟Kubernetes 體系之間也存在著巨大的鴻溝。

為了解決這個問題,很多公司和組織落地Kubernetes 的時候實際上採用了“ PaaS 化”的思路,即:在Kubernetes 之上再構建一個PaaS 系統,通過PaaS API(或者UI)把Kubernetes 跟業務運維和業務研發隔離開來。這樣做的好處在於,Kubernetes 的基礎設施能力真的就變成了“基礎設施”:業務運維和研發真正學習和使用的是這個 PaaS,Kubernetes 的“複雜性”問題也迎刃而解了。

但這種做法從本質上來說,其實跟 Kubernetes “以應用為中心”的設計是不一致的。 Kubernetes 一旦退化成了“類 IaaS 基礎設施”,它的聲明式 API、容器設計模式、控制器模型就根本無法發揮出原本的實力,也很難接入到更廣泛的生態。在Kubernetes 的世界裡,傳統PaaS 提供的各項能力比如CI/CD、應用打包託管、發布擴容,現在都可以通過一個個的CRD Controller 的方式作為插件部署在Kubernetes 當中,這跟應用基礎設施“下沉”的過程其實是類似的。當然,在這個過程中,這些插件就成瞭如何將 Kubernetes 與現有的運維體系進行對接和融合的關鍵所在。比如:如何做應用原地升級、固定 IP,如何避免 Pod 被隨意驅逐,如何按照公司運維規範統一管理和發布 Sidecar 容器等等。在 2019 年 KubeCon 上海,自定義工作負載開源項目 OpenKruise 的發布,其實正是 Kubernetes 與現有運維體系成功對接的典型案例。一句話:在現代云原生技術體系當中,“運維能力”可以直接通過聲明式 API 和控制器模型成為 Kubernetes 基礎設施的一部分。所以在大多數情況下,其實並不需要一個運維 PaaS 的存在。

但是,即使做到了“運維能力”雲原生化這一點,“以應用為中心”的基礎設施其實也才剛剛起步。

把“以應用為中心”進行到底

跟傳統中間件從業務研發視角出發不同,雲原生乃至整個應用基礎設施“下沉”的革命,是從底向上開始的。它起始於 Google Borg/Omega 這樣比“雲計算”還要底層的容器基礎設施構建理念,然後逐層向上透出“以應用為中心”的設計思想。出於基礎設施本身與生俱來的高門檻和聲明式應用管理理論被接納的速度,直到2019 年,社區對Kubernetes 體系的認識其實才剛剛從“類IaaS 基礎設施”、“資源管理與調度” ,堪堪上升到“以應用為中心的運維能力”的維度上來。

當然,這次“以應用為中心”的技術革命,一定不會在“運維”這個節點就戛然而止。那麼接下來呢?

實際上,聲明式 API 和控制器化,是將底層基礎設施能力和運維能力接入 Kubernetes 的手段但並非目的。 Kubernetes 打造“以應用為中心”的基礎設施真正希望達成的目標,是讓”應用“變成基礎設施中的絕對主角,讓基礎設施圍繞“應用”構建和發揮作用,而不是反之。

具體來說,在下一代“以應用為中心”的基礎設施當中,業務研發通過聲明式API 定義的不再是具體的運維配置(比如:副本數是10 個),而是“我的應用期望的最大延時是100 ms”。接下來的事情,就全部會交給 Kubernetes 這樣的應用基礎設施來保證實際狀態與期望狀態的一致,這其中,副本數的設置只是後續所有自動化操作中的一個環節。只有讓 Kubernetes 允許研發通過他自己的視角來定義應用,而不是定義 Kubernetes API 對象,才能從根本上的解決 Kubernetes 的使用者“錯位”帶來的各種問題。

而對於業務運維來說,下一代“以應用為中心”的基礎設施,必須能夠從應用的視角對運維能力進行封裝和再發現,而不是直接讓運維人員去學習和操作各種底層基礎設施插件。舉個例子,對於 kube-ovn 這樣一個Kubernetes 網絡插件來說,運維人員拿到的不再是kube-ovn 本身的使用文檔或者CRD,而是這個插件能夠提供的一系列運維能力的聲明式描述,比如:“動態QoS 配置CRD”、“子網隔離配置CRD”。然後,運維人員只需要通過這些聲明式 API ,為某個應用綁定它所需要的動態 QoS和子網隔離的具體策略值即可。剩下的所有事情就全交給 Kubernetes 了。

這樣,在底層基礎設施層逐漸Serverless 化、運維能力也越來越多的接入到Kubernetes 體系當中之後,雲原生的下一站將會繼續朝著“把以應用為中心進行到底”的方向不斷邁進。

在 2019 年 4 月,Google Cloud 發布了 Cloud Run 服務,第一次把 Serverless Application 的概念呈現給大眾。 2019 年 9 月,CNCF 宣布成立應用交付領域小組,宣布將“應用交付”作為雲原生生態的第一等公民。 2019 年 10 月,Microsoft 發布了基於 Sidecar 的應用中間件項目 Dapr ,把“面向 localhost 編程”變成了現實。而在 2019 年 10 月,阿里巴巴則聯合 Microsoft 共同發布了 Open Application Mode(OAM)項目,第一次對“以應用為中心”的基礎設施和構建規范進行了完整的闡述。在 2019 年,我們已經能夠切實感受到一場新的雲計算革命正在興起。在這場革命的終態,任何一個符合“以應用為中心“規範的軟件,將能夠從研發而不是基礎設施的視角自描述出自己的所有屬性,以及自己運行所需要所有的運維能力和外部依賴。這樣的應用才能做到天生就是 Serverless Application:它可以被“自動匹配”到任何一個滿足需求的“以應用為中心”的運行平台上去運行,我們不再需要關心任何基礎設施層面的細節和差異性。

總結

2019 年,在 Kubernetes 技術體系的規模性問題逐漸解決之後,整個雲原生生態正在積極的思考和探索如何達成雲原生技術理念“以應用為中心”的最終願景。而從 Serverless Infrastructure 到 Serverless Application,我們已經看到雲原生技術棧正在迅速朝“應用”為中心聚攏和收斂。我們相信在不久的未來,一個應用要在世界上任何一個地方運行起來,唯一要做的,就是聲明“我是什麼”,“我要什麼”。在這個時候,所有的基礎設施概念包括 Kubernetes、Istio、Knative 都會“消失不見”:就跟 Linux Kernel 一樣。

我們拭目以待。