StatefulSets 是 Kubernetes 中用於管理有狀態應用程式的 API 物件。 Kubernetes中有兩種類型的應用程序,有狀態應用程式和無狀態應用程式。有兩種方法可以部署這些應用程式:
那些維護某種形式的持久狀態或資料的應用程式稱為有狀態應用程式。它們與無狀態應用程式的關鍵特徵是這些應用程式不依賴本地儲存數據,並且它們不將每個請求視為獨立的。他們管理互動之間的數據。有時無狀態應用程式會連接到有狀態應用程式以將請求轉發到資料庫。
那些不在本地維護任何形式的持久狀態或資料的應用程式稱為無狀態應用程式。在無狀態應用程式中,每個請求或互動都是獨立處理的。這些應用程式被設計為高度可擴展、易於管理和容錯,因為與有狀態應用程式不同,它們不必追蹤過去的互動或請求。
無狀態應用程式使用部署元件進行部署。部署是 pod 的抽象,允許您複製應用程序,這意味著它允許您運行相同無狀態應用程式的 1、5、10 或 n 個相同的 pod。
簡單地說,StatefulSets 是專門用於有狀態應用程式的 Kubernetes 元件。這些是用於管理有狀態應用程式的工作負載 API 物件。它們管理一組 Pod 的部署和擴充(建立更多副本或刪除它們),StatefulSet 也負責這些 Pod 的排序和唯一性。 StatefulSet 在 Kubernetes 1.9 版本中發布。
StatefulSets 將代表具有不同(唯一)、持久身分和彈性主機名稱(穩定)的 Pod 集合。它使您可以確定擴展和部署的順序。在了解 StatefulSet 之前,您必須了解 Kubernetes Deployment。
這是一個名為 web 的 StatefulSet 範例:
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi
Kubernetes 中的 StatefulSet 非常適合部署需要穩定、唯一的網路識別碼、持久性儲存以及有序、優雅的部署和擴展的有狀態應用程式。它們適用於需要一致身份和儲存的資料庫、鍵值儲存和訊息佇列等應用程式。
考慮一個連接到 MongoDB 資料庫的 Node.js 應用程式。當請求到達 Node.js 應用程式時,它會獨立處理該請求,並且不依賴先前的資料來執行此操作。它根據請求本身的有效負載處理請求。此 Node.js 應用程式是無狀態應用程式的範例。現在請求要么更新資料庫中的一些數據,要么從資料庫中查詢一些數據。當node.js將該請求轉送到MongoDB時,MongoDB會根據資料的先前狀態更新資料或從其儲存體中查詢資料。對於每個請求,它都需要處理數據,並且它取決於可用的最新數據或狀態,而 Node.js 只是數據更新或查詢的傳遞,它只處理程式碼。因此,node.js 應用程式應該是無狀態應用程序,而 MongoDB 應用程式必須是有狀態應用程式。
有時無狀態應用程式連接到有狀態應用程式以將請求轉發到資料庫。這是無狀態應用程式將請求轉發到有狀態應用程式的一個很好的範例。
這裡是如何使用 StatefulSet 以及 StatefulSet 的一些基本操作的逐步教學。
第 1 步. 建立 StatefulSet 檔。您可以輸入以下命令來做到這一點:
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi
步驟 2. 在程式碼編輯器中開啟此檔案並將以下程式碼寫入其中:
touch example-statefulset.yaml
第 3 步。 現在我們必須建立一個服務檔案和一個 PersistentVolumeClaim 檔案。
apiVersion: apps/v1 kind: StatefulSet metadata: name: gfg-example-statefulset annotations: description: "This is an example statefulset" spec: selector: matchLabels: app: nginx serviceName: "gfg-example-service" replicas: 3 # remember this, we will have 3 identical pods running template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumes: - name: www persistentVolumeClaim: claimName: myclaim
步驟 4. 在服務文件中輸入以下程式碼:
touch example-service.yaml touch example-persistentVolumeChain.yaml
第 5 步. 將以下程式碼輸入到 PersistentVolumeClaim 檔案中:
apiVersion: v1 kind: Service metadata: name: gfg-example-service annotations: description: "this is an example service" labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx
現在讓我們來套用這些變更。
步驟 6. 在終端機中輸入以下命令來建立 gfg-example-statefulset:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi # This means we are requesting for 8 GB of storage
這將創建我們的 gfg-example-statefulset,您將得到類似的結果:
現在,如果我們透過指令在終端機中搜尋 StatefulSets
kubectl create -f example-statefulset.yaml
我們將在清單中找到我們的 gfg-example-statefulset。
步驟 7. 在終端機中輸入以下命令以建立 gfg-example-service。
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: serviceName: "nginx" replicas: 4 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi
這將建立一個名為「gfg-example-service」的服務
第 8 步。 讓我們檢查我們的 pod 和服務,要取得 pod 列表,請在終端機中輸入以下命令:
touch example-statefulset.yaml
您將獲得我們透過在 example-stateful-set.yaml 檔案中定義三個副本所建立的三個 gfg-pod 的清單。您將得到類似的輸出:
要檢查服務列表,請在終端機中輸入以下命令:
apiVersion: apps/v1 kind: StatefulSet metadata: name: gfg-example-statefulset annotations: description: "This is an example statefulset" spec: selector: matchLabels: app: nginx serviceName: "gfg-example-service" replicas: 3 # remember this, we will have 3 identical pods running template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumes: - name: www persistentVolumeClaim: claimName: myclaim
這將為您提供類似的輸出:
新增StatefulSet: 若要將StatefulSet 新增至Kubernetes 叢集,請使用指令kubectl create -f [StatefulSet file name],將[StatefulSet filename] 替換為名稱您的名稱StatefulSet 清單檔案。
touch example-service.yaml touch example-persistentVolumeChain.yaml
刪除 StatefulSet: 要在 Kubernetes 中刪除 StatefulSet,可以使用 kubectl delete statefulset [name] 命令,其中 [name] 是您想要的 StatefulSet 的名稱刪除。
apiVersion: v1 kind: Service metadata: name: gfg-example-service annotations: description: "this is an example service" labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx
編輯 StatefulSet: 命令 kubectl edit statefulset [name] 允許您透過開啟編輯器直接從命令列修改 StatefulSet 的配置。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi # This means we are requesting for 8 GB of storage
副本擴充: kubectl scale 指令將名為 [StatefulSet name] 的 StatefulSet 中的副本數量縮放為指定的 [副本數量]。
kubectl create -f example-statefulset.yaml
第 9 步。 現在讓我們擴大我們的 pod 並檢查它是否有效!若要將 Pod 擴展到 6 個 Pod,請輸入以下指令:
kubectl get statefulsets
這將建立另外 3 個 pod,而 pod 數量現在為 6,要取得 pod 列表,請輸入以下命令:
kubectl apply -f example-service.yaml
您將會得到類似的輸出:
第 10 步。 現在讓我們將 Pod 縮小到 3 個,為此輸入相同的命令,只需將副本數更改回 3:
kubectl get pods
現在如果我們檢查 pod 清單
kubectl get services
您將看到只有 3 個 pod 正在運行:
透過這種方式,我們可以建立 StatefulSet,放大它們,然後縮小它們。確保在關閉終端之前刪除 StatefulSet 和服務。若要了解 kubectl 的更多命令,請參閱 Kubectl Command Cheat Sheet。
在MySQL等有狀態應用中,多個Pod不能同時讀寫數據,以避免數據不一致。
其中一個 pod 被指定為 master pod,負責寫入和更改數據,而其他 pod 被指定為 Slave pod,只允許讀取數據。
每個 Pod 都有自己的資料儲存副本,確保資料隔離和獨立。
採用同步機制來確保所有 pod 具有相同的資料狀態,當 master pod 變更資料時,從屬 pod 會更新其資料儲存。
持續同步對於維持有狀態應用程式中所有 pod 之間的資料一致性是必要的。
範例:
假設我們有一個 MySQL 主 pod 和兩個從 pod。現在,當新的 Pod 副本加入現有設定時會發生什麼?因為現在新的 Pod 也需要創建自己的儲存並負責同步,它首先克隆前一個 Pod 中的數據,然後開始持續同步以偵聽主 Pod 的任何更新。因為每個 Pod 都有自己的資料儲存(持久性磁碟區),而該資料儲存由自己的實體儲存備份,其中包括同步資料和 Pod 的狀態。每個 Pod 都有自己的狀態,其中包含有關它是主 Pod 還是從屬 Pod 的資訊以及其他單獨的特徵。所有這些都儲存在 Pod 自己的儲存中。因此,當 pod 死亡並被持久 pod 替換時。識別碼可確保儲存磁碟區重新連接到替換 Pod。這樣即使集群崩潰,也能保證資料不會遺失。
在本文中我們討論如何使用 Kubernetes StatefulSets。 StatefulSet 是用於部署有狀態應用程式的 Kubenetes 元件。有狀態應用程式是那些維護某種形式的持久狀態或資料的應用程式。一個很好的例子是任何帶有資料庫的應用程式。我們討論瞭如何使用 StatefulSet 部署有狀態應用程式。之後我們討論了有狀態應用程式如何運作?最後我們討論了 StatefulSet 和部署之間的區別,它基本上圍繞著部署用於部署無狀態應用程式和 StatefulSet 用於部署有狀態應用程式這一點。我們將透過解決一些常見問題解答來結束本文。
要增加 Kubernetes 中的磁碟區大小,您需要透過變更儲存大小來修改 PersistentVolumeClaim (PVC) 規格。然後,Kubernetes 會自動配置額外的儲存空間來滿足新的大小需求,前提是底層儲存類別支援動態配置。
Kubernetes 中的 hostPath 磁碟區類型適用於需要直接在 pod 內存取節點檔案系統上的檔案或目錄的場景。它通常用於存取特定於節點的資源或在同一節點上的容器之間共用資料。
StatefulSet 中的 PersistentVolumeClaims (PVC) 用於為各個 Pod 提供穩定、持久的存儲,確保 Pod 重新啟動時資料的持久性和身份。相較之下,部署通常使用臨時磁碟區,適用於不需要資料持久性的無狀態應用程式。
雖然技術上可行,但不建議使用 StatefulSet 部署無狀態應用程式。 StatefulSet 專為需要穩定、唯一識別碼和持久性儲存的有狀態應用程式而設計。使用 StatefulSet 部署無狀態應用程式可能會帶來不必要的複雜性和資源開銷。
這取決於應用程式的特定要求。無狀態應用程式更易於管理和水平擴展,而有狀態應用程式可維護資料完整性,並且更適合某些工作負載,例如資料庫或訊息傳遞系統。
以上是Kubernetes Statefulsets 初學者指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!