在 Kubernetes 中,StatefulSet 是一個專為有狀態應用設計的 API 對象,與無狀態的 Deployment 不同,StatefulSet 專門用來管理那些需要穩定網路標識、持久儲存和有序部署的應用場景。本文將詳細解說 StatefulSet 的核心概念、應用場景以及實際使用案例,幫助你更好地理解如何在 Kubernetes 中管理有狀態的應用。
穩定的網路標識:
web
,那麼 Pod 的名稱將依次為 web-0
、web-1
、web-2
。穩定的儲存:
有序部署與縮擴:
web-0
-> web-1
-> web-2
,而縮容則會按照反向順序進行。如圖所示,StatefulSet 管理多個 Pod(如 Web-0
, Web-1
, Web-2
),每個 Pod 都對應到一個穩定的 PersistentVolume(如 PV-0
, PV-1
, PV-2
)。這些 Pod 不僅擁有穩定的網路標識,還有與之綁定的持久儲存,即使 Pod 被刪除或重新調度,它們依然會連接到相同的PV。
分散式資料庫:
分散式檔案系統:
有狀態的應用服務:
以下是一個簡單的 StatefulSet YAML 設定檔案,用於部署一個帶有持久儲存的 NGINX 應用:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeClaimTemplates:
- metadata:
name: nginx-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
這個範例中:
serviceName
定義了 StatefulSet 管理的所有 Pod 共享的 Headless Service 名稱。volumeClaimTemplates
定義了每個 Pod 會使用的 PersistentVolumeClaim 樣板,從而保證每個 Pod 都擁有獨立的持久儲存卷。kubectl get statefulsets
可以查看當前Cluster中的所有 StatefulSet。kubectl get pods -l app=nginx
可以查看屬於指定 StatefulSet 的所有 Pod。kubectl scale statefulset <statefulset-name> --replicas=<number>
可以調整 StatefulSet 的 Pod 數量。StatefulSet 在 Kubernetes 中為有狀態的應用程式提供了穩定的網路標識、持久儲存和有序部署,特別適合那些需要保持狀態一致性的分佈式系統。理解和運用 StatefulSet 是在 Kubernetes 中管理有狀態應用的重要一環。在接下來的學習中,我們將探討 Kubernetes 中的DaemonSet,它主要用於系統級應用,確保每個節點上都能運行一個特定的 Pod。