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

K8s控制器终极对比:StatefulSet与Deployment详解

K8s 核心控制器详解:StatefulSet 与 Deployment 的区别,一篇看懂!

在 Kubernetes(简称 K8s)的世界里,DeploymentStatefulSet就像 “两种不同的快递配送方案”—— 前者适合送 “无差别批量货物”(如同一批次的矿泉水),后者适合送 “带编号的定制包裹”(如刻了名字的礼品盒)。它们都是 K8s 用来管理容器的 “控制器”,但适用场景、特性完全不同,选错了会导致服务故障(比如用 Deployment 部署 MySQL 主从,数据会丢!)。

今天这篇博客,咱们用 “生活化比喻 + 实操案例”,把这两个控制器讲透,帮你下次部署服务时不再选错!

一、先搞懂基础:什么是 K8s 控制器?

在讲具体区别前,先简单铺垫:K8s 控制器的核心作用是 “确保容器按照你的预期运行”—— 比如你要求 “启动 3 个 Nginx 容器”,控制器会盯着这 3 个容器,万一某个挂了,立刻自动重建,保证始终是 3 个。

Deployment 和 StatefulSet 都是最常用的控制器,但针对的 “容器类型” 不同:

  • Deployment:管 “无状态容器”(容器之间没区别,随便换);
  • StatefulSet:管 “有状态容器”(容器有专属身份,不能乱换)。

先记住这个核心区别,下面慢慢展开。

二、Deployment:无状态容器的 “批量管理专家”

1. 什么是 “无状态容器”?用比喻理解

你可以把无状态容器想象成 “路边的共享单车”:

  • 所有单车长得一样(容器镜像相同);
  • 你骑哪一辆都一样(没有专属身份,换一辆不影响使用);
  • 车坏了直接换一辆(容器挂了,重建一个新的就行,数据不用保留)。

典型例子:Nginx 静态网站、API 接口服务(如查询天气的接口)—— 这些服务不存储专属数据,多个容器之间完全等价。

2. Deployment 的核心特性:“随便换,不心疼”

Deployment 管理无状态容器时,有 3 个关键特性,决定了它 “灵活、简单” 的特点:

(1)Pod 名字 “随机化”:没有专属身份

当你用 Deployment 启动 3 个 Nginx 容器时,K8s 会给每个容器(准确说是 Pod)起一个 “随机名”,比如:

nginx-deployment-7f98d7c6b4-2xq3w、nginx-deployment-7f98d7c6b4-5z7k9、nginx-deployment-7f98d7c6b4-8a1s2

名字里的 “2xq3w”“5z7k9” 是随机字符串 —— 这意味着 “每个 Pod 没有专属身份,换一个新的完全一样”。

(2)存储 “不绑定”:数据随 Pod 消失

Deployment 的 Pod 默认用 “临时存储”,就像共享单车的 “临时储物筐”—— 你放的东西,车被别人骑走(Pod 删除),东西就没了。

如果需要存储,Deployment 也能挂载存储卷(如 PVC),但多个 Pod 会共享同一个存储(比如 3 个 Nginx 共享一个存储卷放静态文件),不存在 “专属存储”。

(3)更新 “无序化”:想更哪个就更哪个

当你需要升级 Nginx 版本(比如从 1.20 升到 1.24),Deployment 会 “无序更新”—— 随便挑一个 Pod 先删了重建(新镜像),再挑下一个,不用按顺序。

因为 Pod 之间无差别,无序更新不会影响服务(比如更新时,总有其他 Pod 在提供服务,用户感知不到中断)。

3. Deployment 实操案例:部署 Nginx 静态网站

用 Deployment 部署 Nginx 的 YAML 配置(关键部分简化):

 
apiVersion: apps/v1kind: Deployment # 控制器类型是Deploymentmetadata:name: nginx-deploymentspec:replicas: 3 # 启动3个Podselector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.20 # 容器镜像ports:- containerPort: 80volumeMounts:- name: html-volume # 挂载存储卷mountPath: /usr/share/nginx/htmlvolumes:- name: html-volumepersistentVolumeClaim:claimName: nginx-pvc # 3个Pod共享这个PVC

部署后,3 个 Nginx Pod 共享同一个存储卷,提供静态网站服务 —— 随便删一个 Pod,K8s 会重建一个新的,用户完全没感觉。

三、StatefulSet:有状态容器的 “专属管家”

1. 什么是 “有状态容器”?用比喻理解

有状态容器就像 “小区里的快递柜”:

  • 每个柜子有专属编号(1 号柜、2 号柜…… 不能乱换);
  • 每个柜子里的东西是专属的(1 号柜的东西只能 1 号柜的主人取,换柜子就错了);
  • 柜子坏了,要先把旧柜子的东西移到新柜子,再用同一个编号(不能换编号)。

典型例子:MySQL 主从集群(主库是 1 号,从库是 2 号,不能搞反)、ZooKeeper 集群(每个节点有专属 ID,影响集群选举)—— 这些服务需要 “专属身份、专属存储、固定顺序”。

2. StatefulSet 的核心特性:“专属、有序、不混乱”

StatefulSet 管理有状态容器时,3 个核心特性刚好和 Deployment 相反,确保 “每个 Pod 都有专属身份”:

(1)Pod 名字 “固定化”:有专属编号

当你用 StatefulSet 启动 3 个 MySQL Pod 时,K8s 会给每个 Pod 起一个 “固定名”,格式是 “StatefulSet名-编号”,比如:

mysql-statefulset-0、mysql-statefulset-1、mysql-statefulset-2

编号从 0 开始,固定不变 —— 哪怕 Pod 挂了重建,名字还是mysql-statefulset-0,不会变。这个编号就是 Pod 的 “专属身份”,主库可以固定用 0 号,从库用 1、2 号。

(2)存储 “绑定化”:每个 Pod 有专属存储

StatefulSet 会为每个 Pod 创建 “专属的存储卷”—— 比如 0 号 Pod 对应mysql-pvc-0,1 号 Pod 对应mysql-pvc-1,2 号对应mysql-pvc-2。

这些存储卷和 Pod 的编号绑定,就算 Pod 删除重建,新的mysql-statefulset-0还是会挂载mysql-pvc-0—— 数据不会丢,专属存储永远跟着专属 Pod。

(3)操作 “有序化”:启动、更新、删除都要按顺序

StatefulSet 的所有操作(启动、升级、删除)都必须 “按编号顺序” 来,不能乱:

  • 启动:先启动 0 号 Pod,成功后再启动 1 号,最后启动 2 号(确保主库先起来,从库再连主库同步数据);
  • 升级:先升级 2 号,再升级 1 号,最后升级 0 号(先更从库,再更主库,避免主库先更导致同步中断);
  • 删除:先删 2 号,再删 1 号,最后删 0 号(先停从库,再停主库,符合数据库集群的关闭逻辑)。

这种 “有序操作” 是 StatefulSet 的核心,确保有状态服务不会因为操作顺序错而崩溃。

3. StatefulSet 实操案例:部署 MySQL 主从集群

用 StatefulSet 部署 MySQL 主从的关键逻辑(简化):

  1. 创建 StatefulSet,名字叫mysql-statefulset, replicas=3(1 主 2 从);
  1. 每个 Pod 对应专属 PVC:mysql-pvc-0(主库存储)、mysql-pvc-1(从库 1 存储)、mysql-pvc-2(从库 2 存储);
  1. 通过 “初始化脚本” 给每个 Pod 分配角色:0 号 Pod 是主库(开启 binlog),1、2 号是从库(连接 0 号主库同步数据);
  1. 升级时,先更 1、2 号从库,最后更 0 号主库,避免同步中断。

关键 YAML 配置(简化):

 
apiVersion: apps/v1kind: StatefulSet # 控制器类型是StatefulSetmetadata:name: mysql-statefulsetspec:serviceName: mysql-service # 必须指定Service,用于Pod间通信replicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalue: "123456"volumeMounts:- name: mysql-data # 挂载专属存储mountPath: /var/lib/mysqlvolumeClaimTemplates: # 存储卷模板:自动为每个Pod创建专属PVC- metadata:name: mysql-dataspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 10Gi

这里的volumeClaimTemplates是关键 ——StatefulSet 会根据这个模板,自动为每个 Pod 创建 “mysql-data-mysql-statefulset-0”“mysql-data-mysql-statefulset-1” 这样的专属 PVC,确保数据不混乱。

四、核心区别对比:一张表看懂 Deployment vs StatefulSet

为了让大家更清晰,我整理了两者的核心区别,从 6 个维度对比:

对比维度

Deployment(无状态)

StatefulSet(有状态)

Pod 身份

随机名(如 xxx-2xq3w),无专属身份

固定名(如 xxx-0/1/2),有专属编号

存储方式

共享存储(多个 Pod 用一个 PVC)或临时存储

专属存储(每个 Pod 对应一个 PVC,自动创建)

操作顺序

无序(启动 / 更新 / 删除随便选 Pod)

有序(按编号 0→1→2 启动,2→1→0 删除)

网络标识

共享 Service(所有 Pod 通过一个 Service 访问)

每个 Pod 有专属 DNS(如 xxx-0.xxx-service)

适用场景

无状态服务(Nginx、API 接口、静态网站)

有状态服务(MySQL、ZooKeeper、Redis 集群)

复杂度

简单(配置少,不用考虑顺序和存储绑定)

复杂(需配置 Service、存储模板,考虑顺序)

五、关键总结:怎么选?记住这 2 个原则

  1. 选 Deployment 的情况
    • 你的服务不需要 “专属身份”(多个实例完全一样);
    • 服务不存储专属数据(或多个实例共享数据);
    • 希望操作简单(启动、更新快,不用管顺序);
    • 典型场景:Nginx、Tomcat、API 服务、前端静态网站。
  1. 选 StatefulSet 的情况
    • 你的服务需要 “专属身份”(比如主从、节点编号);
    • 服务需要 “专属存储”(每个实例的数据不能共享);
    • 操作需要 “按顺序”(启动、更新、删除不能乱);
    • 典型场景:数据库集群(MySQL、PostgreSQL)、分布式协调服务(ZooKeeper、etcd)、缓存集群(Redis 主从 / 集群)。

六、常见误区:这些坑别踩!

  1. 用 Deployment 部署 MySQL 主从
    • 后果:Pod 名字随机,主从角色会乱(下次重启,可能原来的主库变成从库);存储共享,数据会冲突覆盖,最终导致集群崩溃。
  1. 用 StatefulSet 部署无状态服务(如 Nginx)
    • 后果:没必要的复杂 —— 要配置专属存储、有序更新,反而增加运维成本(比如更新 Nginx 时,还要按顺序等,效率低)。
  1. 忘记给 StatefulSet 配置 Service
    • 后果:StatefulSet 的 Pod 需要专属 DNS(如 xxx-0.xxx-service)来通信,没配置 Service,Pod 之间找不到对方(比如 MySQL 从库连不上主库)。

希望这篇博客能帮你彻底搞懂 Deployment 和 StatefulSet 的区别!下次在 K8s 中部署服务时,先想清楚 “我的服务是共享单车还是快递柜”,再选对应的控制器,就能少走很多弯路~ 如果有疑问,欢迎在评论区交流!

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

相关文章:

  • [Agent可视化] docs | go/rust/py混构 | Temporal编排 | WASI沙箱
  • Linux服务器编程实践55-网络信息API:gethostbyname与gethostbyaddr实现主机名解析
  • Godot 2D游戏开发全流程实战
  • 自动驾驶工程师面试(定位、感知向)
  • Cocos学习——摄像机Camera
  • 千秋网站建设公司百度如何快速收录
  • 深圳大型论坛网站建设免费行情网站在线
  • 《软件测试分类指南(下):从测试阶段到地域适配,拆解落地核心维度》
  • Python 查询网站开发3g小说网站
  • 基于Python的Word文档模板自动化处理:从占位符提取到智能填充
  • vue3子组件向父组件传递参数
  • 阿里云云代理商:阿里云CDN刷新机制是什么?
  • FFmpeg 基本数据结构 AVFormatConext 分析
  • 使用 DrissionPage——实现同花顺股票数据自动化爬虫
  • 基于位置式PID算法调节PWM占空比实现电机转速控制
  • FFmpeg+QT输出音频
  • 友点企业网站管理系统微信商城在哪里找
  • 深度学习(5)-PyTorch 张量详细介绍
  • 西安市建设厅网站软文营销的经典案例
  • Agent 开发设计模式(Agentic Design Patterns )第8章: 智能体记忆管理(Memory Management)
  • Linux 下使用 Docker-Compose 安装 Kafka 和 Kafka-UI(KRaft 模式)
  • 【C++入门篇 - 10】:模板
  • [Linux]学习笔记系列 -- [kernel][lock]mutex
  • 开源 Linux 服务器与中间件(七)数据库--MySQL
  • 在 JavaScript 中处理 `0.1 + 0.2` 这类精度问题
  • 今天我们学习python编程常用模块与面向对象
  • 网站的三大标签宁波专业seo服务
  • Day6C语言前期阶段练习之汉诺塔问题
  • Apache Spark 集群部署与使用指南
  • 基于3D LiDAR的作物排检,用于在不同种植密度下成熟时的大豆