当前位置: 首页 > news >正文

Deployment 和 StatefulSet 的区别

在 Kubernetes(k8s)中,Deployment 和 StatefulSet 是两种核心的工作负载控制器(Workload Controller),均用于管理 Pod 的创建、扩展和运维,但它们的设计目标、核心特性和适用场景存在本质区别,核心差异围绕 “无状态” 与 “有状态” 应用的管理需求展开。
一、核心定位与设计目标

二、核心特性对比
1. Pod 身份与名称
Deployment:Pod 名称是随机生成的(格式:[deployment-name]-[replica-set-name]-[随机字符串],例如 nginx-deploy-7f98d7c6b4-2xqzk),Pod 重启或重建后名称会变化,无固定身份。所有 Pod 逻辑上是 “完全等价的”,可被 Service 随机负载均衡。
StatefulSet:Pod 名称是固定且有序的(格式:[statefulset-name]-[序号],例如 mysql-sts-0、mysql-sts-1),序号从 0 开始递增,Pod 重启 / 重建后名称和序号保持不变,即 “身份唯一”。Service 会通过 “主机名”(与 Pod 名称一致)精准定位每个 Pod,而非随机负载均衡。
2. 网络标识(DNS 与访问)
Deployment:依赖 Kubernetes 的 Service(ClusterIP/NodePort) 提供访问入口,Service 通过 “标签选择器” 匹配 Pod,所有 Pod 共享同一个 Service IP,访问时由 Service 随机转发到任意 Pod(无状态特性)。Pod 的 DNS 记录是临时的(随 Pod 重建失效),无法通过固定域名访问单个 Pod。
StatefulSet:必须配合 Headless Service(无头服务) 使用 ——Headless Service 不分配 ClusterIP,而是为每个 Pod 生成固定的 DNS 域名(格式:[pod-name].[headless-service-name].[namespace].svc.cluster.local,例如 mysql-sts-0.mysql-svc.default.svc.cluster.local)。外部可通过固定 DNS 域名直接访问某个特定 Pod(例如访问 mysql-sts-0 作为主库),网络标识与 Pod 生命周期强绑定。
3. 持久化存储(PVC/PV)
Deployment:无状态应用通常不需要 “专属存储”(或仅需临时存储 emptyDir),若使用持久化存储(PVC),所有 Pod 会共享同一个 PVC(即访问同一份存储数据),无法实现 “每个 Pod 对应独立存储”。例如:多个 Nginx Pod 共享一个 PVC 存储静态文件,数据对所有 Pod 一致。
StatefulSet:有状态应用需要 “每个 Pod 对应独立存储”(例如数据库主从节点各存自己的数据),StatefulSet 支持 PVC 模板(volumeClaimTemplates):
为每个 Pod 自动创建一个 “与 Pod 名称绑定的 PVC”(格式:[pvc-template-name]-[statefulset-name]-[序号],例如 mysql-pvc-mysql-sts-0);
Pod 重建时,会自动挂载原 PVC,确保数据不丢失(存储与 Pod 身份绑定,而非 Pod 实例)。
例如:mysql-sts-0 对应 mysql-pvc-mysql-sts-0,重建后仍使用该 PVC,数据不变。
4. 部署与更新策略
Deployment:
部署顺序:所有 Pod 并行创建(无顺序),快速完成部署;
更新策略:默认 “滚动更新(RollingUpdate)”,逐个替换旧 Pod(确保服务不中断),也支持 “重建更新(Recreate)”(先删所有旧 Pod 再建新 Pod);
扩展 / 缩容:随机增加 / 删除 Pod,无顺序要求。
StatefulSet:
部署顺序:严格按 “序号递增” 创建(先 0、再 1、最后 n),前一个 Pod 就绪(Ready)后才创建下一个,确保有状态应用的依赖关系(例如先启动主库 0,再启动从库 1);
更新策略:默认 “有序更新(OrderedReady)”,按 “序号递减” 更新(先 n、再 n-1、最后 0),避免核心 Pod(如主库 0)先更新导致服务中断;也支持 “并行更新(Parallel)”(类似 Deployment,但极少用于有状态场景);
扩展 / 缩容:扩展时按序号递增创建新 Pod,缩容时按序号递减删除 Pod(确保从库先删,主库后删)。
5. 适用场景

三、关键区别总结表

四、总结
选择 Deployment 还是 StatefulSet,核心是判断应用的 “状态需求”:
若应用无状态(数据不持久化、实例等价、可随机替换),优先用 Deployment(简单、高效、易运维);
若应用有状态(需固定身份、独立存储、有序部署 / 更新),必须用 StatefulSet(确保数据安全和实例一致性)。

http://www.dtcms.com/a/474131.html

相关文章:

  • 广州自助网站制作网站开发成app
  • LeetCode 396 - 旋转函数 (Rotate Function)
  • 服装公司网站策划书网站无法连接服务器
  • 【C++篇】:LogStorm——基于多设计模式下的同步异步高性能日志库项目
  • php怎么做网站怎么做试玩平台推广网站
  • go语言:在 Win10上,如何编译 ffuf-v2.1.0?
  • 做网站没装数据库建站 网站程序
  • 有哪些做高考模拟卷的网站做第一个网站什么类型
  • Maven 设置项目编码,防止编译打包出现编码错误
  • 【Linux】文件系统之缓冲区
  • 【检索:数据库】6、B+树数据库索引全解析:如何为海量磁盘数据构建毫秒级检索系统
  • 创意设计公司网站dede一键更新网站出错
  • 使用Python高效读取ZIP压缩文件中的UTF-8 JSON数据到Pandas和PySpark DataFrame
  • 基于Spring Boot + Vue 3的乡村振兴综合服务平台性能优化与扩展实践
  • 基于单片机的声光控制楼道灯(论文+源码)
  • 网站运营分析云平台网站建设方案
  • 【Linux】进程间同步与互斥(下)
  • 现成的手机网站做APP手机网站开发教程pdf
  • 【栈】5. 验证栈序列(medium)
  • Leetcode之 Hot 100
  • 建立能网上交易的网站多少钱wordpress调取多个分类文章
  • MySQL 索引:原理、分类与操作指南
  • Blender机箱盒体门窗铰链生成器资产预设 Hingegenious
  • 网站托管就业做美食有哪些网站
  • 神经符号AI的深度探索:从原理到实践的全景指南
  • 零食网站建设规划书建行输了三次密码卡锁怎么解
  • Python代码示例
  • 济南市历下区建设局官方网站wordpress高级套餐
  • ALLEGRO X APD版图单独显示某一网络的方法
  • 计算机网络基础篇——如何学习计算机网络?