目錄
一、Deployment
?一、Deployment 原理?
?二、核心特性?
?三、意義與場景?
?四、示例與逐行解釋?
?五、總結?
StatefulSet
?一、StatefulSet 原理?
?二、核心特性?
?三、意義與場景?
?四、示例與逐行解釋?
?五、總結?
?彼此的區別
一、本質區別?
?二、核心特性對比?
1. ?Pod 標識與網絡?
2. ?存儲管理?
3. ?擴縮容與更新?
4. ?服務發現?
?三、運維約束對比?
?四、強制使用 StatefulSet 的場景?
?五、總結?
一、Deployment
?一、Deployment 原理?
-
?核心功能?:
- 管理 ?無狀態應用? 的 Pod 副本集(通過控制 ReplicaSet 實現),支持聲明式更新、滾動升級和回滾。
- 通過 ?控制器模式? 監聽集群狀態,確保實際 Pod 數量與期望值一致。
-
?工作流程?:
- ?版本控制?:每次更新會創建新的 ReplicaSet,逐步替換舊 Pod(滾動更新)或直接全量替換(重建更新)。
- ?回滾機制?:記錄歷史版本,可快速回退到任意修訂版本。
?二、核心特性?
?特性? | ?說明? |
---|---|
?多副本管理? | 通過?replicas ?字段維持指定數量的 Pod,自動擴縮容。 |
?滾動更新? | 支持逐步替換舊 Pod(可配置?maxUnavailable ?和?maxSurge )。 |
?版本回滾? | 使用?kubectl rollout undo ?回退到歷史版本。 |
?健康檢查? | 集成 Liveness/Readiness 探針,確保服務可用性。 |
?暫停與恢復? | 暫停更新(kubectl rollout pause )以手動調試。 |
?三、意義與場景?
- ?意義?:
- 實現應用發布的?零停機更新?,提升 DevOps 效率。
- 為微服務提供高可用、自愈的底層支撐。
- ?典型場景?:Web 服務、API 后端、無狀態計算任務等。
?四、示例與逐行解釋?
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginxspec:replicas: 3selector:matchLabels:app: nginxstrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.19ports:- containerPort: 80livenessProbe:httpGet:path: /port: 80initialDelaySeconds: 5periodSeconds: 10
?逐行解釋?:
apiVersion: apps/v1
:使用?apps
?組的 API 版本。kind: Deployment
:聲明資源類型為 Deployment。replicas: 3
:維持 3 個 Pod 副本。selector.matchLabels
:選擇標簽為?app=nginx
?的 Pod 管理。strategy
:定義滾動更新策略,最多允許 1 個 Pod 不可用(maxUnavailable
)和 1 個臨時超額 Pod(maxSurge
)。template
:Pod 模板,包含容器配置(Nginx 1.19 鏡像)和健康檢查(每 10 秒檢測 80 端口)。
?五、總結?
Deployment 是 Kubernetes 管理無狀態應用的?核心控制器?,通過自動化副本管理、滾動更新和回滾機制,顯著提升應用部署的可靠性和靈活性。
StatefulSet
?一、StatefulSet 原理?
-
?核心功能?:
- 管理?有狀態應用?(如數據庫、消息隊列),為每個 Pod 提供?穩定的唯一標識?(有序編號、持久化存儲、固定網絡標識)。
- 通過 ?Headless Service? 為每個 Pod 分配唯一的 DNS 記錄(如?
pod-name.svc-name.namespace.svc.cluster.local
)。
-
?工作流程?:
- ?有序部署/擴縮容?:Pod 按順序創建(從 0 到 N-1)或刪除(從 N-1 到 0),確保依賴關系(如主從數據庫)。
- ?持久化存儲?:通過?
volumeClaimTemplates
?為每個 Pod 動態綁定獨立的 PersistentVolume(PV)。
?二、核心特性?
?特性? | ?說明? |
---|---|
?穩定標識? | Pod 名稱(如?web-0 、web-1 )和 DNS 記錄在生命周期內保持不變。 |
?有序管理? | 支持順序啟停(OrderedReady )或并行(Parallel )策略。 |
?持久化存儲? | 每個 Pod 綁定獨立的 PV,數據不受 Pod 重建影響。 |
?網絡穩定性? | 通過 Headless Service 提供固定網絡端點。 |
?三、意義與場景?
- ?意義?:
- 解決有狀態應用的?數據持久性?和?拓撲穩定性?問題,填補 Deployment 的不足。
- ?典型場景?:MySQL 集群、MongoDB 副本集、ZooKeeper 等分布式系統。
?四、示例與逐行解釋?
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: mysql-headlessreplicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec: containers:- name: mysqlimage: mysql:5.7ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gi
?逐行解釋?:
apiVersion: apps/v1
:使用?apps
?組 API。kind: StatefulSet
:聲明資源類型。serviceName: mysql-headless
:關聯的 Headless Service 名稱。replicas: 3
:創建 3 個有序 Pod(mysql-0
、mysql-1
、mysql-2
)。volumeMounts
:將名為?mysql-data
?的卷掛載到容器路徑?/var/lib/mysql
。volumeClaimTemplates
:為每個 Pod 動態創建 10Gi 的 PVC(名稱格式為?mysql-data-mysql-X
)。
?五、總結?
StatefulSet 是 Kubernetes 管理有狀態應用的?核心控制器?,通過唯一標識、有序管理和持久化存儲,為分布式系統提供穩定運行環境。
?彼此的區別
一、本質區別?
?維度? | ?Deployment? | ?StatefulSet? |
---|---|---|
?設計目標? | 管理?無狀態應用?(Pod 可任意替換) | 管理?有狀態應用?(Pod 需唯一標識與持久存儲) |
?典型場景? | Web 服務、API 后端、無狀態計算任務 | 數據庫(MySQL/MongoDB)、消息隊列(Kafka) |
?二、核心特性對比?
1. ?Pod 標識與網絡?
- ?Deployment?:
- Pod 名稱隨機生成(如?
nginx-5f76c6cb6d-hx8vp
),重啟后改變。 - 通過 Service 負載均衡訪問,無固定網絡端點。
- Pod 名稱隨機生成(如?
- ?StatefulSet?:
- Pod 名稱有序固定(如?
mysql-0
、mysql-1
),生命周期內不變。 - 每個 Pod 有獨立 DNS 記錄(
pod-name.service-name.namespace.svc.cluster.local
)。
- Pod 名稱有序固定(如?
2. ?存儲管理?
- ?Deployment?:
- Pod 共享存儲卷或無持久化存儲,數據隨 Pod 銷毀丟失。
- ?StatefulSet?:
- 通過?
volumeClaimTemplates
?為每個 Pod 動態綁定獨立 PV,數據持久化。 - 存儲與 Pod 嚴格綁定,重建后自動關聯原數據。
- 通過?
3. ?擴縮容與更新?
- ?Deployment?:
- 并行擴縮容,無順序限制。
- 支持滾動更新(RollingUpdate),可配置?
maxSurge
/maxUnavailable
。
- ?StatefulSet?:
- ?順序操作?:擴容從 0→N-1,縮容從 N-1→0。
- 滾動更新默認逐個替換 Pod,保障數據一致性。
4. ?服務發現?
- ?Deployment?:
- 通過 ClusterIP Service 實現負載均衡。
- ?StatefulSet?:
- 依賴 ?Headless Service?(無 ClusterIP),直接暴露 Pod DNS。
?三、運維約束對比?
?特性? | ?Deployment? | ?StatefulSet? |
---|---|---|
?Pod 唯一性? | ? | ?(固定名稱/DNS) |
?持久化存儲獨占性? | ? | ?(每 Pod 獨立 PVC) |
?有序啟停? | ? | ?(順序保障) |
?復雜度? | 低 | 高(需配置 Headless Service + PVC) |
?四、強制使用 StatefulSet 的場景?
- ?需穩定網絡標識?:如數據庫主從節點需固定域名通信。
- ?獨立持久化存儲?:每個 Pod 需專屬數據卷(如 MySQL 主備數據分離)。
- ?依賴啟動順序?:集群初始化需嚴格按序(如 ZooKeeper 選舉)。
💡 ?例外?:若僅需共享存儲(非獨占),可使用 Deployment + 共享 PVC。
?五、總結?
- ?無狀態服務選 Deployment?:強調彈性伸縮、簡易運維(如 Web 服務)。
- ?有狀態服務選 StatefulSet?:需穩定標識、持久存儲、順序保障(如數據庫集群)。
- ?慎用 StatefulSet?:若非必要,優先用 Deployment(簡化架構)。
通過此對比,可根據應用特性精準選擇控制器,避免過度設計或功能缺失。