K8S 無狀態和有狀態,初學者指南!
Kubernetes 是一個開源編排系統,用于自動部署、擴展和管理容器化應用程序。
有關 Kubernetes 的詳細信息,請查看 Kubernetes 指南:https://devtron.ai/blog/developers-guide-to-kubernetes/。
Kubernetes 提供稱為 Pod 的基本資源。Pod 是 Kubernetes 中最小的可部署單元,它實際上是容器的包裝器。它可以有一個或多個容器,共享存儲/網絡,以及如何運行容器的規范。
Pod 被認為是短暫的實體。如果 pod 被調度到的節點死亡,那么該 pod 將在超時后被刪除重新調度。
一個 pod 代表 Kubernetes 中的一個單元。對于水平擴展(例如運行多個實例),應用程序需要多個 pod。復制 pod 以實現水平縮放。復制的 pod 是通過Controllers創建和管理的。
用于 Pod 副本管理的 Controller
1. Deployment
Deployment 是部署應用程序最簡單和最常用的資源。它管理 ReplicaSet 的部署。您可以定義 Deployment 以更新、創建新的 ReplicaSet 或刪除現有部署。Deployment 的主要作用是為 pod 和 ReplicaSet 提供聲明式更新。
Deployment 可幫助您實現以下目標:
- 推出 ReplicaSet —它將在后臺創建 pod。您可以檢查推出的狀態以檢查它是否成功。
- 聲明 pod 的新狀態 —您可以更新部署清單的 PodTemplateSpec。一個新的 ReplicaSet 被創建,部署以受控的速率將 Pod 從舊的 ReplicaSet 移動到新的 ReplicaSet。現在,每個新的 ReplicaSet 都將具有部署的更新版本。
- 回滾到較早的部署修訂版——如果由于某些情況,當前狀態不穩定,則可以將部署回滾到較早的部署修訂版。
Deployment 不提供什么?
- 它不為 pod 提供標識符。
- 它不為 pods 提供存儲,因此它僅用于無狀態應用程序(那些不關心正在使用哪個網絡,并且不需要任何永久存儲的應用程序。例如,Apache、Nginx、Tomcat 等 Web 服務器)。
2. StatefulSet
它是一種 Kubernetes 資源,用于管理有狀態的應用程序。它管理一組 Pod 的部署和擴展,并提供 Pod 的順序和唯一性的保證。
與 Deployment 不同,StatefulSet 為每個 pod 維護一個身份。每個 pod 都有一個持久標識符,它在任何調度中都保持不變。
例如,如果您創建一個名稱為flag的 StatefulSet,它將創建一個名稱為 flag-0 的 pod,并且對于 StatefulSet 的多個副本,pod 名稱將遞增,如 flag-0、flag-1、flag- 2 等。
每個節點都有自己的Persistent Volume。如果刪除或縮小 pod,與它們關聯的卷將不會被刪除,因此數據會保留。
Deployment 和 StatefulSet 中存儲卷的區別
- Deployment:它用于“無狀態應用程序”。卷 (PVC) 在 pod 之間共享。由于共享的卷中沒有數據,因此會導致數據泄露問題。
- StatefulSet:用于“有狀態的應用程序”。PVC 將在其中存儲信息,這將導致所有 pod 之間的信息共享。
在 Deployment 和 StatefulSet 中使用 PVC
在訪問模式的幫助下,PVC 可以跨 Deployment 和 StatefulSet 使用。有 3 種訪問模式,即:
- ReadWriteOnce:將卷掛載為單個節點的讀寫。
- ReadOnlyMany:將卷以只讀方式安裝到許多節點。
- ReadWriteMany:將卷掛載為許多節點的讀寫。
Deployment
當為 Deployment 指定 PVC 時,它會在所有副本 pod 之間共享。在這種情況下,PVC 必須具有 ReadWriteMany 或 ReadOnlyMany 訪問模式(ReadWriteMany 很少見,只有少數存儲提供商支持)。
如果使用 ReadWriteOnce 訪問模式創建 PVC,然后嘗試創建運行一個有狀態應用程序,可以正常工作。如果橫向擴容,當一個新的 pod 啟動時,會收到一個錯誤,指出該卷已在使用中。
因此,在這種情況下,最好使用只讀卷來避免錯誤。
StatefulSet
當為 StatefulSet 指定 PVC 時,必須確保 PVC 具有ReadWriteOnce訪問模式。
使用 StatefulSet,定義一個 VolumeClaimTemplate,會自動為每個副本創建一個 PVC。
另一個好處是,將擁有一個定義應用程序和持久卷的文件。它將進一步增強應用程序的可擴展性。
原文:https://medium.com/container-talks/kubernetes-deployment-vs-statefulset-what-you-need-to-know-1a281e1d3c2c