K8s中 statefulset 和deployment的区别

news/2024/12/22 23:06:42/

在 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.ppmy.cn/news/1557315.html

相关文章

【LuaFramework】服务器模块相关知识

目录 一、客户端代码 二、本地服务器代码 三、解决服务器无法多次接收客户端消息问题 一、客户端代码 连接本地服务器127.0.0.1:2012端口&#xff08;如何创本地服务器&#xff0c;放最后说&#xff09;&#xff0c;连接成功后会回调 协议号Connect是101&#xff0c;其他如下…

霍特林分布

内容来源 应用多元统计分析 北京大学出版社 高惠璇编著 霍特林 T 2 T^2 T2 分布 一元统计中&#xff0c;若 X ∼ N ( 0 , 1 ) X\sim N(0,1) X∼N(0,1) ξ ∼ χ 2 ( n ) \xi\sim\chi^2(n) ξ∼χ2(n) 且 X X X 与 ξ \xi ξ 相互独立&#xff0c;则 t X ξ / n ∼ t ( n …

Transform组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Checkbox Widget相关的内容,本章回中将介绍Transform Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Transform是一种容器类widget,它和Container组件类似。它可以包含其它的组件…

【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换

相关链接&#xff1a; http://mars3d.cn/editor-vue.html?keyex_1_2_1&idmap/other/backgroundImg 实现代码&#xff1a; export function show1() {map.setOptions({scene: {backgroundType: "image",backgroundImage: "url(//data.mars3d.cn/img/busin…

Python使用GitLab API来获取文件内容

Python使用GitLab API来获取文件内容 一、前提条件 你需要有一个GitLab的访问令牌&#xff08;Access Token&#xff09;&#xff0c;以便进行API调用。你需要知道GitLab项目的ID或路径。你需要知道你要拉取的tag或分支的名称。 三、获取GitLab的访问令牌 登录到你的GitLab…

flink实现复杂kafka数据读取

接上文&#xff1a;一文说清flink从编码到部署上线 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#xff1a;CentOS 7.6&#xff1b;JDK&#xff1a;1.8.0_401。 常见的文章中&…

轻松拿捏Spring

目录 Spring基础 什么是Spring框架 Spring 包含的模块有哪些? Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架 Spring 是一款开源的轻量级 Java 开发框…

skyler实战渗透笔记—Kioptrix-1

0x00 前言 This Kioptrix VM Image are easy challenges. The object of the game is to acquire root access via any means possible (except actually hacking the VM server or player). The purpose of these games are to learn the basic tools and techniques in vuln…