K8s中 statefulset 和deployment的区别

在 Kubernetes 中,StatefulSetDeployment 是两种管理 Pod 的控制器,它们的主要区别在于 状态管理Pod 的标识。以下是详细对比:


1. 功能定位

Deployment

  • 用途:用于 无状态应用 的部署,例如 Web 服务、API 服务等。
  • 特点
    • 每个 Pod 是完全独立的,没有严格的顺序或唯一性要求。
    • 适用于场景:服务是无状态的,多个副本的实例可以随时替换、扩缩。

StatefulSet

  • 用途:用于 有状态应用 的部署,例如数据库、分布式缓存、分布式文件系统等。
  • 特点
    • 提供对 Pod 顺序启动、停止 的控制。
    • 为每个 Pod 分配一个固定的标识(Stable Identity)。
    • 适用于场景:应用需要持久化数据或对实例的顺序、标识有严格要求。

2. Pod 标识和命名

Deployment

  • 每个 Pod 都是无状态的,没有固定的名称或标识。
  • 如果 Pod 被删除,一个新 Pod 会创建,且新 Pod 的名称不同。
  • 示例:nginx-abcdef123(随机生成的后缀)。

StatefulSet

  • 每个 Pod 都有固定的名称和编号(Stable Identity)。
  • 即使 Pod 被删除,重新创建后仍然保持相同的名称。
  • 示例:nginx-0, nginx-1, nginx-2

3. 存储卷管理

Deployment

  • 默认使用临时存储(ephemeral storage),Pod 重启后数据会丢失。
  • 如果需要持久化存储,需要手动配置 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)。

StatefulSet

  • 每个 Pod 都会拥有自己的持久化存储(Persistent Volume),并且存储卷与 Pod 的标识绑定。
  • 如果 Pod 被删除或重建,其关联的存储卷不会被删除,数据可以恢复。

4. Pod 的启动顺序

Deployment

  • Pod 的启动顺序无关紧要,Kubernetes 会尽快启动所有 Pod,彼此之间没有依赖关系。

StatefulSet

  • Pod 的启动是 有序 的:
    • 顺序启动:Pod-0 -> Pod-1 -> Pod-2...
    • 顺序删除:Pod-N -> Pod-(N-1) -> ...
    • 对于某些应用程序(如主从数据库),这种顺序启动/停止特性是必需的。

5. 更新机制

Deployment

  • 支持 滚动更新,即逐步替换旧 Pod,直到所有 Pod 更新完成。
  • 更新速度可以通过 maxSurgemaxUnavailable 参数控制。

StatefulSet

  • 同样支持滚动更新,但默认是 逐个更新(按照 Pod 的编号顺序)。
  • 需要确保新的 Pod 启动后,旧的 Pod 才会更新。

6. 应用场景

特性DeploymentStatefulSet
使用场景无状态服务有状态服务
数据持久化不提供默认支持(需手动配置)每个 Pod 绑定专属存储卷
启动顺序无关严格的顺序(0 -> N)
Pod 的标识动态生成的名称固定名称(<name>-<编号>
横向扩展支持支持
典型应用场景Web 服务、API 服务数据库、Kafka、Redis 集群

7. 示例对比

Deployment 示例

用于无状态 Web 服务:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.21ports:- containerPort: 80
  • 部署后会创建 3 个副本 Pod,例如:nginx-xyz12, nginx-abc34, nginx-uvw56

StatefulSet 示例

用于有状态服务(如 Redis):

apiVersion: apps/v1
kind: StatefulSet
metadata:name: redis
spec:serviceName: "redis"replicas: 3selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:6.2ports:- containerPort: 6379volumeClaimTemplates:- metadata:name: redis-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 1Gi
  • 部署后会创建 Pod:
    • redis-0, redis-1, redis-2
    • 每个 Pod 绑定自己的存储卷 redis-data-redis-0, redis-data-redis-1

8. 选择哪种控制器?

使用 Deployment 的场景

  • 无状态服务,例如:
    • Web 应用
    • API 网关
    • 任务处理服务

使用 StatefulSet 的场景

  • 有状态服务,例如:
    • 数据库(MySQL、PostgreSQL、MongoDB 等)
    • 分布式存储(Cassandra、HDFS 等)
    • 缓存服务(Redis、ZooKeeper、Kafka 等)

总结

  • Deployment 是通用的控制器,适合大多数无状态应用场景。
  • StatefulSet 则为有状态服务提供独特的支持,例如持久化存储和固定标识。
  • 根据应用是否需要持久化存储、顺序启动/停止、固定 Pod 标识来选择适合的控制器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/491835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【功能安全】随机硬件失效导致违背安全目标的评估(FMEDA)

目录 01 随机硬件失效介绍 02 FMEDA介绍 03 FMEDA模板 01 随机硬件失效介绍 GBT 34590 part5

mybatis 的动态sql 和缓存

动态SQL 可以根据具体的参数条件&#xff0c;来对SQL语句进行动态拼接。 比如在以前的开发中&#xff0c;由于不确定查询参数是否存在&#xff0c;许多人会使用类似于where 1 1 来作为前缀&#xff0c;然后后面用AND 拼接要查询的参数&#xff0c;这样&#xff0c;就算要查询…

Web APIs - 第5章笔记

目标&#xff1a; 依托 BOM 对象实现对历史、地址、浏览器信息的操作或获取 具备利用本地存储实现学生就业表案例的能力 BOM操作 综合案例 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。 比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DO…

AI视频配音技术创新应用与商业机遇

随着人工智能技术的飞速发展&#xff0c;AI视频配音技术已经成为内容创作者和营销人员的新宠。这项技术不仅能够提升视频内容的吸引力&#xff0c;还能为特定行业带来创新的解决方案。本文将探讨AI视频配音技术的应用场景&#xff0c;并讨论如何合法合规地利用这一技术。 AI视频…

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法&#xff0c;vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…

Java每日一题(1)

给定n个数a1,a2,...an,求它们两两相乘再相加的和。 即&#xff1a;Sa1*a2a1*a3...a1*ana2*a3...an-2*an-1an-2*anan-1*an 第一行输入的包含一个整数n。 第二行输入包含n个整数a1,a2,...an。 样例输入 4 1 3 6 9 样例输出 117 答案 import java.util.Scanner; // 1:无…

Redis应用—6.热key探测设计与实践

大纲 1.热key引发的巨大风险 2.以往热key问题怎么解决 3.热key进内存后的优势 4.热key探测关键指标 5.热key探测框架JdHotkey的简介 6.热key探测框架JdHotkey的组成 7.热key探测框架JdHotkey的工作流程 8.热key探测框架JdHotkey的性能表现 9.关于热key探测框架JdHotke…

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者&#xff1a;来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么&#xff1f; Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…

python爬虫入门教程

安装python 中文网 Python中文网 官网 安装好后打开命令行执行&#xff08;如果没有勾选添加到Path则注意配置环境变量&#xff09; python 出现如上界面则安装成功 设置环境变量 右键我的电脑->属性 设置下载依赖源 默认的是官网比较慢&#xff0c;可以设置为清华大…

数据结十大排序之(冒泡,快排,并归)

接上期&#xff1a; 数据结十大排序之&#xff08;选排&#xff0c;希尔&#xff0c;插排&#xff0c;堆排&#xff09;-CSDN博客 前言&#xff1a; 在计算机科学中&#xff0c;排序算法是最基础且最重要的算法之一。无论是大规模数据处理还是日常的小型程序开发&#xff0c;…

游戏引擎学习第54天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体&#xff0c;这些实体位于玩家的视野中&#xff0c;频繁更新&#xff0c;而那些离玩家较远的实体则以较低的频率运…

网络安全漏洞挖掘之漏洞SSRF

SSRF简介 SSRF(Server-Side Request Forgery:服务器端请求伪造是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连而与外…

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…

Go有限状态机实现和实战

Go有限状态机实现和实战 有限状态机 什么是状态机 有限状态机&#xff08;Finite State Machine, FSM&#xff09;是一种用于建模系统行为的计算模型&#xff0c;它包含有限数量的状态&#xff0c;并通过事件或条件实现状态之间的转换。FSM的状态数量是有限的&#xff0c;因此称…

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片

在计算机时代&#xff0c;我们依靠手机来捕捉和存储珍贵的回忆。但是&#xff0c;如果您不小心删除或丢失了手机上的照片怎么办&#xff1f;这真的很令人沮丧和烦恼&#xff0c;不是吗&#xff1f;好吧&#xff0c;如果您在 iPhone 上丢失了照片&#xff0c;您不必担心&#xf…

Linux高性能服务器编程 | 读书笔记 | 6. 高性能服务器程序框架

6. 高性能服务器程序框架 《Linux 高性能服务器编程》一书中&#xff0c;把这一章节作为全书的核心&#xff0c;同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后&#xff0c;正式进入了 Web 服务器项目的核心部分的学习 文章目录 6. 高性能服务器程序框架1.服…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

Xcode

info.plist Appearance Light 关闭黑暗模式 Bundle display name 设置app名称&#xff0c;默认为工程名 Location When In Use Usage Description 定位权限一共有3个key 1.Privacy - Location When In Use Usage Description 2.Privacy - Location Always and When In U…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

【Java 学习】:内部类详解

详谈Java内部类 &#x1f4c3;&#x1f4c3;本文将通过Java内部类 是什么&#xff0c;为什么被广泛使用&#xff0c;以及又该如何去使用这三个方面来详细讲解其相关知识。 文章目录 1. 内部类是什么 2. 为什么要使用内部类 3. 如何使用内部类 &#x1f349;成员内部类 &…