傳統部署時代:
早期,各個組織是在物理服務器上運行應用程序。 由于無法限制在物理服務器中運行的應用程序資源使用,因此會導致資源分配問題。 例如,如果在同一臺物理服務器上運行多個應用程序, 則可能會出現一個應用程序占用大部分資源的情況,而導致其他應用程序的性能下降。 一種解決方案是將每個應用程序都運行在不同的物理服務器上, 但是當某個應用程序資源利用率不高時,剩余資源無法被分配給其他應用程序, 而且維護許多物理服務器的成本很高。
虛擬化部署時代:
因此,虛擬化技術被引入了。虛擬化技術允許你在單個物理服務器的 CPU 上運行多臺虛擬機(VM)。 虛擬化能使應用程序在不同 VM 之間被彼此隔離,且能提供一定程度的安全性, 因為一個應用程序的信息不能被另一應用程序隨意訪問。
虛擬化技術能夠更好地利用物理服務器的資源,并且因為可輕松地添加或更新應用程序, 而因此可以具有更高的可擴縮性,以及降低硬件成本等等的好處。 通過虛擬化,你可以將一組物理資源呈現為可丟棄的虛擬機集群。
每個 VM 是一臺完整的計算機,在虛擬化硬件之上運行所有組件,包括其自己的操作系統。
容器部署時代:
容器類似于 VM,但是更寬松的隔離特性,使容器之間可以共享操作系統(OS)。 因此,容器比起 VM 被認為是更輕量級的。且與 VM 類似,每個容器都具有自己的文件系統、CPU、內存、進程空間等。 由于它們與基礎架構分離,因此可以跨云和 OS 發行版本進行移植。
容器因具有許多優勢而變得流行起來,例如:
● 敏捷應用程序的創建和部署:與使用 VM 鏡像相比,提高了容器鏡像創建的簡便性和效率。
● 持續開發、集成和部署:通過快速簡單的回滾(由于鏡像不可變性), 提供可靠且頻繁的容器鏡像構建和部署。
● 關注開發與運維的分離:在構建、發布時創建應用程序容器鏡像,而不是在部署時, 從而將應用程序與基礎架構分離。
● 可觀察性:不僅可以顯示 OS 級別的信息和指標,還可以顯示應用程序的運行狀況和其他指標信號。
● 跨開發、測試和生產的環境一致性:在筆記本計算機上也可以和在云中運行一樣的應用程序。
● 跨云和操作系統發行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方運行。
● 以應用程序為中心的管理:提高抽象級別,從在虛擬硬件上運行 OS 到使用邏輯資源在 OS 上運行應用程序。
● 松散耦合、分布式、彈性、解放的微服務:應用程序被分解成較小的獨立部分, 并且可以動態部署和管理 - 而不是在一臺大型單機上整體運行。
● 資源隔離:可預測的應用程序性能。
● 資源利用:高效率和高密度。
為什么需要 Kubernetes,它能做什么?
容器是打包和運行應用程序的好方式。在生產環境中, 你需要管理運行著應用程序的容器,并確保服務不會下線。 例如,如果一個容器發生故障,則你需要啟動另一個容器。 如果此行為交由給系統處理,是不是會更容易一些?
這就是 Kubernetes 要來做的事情! Kubernetes 為你提供了一個可彈性運行分布式系統的框架。 Kubernetes 會滿足你的擴展要求、故障轉移你的應用、提供部署模式等。 例如,Kubernetes 可以輕松管理系統的 Canary (金絲雀) 部署。
Kubernetes 為你提供:
● 服務發現和負載均衡Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來暴露容器。 如果進入容器的流量很大, Kubernetes 可以負載均衡并分配網絡流量,從而使部署穩定。
● 存儲編排Kubernetes 允許你自動掛載你選擇的存儲系統,例如本地存儲、公共云提供商等。
● 自動部署和回滾你可以使用 Kubernetes 描述已部署容器的所需狀態, 它可以以受控的速率將實際狀態更改為期望狀態。 例如,你可以自動化 Kubernetes 來為你的部署創建新容器, 刪除現有容器并將它們的所有資源用于新容器。
● 自動完成裝箱計算你為 Kubernetes 提供許多節點組成的集群,在這個集群上運行容器化的任務。 你告訴 Kubernetes 每個容器需要多少 CPU 和內存 (RAM)。 Kubernetes 可以將這些容器按實際情況調度到你的節點上,以最佳方式利用你的資源。
● 自我修復Kubernetes 將重新啟動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器, 并且在準備好服務之前不將其通告給客戶端。
● 密鑰與配置管理Kubernetes 允許你存儲和管理敏感信息,例如密碼、OAuth 令牌和 SSH 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰。
● 批處理執行 除了服務外,Kubernetes 還可以管理你的批處理和 CI(持續集成)工作負載,如有需要,可以替換失敗的容器。
● 水平擴縮 使用簡單的命令、用戶界面或根據 CPU 使用率自動對你的應用進行擴縮。
● IPv4/IPv6 雙棧 為 Pod(容器組)和 Service(服務)分配 IPv4 和 IPv6 地址。
● 為可擴展性設計 在不改變上游源代碼的情況下為你的 Kubernetes 集群添加功能。
Kubernetes 不是什么
Kubernetes 不是傳統的、包羅萬象的 PaaS(平臺即服務)系統。 由于 Kubernetes 是在容器級別運行,而非在硬件級別,它提供了 PaaS 產品共有的一些普遍適用的功能, 例如部署、擴展、負載均衡,允許用戶集成他們的日志記錄、監控和警報方案。 但是,Kubernetes 不是單體式(monolithic)系統,那些默認解決方案都是可選、可插拔的。 Kubernetes 為構建開發人員平臺提供了基礎,但是在重要的地方保留了用戶選擇權,能有更高的靈活性。
Kubernetes:
● 不限制支持的應用程序類型。 Kubernetes 旨在支持極其多種多樣的工作負載,包括無狀態、有狀態和數據處理工作負載。 如果應用程序可以在容器中運行,那么它應該可以在 Kubernetes 上很好地運行。
● 不部署源代碼,也不構建你的應用程序。 持續集成(CI)、交付和部署(CI/CD)工作流取決于組織的文化和偏好以及技術要求。
● 不提供應用程序級別的服務作為內置服務,例如中間件(例如消息中間件)、 數據處理框架(例如 Spark)、數據庫(例如 MySQL)、緩存、集群存儲系統 (例如 Ceph)。這樣的組件可以在 Kubernetes 上運行,并且/或者可以由運行在 Kubernetes 上的應用程序通過可移植機制(例如開放服務代理)來訪問。
● 不是日志記錄、監視或警報的解決方案。 它集成了一些功能作為概念證明,并提供了收集和導出指標的機制。
● 不提供也不要求配置用的語言、系統(例如 jsonnet),它提供了聲明性 API, 該聲明性 API 可以由任意形式的聲明性規范所構成。
● 不提供也不采用任何全面的機器配置、維護、管理或自我修復系統。
● 此外,Kubernetes 不僅僅是一個編排系統,實際上它消除了編排的需要。 編排的技術定義是執行已定義的工作流程:首先執行 A,然后執行 B,再執行 C。 而 Kubernetes 包含了一組獨立可組合的控制過程,可以持續地將當前狀態驅動到所提供的預期狀態。 你不需要在乎如何從 A 移動到 C,也不需要集中控制,這使得系統更易于使用且功能更強大、 系統更健壯,更為彈性和可擴展。