無論是使用 Gmail、YouTube 還是搜尋功能,Google 中的所有項目都在容器中執行。容器化可讓我們的開發團隊快速移動、有效部署軟體,並以前所未有的規模操作。我們每週都會啟動超過數十億個容器。在過去十年間,我們對如何在實際工作環境中執行容器化工作負載有了進一步的瞭解,我們也一直與社群分享這類知識:早期是將 cgroups 帶入 Linux kernel,後來則是將 Google 內部工具中的設計應用在 Kubernetes 專案中,並開放原始碼。我們將這些專業知識全都帶進 Google Cloud Platform 中,讓所有開發人員與各種規模的企業都可以輕鬆取用最新的容器創新技術。

容器提供一種邏輯封裝機制,能夠將應用程式從實際執行所在環境抽取出來。無論目標環境是私人資料中心、公用雲端還是開發人員的個人筆記型電腦,這種分離的方式都可以輕鬆、一致地部署容器型應用程式。容器化提供了一種俐落的分工模式,當開發人員專注於應用程式邏輯與依附元件時,IT 營運團隊可將注意力集中到部署與管理上,而不用擔心諸如特定軟體版本與應用程式特定設定之類的應用程式細節。
對於來自虛擬化環境的情況,我們通常會將容器與虛擬機器 (VM) 進行比較。您可能已經對 VM 有所瞭解:例如 Linux 或 Windows 等訪客作業系統會在主機作業系統之上執行,而且具有對於基礎硬體的虛擬存取權。容器和虛擬機器一樣,可以讓您將應用程式與程式庫及其他依附元件封裝在一起,提供隔離的環境來執行軟體服務。但是,您在下列圖表中可以看見,相似性僅止於此,因為容器為開發人員與 IT 營運團隊提供更為輕量的工作單位,因而帶來了更多的好處。

容器不像虛擬機器會將硬體堆疊虛擬化,而是會在作業系統層級進行虛擬化,讓多個容器直接在 OS 核心之上執行。這表示容器遠比虛擬機器輕量,不但共用 OS 核心、啟動速度較快,而且使用的記憶體量也比啟動完整 OS 要少很多。
容器有許多可用格式。Docker 是一種常見的開放原始碼容器格式,Google Cloud Platform 與 Google Kubernetes Engine 都支援這種格式。
除非您明確連接容器,否則容器之間會彼此獨立儲存應用程式。換句話說,您可以針對每項服務設定明確的資源限制,而不必擔心依附元件衝突或資源爭用的問題。重要的是,這又增加了一層安全性,因為您的應用程式並不在主機作業系統上直接執行。

容器讓開發人員能夠建立可以預測的環境,而且這個環境是與其他應用程式隔離開的。容器也可能包含應用程式需要的軟體依附元件,例如特定版本的程式設計語言執行階段與其他軟體程式庫。從開發人員的角度來看,無論最終應用程式將部署到何處,這一切都能保證一致。這一切全都代表生產力:開發人員與 IT 營運團隊可以減少花費在偵錯與診斷環境差異上的時間,而將更多時間用在為使用者提供新功能。而且開發人員現在可以在開發與測試環境中,做出同樣適用於實際工作環境的假設,因此錯誤的發生機率也會隨之降低。

容器幾乎能在任意位置執行,顯著降低了開發與部署的難度:在 Linux、Windows 與 Mac 作業系統上;在虛擬機器或不含作業系統的機器上;在開發人員的機器或資料中心內部部署中;當然,還有公開雲端中。廣泛應用於容器的 Docker 映像檔格式更加強化了可攜性。每當您想要執行軟體時,就可以使用容器。

容器可在 OS 層級虛擬化 CPU、記憶體、儲存空間與網路資源,為開發人員提供 OS 的沙箱視圖,而且在邏輯上與其他應用程式完全隔離。
容器的優點 | 虛擬機器的優點 | |
---|---|---|
一致的執行階段環境 | check | check |
應用程式沙箱 | check | check |
占用磁碟空間少 | check | |
負擔低 | check |
容器可以讓您將應用程式與其依附元件,一起封裝到一個採用版本控管的精簡資訊清單中,因此無論是團隊中的開發人員,還是叢集中的不同機器都能輕易複製應用程式。
軟體程式庫將多個程式碼片段封裝在一起,讓開發人員能夠將使用者驗證與工作階段管理等邏輯抽離;容器的運作方式也是如此,藉由完整封裝您的應用程式,進而將作業系統、機器甚至是程式碼本身抽離。由於與服務型架構結合在一起,開發人員需要推論的完整單元小上許多,靈活性與生產力進而雙雙提高。這一切都讓應用程式的開發、測試、部署與整體管理變得越來越簡單。
容器最適合用於服務型架構。在龐大的架構中,應用程式的每一個部分,從 IO、資料處理到轉譯都交互糾纏在一起;相反地,服務型架構將這一切都分離成單獨的元件。將各種工作分離並區隔開來,可讓您的服務在其他元件無法運作的情況下,仍然能夠持續運轉,如此一來整個應用程式也變得更加可靠。
元件化也可讓您以更快的速度及更可靠的方式開發;程式碼集越小,維護起來越容易,而且由於服務是分離的,要針對輸出測試特定輸入會更簡單。
容器非常適合服務型應用程式,因為您可以檢查每個容器的健康狀態、將每個服務限制於特定資源,並讓服務彼此之間獨立啟動及停止。
由於容器能夠抽離程式碼,因此您可以將個別服務當成黑箱來處理,進一步減少開發人員需要顧慮的空間。當開發人員處理需要彼此依賴的服務時,他們可以針對特定服務輕鬆啟動容器,而不用浪費時間提前設定正確的環境及疑難排解。
我們在內部叢集管理系統 Borg 上屢創佳績,並將所獲經驗應用在開放原始碼專案 Kubernetes 中。現在,您與其他公司都可以從我們幾十年來的經驗中獲益。Kubernetes 又稱為「k8s」,提供了容器自動化調度管理功能,為您管理機器並提供服務,進而提高可靠性並減少您花在開發運作上的時間與資源,大大減輕了您因為這些工作而產生的壓力。
Kubernetes 可以讓應用程式的所有部署及管理工作都變得更加輕鬆,不但會自動進行逐步部署及復原,同時也會監控服務的健康狀態,在問題發生前就先預防錯誤部署;而且會持續對服務執行健康狀態檢查,重新啟動失敗或無法使用的容器,並只於確認容器都已經成功啟動時才向用戶端公告服務。此外,Kubernetes 可根據使用狀況自動調整服務的資源配置,確保您只在有需要的時候執行必要的項目。Kubernetes 就像容器一樣,可讓您以宣告的方式管理叢集,使您的設定受到版本控管,並可輕鬆複製。
- check 自動逐步部署及復原
- check 服務健康狀態監控
- check 自動調整服務的資源配置
- check 宣告式管理
- check 在任意位置部署,包括混合式部署
或許最重要的是,Kubernetes 可在任意位置使用,讓您無論是從現場部署到公用雲端,還是到混合式部署,都能夠進行自動化調度管理。另外,也可讓您的基礎架構觸及使用者的所在位置,賦予您的應用程式更高的可用性,您的公司在安全性與成本考量之間也能達到平衡,而這一切全都可以根據您的特定需求量身打造。

當然,Kubernetes 在 Google Cloud Platform 上的執行效果最好。Google Kubernetes Engine 是頂尖的代管 Kubernetes 解決方案,可讓您快速完成設定並用於實際工作環境。
Kubernetes Engine 完全由 Google 的可靠性工程師全代管,這些工程師對容器瞭若指掌,可確保您的叢集高度可用並且維持最新狀態。Kubernetes Engine 可與所有 GCP 服務完美整合,包括 Stackdriver 的監控、診斷與記錄服務;身分與存取權管理,以及 Google 的同級最佳網路基礎架構。
- check 開放原始碼 Kubernetes 代管服務
- check 99.5% 服務水準協議,具有高可用性,並整合了多區域部署
- check 與其他 GCP 服務完美整合
- check 領導業界的性價比
- check 具有彈性,且可與您的內部部署叢集或其他雲端供應商互通
- check Google 等級的代管基礎架構
但是我們很願意為您提供選擇。Google Cloud Platform 提供了完備的容器執行方法。從 Google Cloud Run 的全代管環境、Kubernetes Engine 的叢集管理,到性價比首屈一指的 Google Compute Engine 提供的自助式基礎架構,您絕對可以找到在 Google Cloud Platform 上執行容器的理想解決方案。

不只如此,從開發到正式發布期間要搭配容器使用的必備工具,都可在 Google Cloud Platform 取得。Cloud Build 和 Container Registry 提供 Docker 映像檔儲存與管理功能,並以 Google 的高度安全性標準和世界頂尖網路做為後盾。Google 的 Container-Optimized OS 提供了高度安全的輕量級作業系統,並且預先安裝了 Docker 和 Kubernetes 執行階段。您所有的容器管理工作都可以在 GCP 上完成。

「建構容器管理系統的十年經驗教會了我們很多東西,我們也將這些經驗融入到 Google 最新的容器管理系統中,那就是 Kubernetes。它的目標是在容器的基礎之上,顯著提升程式設計師的生產力,並簡化手動與自動化的系統管理。」
- 《Borg, Omega, and Kubernetes: Lessons learned from three container management systems over a decade》(Borg、Omega 及 Kubernetes:過去十年從三種容器管理系統學到的經驗),Google LLC,2016 年