總覽
本頁是 Kubernetes 的總覽。
Kubernetes 的名稱源自希臘語,意思是舵手或飛行員。 K8s 作為縮寫是從計算「K」和「s」之間的八個字母而來。 Google 在 2014 年開放原始碼 Kubernetes 專案。 Kubernetes 結合了Google 超過 15 年的經驗,以大規模執行生產工作負載,並結合社群中最佳的想法和實務。
您為何需要 Kubernetes 以及它可以做什麼
容器是捆綁和執行應用程式的好方法。在生產環境中,您需要管理執行應用程式的容器,並確保沒有停機時間。例如,如果容器當機,則需要啟動另一個容器。如果此行為由系統處理,是否會更容易?
這就是 Kubernetes 來救援的原因! Kubernetes 為您提供了一個框架,可以彈性地執行分散式系統。它負責應用程式的擴展和容錯移轉、提供部署模式等等。例如:Kubernetes 可以輕鬆管理系統的 Canary 部署。
Kubernetes 為您提供
- 服務探索和負載平衡 Kubernetes 可以使用 DNS 名稱或使用自己的 IP 位址公開容器。如果容器的流量很高,Kubernetes 能夠進行負載平衡並分配網路流量,以使部署穩定。
- 儲存協調 Kubernetes 允許您自動掛載您選擇的儲存系統,例如本機儲存、公有雲提供者等等。
- 自動化推出和回滾 您可以使用 Kubernetes 描述已部署容器的所需狀態,並且它可以受控速率將實際狀態變更為所需狀態。例如,您可以自動化 Kubernetes 為您的部署建立新容器、移除現有容器並將其所有資源採用到新容器。
- 自動箱裝 您為 Kubernetes 提供一個節點叢集,它可以將其用於執行容器化任務。您告訴 Kubernetes 每個容器需要多少 CPU 和記憶體 (RAM)。 Kubernetes 可以將容器裝入您的節點,以充分利用您的資源。
- 自我修復 Kubernetes 重新啟動失敗的容器、更換容器、終止未回應使用者定義的健康檢查的容器,並且在容器準備好提供服務之前,不會向用戶端宣傳它們。
- 密鑰和組態管理 Kubernetes 可讓您儲存和管理敏感資訊,例如密碼、OAuth 權杖和 SSH 金鑰。您可以部署和更新密鑰和應用程式組態,而無需重建容器映像檔,也無需在堆疊組態中公開密鑰。
- 批次執行 除了服務之外,Kubernetes 也可以管理您的批次和 CI 工作負載,如果需要,可以更換失敗的容器。
- 水平擴展 使用簡單的命令、UI 或根據 CPU 使用率自動向上和向下擴展您的應用程式。
- IPv4/IPv6 雙堆疊 將 IPv4 和 IPv6 位址分配給 Pod 和服務
- 專為可擴展性而設計 無需變更上游原始碼即可將功能新增至 Kubernetes 叢集。
Kubernetes 不是什麼
Kubernetes 不是傳統的全方位 PaaS(平台即服務)系統。由於 Kubernetes 在容器層級而不是在硬體層級運作,因此它提供 PaaS 產品通用的一些通用功能,例如部署、擴展、負載平衡,並讓使用者整合其記錄、監控和警示解決方案。但是,Kubernetes 不是單體式的,這些預設解決方案是選用的且可外掛的。 Kubernetes 為建置開發人員平台提供了建置區塊,但在重要的地方保留了使用者選擇和彈性。
Kubernetes
- 不限制支援的應用程式類型。 Kubernetes 旨在支援極其多樣化的工作負載,包括無狀態、有狀態和資料處理工作負載。如果應用程式可以在容器中執行,則它應該可以在 Kubernetes 上良好執行。
- 不部署原始碼,也不建置您的應用程式。持續整合、交付和部署 (CI/CD) 工作流程取決於組織文化和偏好以及技術需求。
- 不提供應用程式層級的服務,例如中介軟體(例如:訊息匯流排)、資料處理框架(例如:Spark)、資料庫(例如:MySQL)、快取,以及叢集儲存系統(例如:Ceph)等內建服務。 這些組件可以在 Kubernetes 上運行,並且/或者可以透過可攜式機制(例如:Open Service Broker)讓運行在 Kubernetes 上的應用程式存取。
- 不指定日誌記錄、監控或警報解決方案。 它提供了一些整合作為概念驗證,以及收集和匯出指標的機制。
- 不提供也不強制使用組態語言/系統(例如:Jsonnet)。 它提供了一個宣告式 API,可以作為任意形式的宣告式規範的目標。
- 不提供也不採用任何全面的機器組態、維護、管理或自我修復系統。
- 此外,Kubernetes 不僅僅是一個協調系統。 事實上,它消除了對協調的需求。 協調的技術定義是執行定義的工作流程:先做 A,然後做 B,然後做 C。 相反地,Kubernetes 包含一組獨立、可組合的控制程序,這些程序不斷地將當前狀態驅向所提供的期望狀態。 從 A 到 C 的過程並不重要。 集中控制也不是必需的。 這產生了一個更易於使用且更強大、穩健、彈性且可擴展的系統。
Kubernetes 的歷史背景
讓我們回顧一下歷史,看看為什麼 Kubernetes 如此有用。
傳統部署時代
早期,組織在實體伺服器上運行應用程式。 無法在實體伺服器中為應用程式定義資源邊界,這導致了資源分配問題。 例如,如果多個應用程式在同一台實體伺服器上運行,可能會發生一個應用程式佔用大部分資源的情況,導致其他應用程式效能不佳。 一種解決方案是在不同的實體伺服器上運行每個應用程式。 但這種方法無法擴展,因為資源未被充分利用,而且組織維護許多實體伺服器的成本很高。
虛擬化部署時代
作為一種解決方案,虛擬化被引入。 它允許您在單個實體伺服器的 CPU 上運行多個虛擬機器(VM)。 虛擬化允許應用程式在 VM 之間隔離,並提供一定程度的安全性,因為一個應用程式的資訊不能被另一個應用程式自由存取。
虛擬化可以更好地利用實體伺服器中的資源,並實現更好的可擴展性,因為可以輕鬆地添加或更新應用程式,降低硬體成本等等。 透過虛擬化,您可以將一組實體資源呈現為一次性虛擬機器的叢集。
每個 VM 都是一台完整的機器,運行所有組件,包括其自身的作業系統,在虛擬化硬體之上。
容器部署時代
容器與 VM 類似,但它們放寬了隔離屬性,以便在應用程式之間共享作業系統(OS)。 因此,容器被認為是輕量級的。 與 VM 類似,容器有自己的檔案系統、CPU 份額、記憶體、進程空間等等。 由於它們與底層基礎架構解耦,因此它們可以在雲端和 OS 發行版之間移植。
容器之所以變得流行,是因為它們提供了額外的好處,例如:
- 敏捷應用程式建立和部署:與 VM 映像檔的使用相比,容器映像檔的建立更加容易和高效。
- 持續開發、整合和部署:提供可靠且頻繁的容器映像檔建置和部署,以及快速有效的回滾(由於映像檔的不可變性)。
- 開發和維運關注點分離:在建置/發布時而不是部署時建立應用程式容器映像檔,從而將應用程式與基礎架構解耦。
- 可觀察性:不僅呈現 OS 層級的資訊和指標,還呈現應用程式健康狀況和其他訊號。
- 跨開發、測試和生產環境的一致性:在筆記型電腦上的運行方式與在雲端中的運行方式相同。
- 雲端和 OS 發行版的可移植性:可在 Ubuntu、RHEL、CoreOS、地端部署、主要公有雲和任何其他地方運行。
- 以應用程式為中心的管理:將抽象層級從在虛擬硬體上運行 OS 提高到在 OS 上使用邏輯資源運行應用程式。
- 鬆散耦合、分散式、彈性、解放的微服務:應用程式被分解成更小、獨立的部分,可以動態部署和管理 — 而不是在一個大型單用途機器上運行的單體堆疊。
- 資源隔離:可預測的應用程式效能。
- 資源利用率:高效率和高密度。
接下來是什麼?
- 請查看 Kubernetes 組件
- 請查看 Kubernetes API
- 請查看 叢集架構
- 準備好開始使用了嗎?