Kubernetes 已成為 容器調度的真正標準,提供各種工具以大規模管理容器化應用程式。部署和狀態集是兩項功能強大的工具,可協助您有效協調和擴展容器化工作負載。兩者皆能管理部署,同時具備專為無 狀態應用程式設計的獨特功能。
本文將引導您了解部署與狀態集(包括每種模式的最佳做法)之間的主要差異,以協助您選擇適合您特定需求的方法。
什麼是部署?
部署是用於管理無狀態應用程式的 Kubernetes 資源物件。它們提供應用程式更新的宣告性方法,這表示您指定了所需的狀態(pod、 容器影像 等數量),而 Kubernetes 則負責達成這個狀態。如此可簡化應用程式管理,並簡化部署。
部署的主要優勢:
- 持續更新:部署的主要 優勢是能夠執行持續更新。此功能可讓您以最短的停機時間來更新應用程式,並逐漸將舊的 pod 換成新的 pod,從而確保高可用性,並盡可能減少升級期間的中斷。
- 複製管理: 部署作為複製集,確保叢集中始終運行所需數量的應用程式 pod 複製。如果 pod 失敗或變得不健康,部署會自動啟動新的複本以維持指定的號碼。
- 自我修復功能: 部署展現自我修復行為。如果 Pod 故障或當機,部署會偵測問題並自動啟動替換 Pod。如此可確保您的應用程式在面臨 Pod 故障時仍能正常運作。
- 宣告式語法: 部署利用宣告式語法。您可以使用 YAML 或 JSON 檔案定義應用程式所需的狀態,而 Kubernetes 則處理基礎基礎架構,以達到該狀態。
什麼是 StatefulSet?
StatefulSet 是 用於管理狀態應用程式之 Kubernetes 資源。雖然部署在管理無狀態應用程式方面表現優異,但 Kubernetes 為具有特定需求的狀態應用程式提供狀態集。StatefulSets 保證 pod 生命週期的訂購和獨特性,使其成為依賴下列技術的應用程式的理想選擇:
- 穩定的網路身分:每個由 StatefulSet 管理的 Pod 都會指派一個唯一且持久的網路識別碼。即使將 pod 重新排程到叢集中的其他節點,此識別碼仍然保持不變。這對依賴特定網路位址進行通訊的應用程式,如資料庫而言至關重要。
- 有序、受控的更新: StatefulSets pod 按預定順序建立、擴展和刪除,允許在部署期間正確初始化和正常關閉應用程式。如此可將中斷與資料遺失降至最低。
- 持續的儲存整合: StatefulSets 與持續容量聲明 (PVC) 無縫整合。PVC 作為儲存資源的請求,允許 pod 存取持久性儲存,在 pod 重新啟動或重新排程後存活。如此可確保具狀態的應用程式在 Pod 的生命週期中維持資料。
比較:部署 vs. StatefulSet
選擇正確的方法來管理 Kubernetes 工作負載,取決於了解部署與狀態設定之間的根本差異。以下是需要考量的關鍵因素:
- 應用程式類型: 部署是為無狀態應用程式所設計,每個執行個體都視為相同。StatefulSets 專為需要 持久性儲存 和穩定網路身份的具狀態應用程式而打造。
- Pod 和網路識別: 部署將 Pod 視為可互換。Pod 可以重新啟動或重新排程,不會影響整體應用程式功能。這是因為每個 Pod 執行個體都獨立運作,無法維持獨特的身分。
相較之下,StatefulSets 為每個 Pod 提供獨特且穩定的身分。這種可預測的身分對於資料庫等仰賴一致網路位址和特定 Pod 執行個體來管理資料的具狀態應用程式至關重要。
- 儲存設備: 部署設備使用永久儲存設備,意即當重新開機或重新排程 Pod 時,任何儲存於 Pod 的資料都會遺失。對於不需要持久性資料儲存的無狀態應用程式,這是可以接受的。StatefulSets 利用 PVC 來確保 pod 重新排程的資料持久性。PVC 作為儲存資源的請求,允許 pod 存取持久性儲存,在 pod 重新啟動或在節點之間移動時存活。如此可確保具狀態的應用程式能在整個 Pod 生命週期中維護資料。
- 擴展和更新: 部署提供了彈性的擴展方法。全新 pod 可立即新增或移除,無須任何保證訂單。StatefulSets 以受控制和有序的方式執行部署和擴展作業。以預定順序建立、更新和刪除 Pod,以便在部署期間適當初始化和正常關閉應用程式。
部署 vs. StatefulSets:選擇正確的選項
現在您已了解部署與狀態設定之間的核心差異,在選擇適合您特定應用的正確方法時,需要考量以下幾個關鍵因素:
應用程式狀態
您的應用程式是無狀態的還是有狀態的? 如果您的應用程式將每個 pod 執行個體視為可互換的執行個體,而且不需要持續儲存資料,那麼部署是理想的選擇。無狀態應用程式,如網路伺服器和 微服務, 都可以使用部署的彈性方法輕鬆擴展和更新。
對於需要在重新啟動或重新排程期間維持狀態(資料)的應用程式,StatefulSets 是您的首選。此外,如果您的應用程式依賴穩定的網路身分與其他服務進行通訊,則 StatefulSets 是必要的。資料庫、訊息佇列和叢集應用程式都是狀態應用程式的主要範例,這些應用程式需要 StatefulSets 提供的穩定性和有序操作。
Pod 身分要求
無狀態應用程式通常不需要為 Pod 提供獨特的身分。將 pod 視為可互換的部署,足以應付這些情況。
具狀態的應用程式通常依賴 Pod 在重新啟動時維持獨特的身分。StatefulSets 保證這些獨特身分,確保應用程式能夠持續存取並管理其資料。
儲存考量
如果 pod 重新啟動時遺失的永久儲存,就足以支援您的應用程式,那麼部署將是您 容器管理的正確選項。否則,StatefulSets 會借助 PVC,為您的應用程式提供持久性儲存。
更新與擴展需求
如果您的應用程式需要以特定順序擴展,StatefulSets 會提供。如果您的容器不是相互依賴的,您可以移除或新增 Kubernetes 部署,而不必考慮順序。
結論
了解部署與 StatefulSets 之間的差異,對於有效管理 Kubernetes 工作負載至關重要。部署是需要快速擴展和更新的無狀態應用程式的理想選擇,而狀態設定對於需要持久性儲存和穩定身份的有狀態應用程式而言至關重要。
透過仔細評估應用程式的需求,您可以選擇適當的 Kubernetes 資源,以確保最佳效能和可靠性。探索如 Portworx® 的持久性 Kubernetes 儲存裝置等全面性解決方案。