【kubernetes】kubernetes中的StatefulSet使用

news2024/11/22 9:01:36

@TOC

1 为什么需要StatefulSet

常规的应用通常使用Deployment,如果需要在所有机器上部署则使用DaemonSet,但是有这样一类应用,它们在运行时需要存储一些数据,并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取,毕竟没有哪个运维希望Pod重建后数据却丢失了。

对于Deployment和DaemonSet来说,它们创建的Pod是一模一样的,如果将PV关联到Pod的PVC,这两种资源都无法对多个Pod的PVC进行区分,因此,对于这种场景,最基本的需求就是每个Pod可以设置不同的PVC,同时,Pod在重建时最好主机名等也一样,因为多个存储之间需要进行数据同步,所有的Pod都需要知道其他Pod的主机名,如果Pod的名称变化了,其他Pod的配置都需要调整。

因此,对于这类应用至少有两个需求:

  • 每个Pod可以使用不同的PVC,绑定到不同的PV
  • Pod重建后,Pod名称和主机名不变

这就要使用到StatefulSet,简称sts。

2 StatefulSet的Yaml的关键字段

与Deployment相比,StatefulSet有几个比较特别的字段:

  • sts.spec.podManagementPolicy:Pod被创建和删除的顺序,可选的值有OrderedReady(按照0~N-1的顺序创建Pod,按照N-1~0的顺序删除Pod)、Parallel(并行创建和删除Pod)
  • sts.spec.serviceName:StatefulSet关联的服务名
  • sts.spec.updateStrategy.rollingUpdate.partition:分区滚动更新
  • sts.spec.volumeClaimTemplates:PVC模板,也就是说,这里不是单个PVC,而是一个模板,会根据Pod的数量创建对应的PVC

这里借用一本书里面的例子的镜像:luksa/kubia-pet,它运行一个nodejs应用,监听容器的8080端口,当发送POST请求时会将数据写入本地的/var/data/kubia.txt,当发送GET请求时,会从本地的/var/data/kubia.txt获取数据。

下面是用docker run启动该镜像后的使用方式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以发现:在保存数据时,会打印Pod的主机名;而在读取数据时,会打印读取数据的Pod的主机名以及写入的数据。

用以下的yaml创建StatefulSet以及对应的Service:

apiVersion: v1
kind: Service
metadata:
  name: kubia-svc
spec:
  clusterIP: None
  selector:
    app: kubia
  ports:
  - name: http
    targetPort: 8080
    port: 80

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kubia
  labels:
    app: kubia
spec:
  selector:
    matchLabels:
      app: kubia
  serviceName: kubia-svc
  replicas: 3
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia-ctr
        image: luksa/kubia-pet
        ports:
        - name: http
          containerPort: 8080
        volumeMounts:
        - name: data
          mountPath: /var/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      resources:
        requests:
          storage: 1Mi
      accessModes:
      - ReadWriteOnce

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以发现:

  • Pod名称跟Pod中的主机名相同,都是StatefulSet资源名称和一个索引号,这里给定的replicas是3,因此,索引号就是0~2
  • 创建了3个Pod的同时,也创建了3个PVC和PV,kubia-0这个Pod绑定的PVC是data-kubia-0,开始的data就是PVC模板中的名称

然后再创建一个nginx的Pod,就可以在nginx的Pod上访问服务:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在原来服务的DNS前面再加一个Pod名称就可以直接解析到对应的Pod,然后就可以直接访问对应的Pod,而且,访问者可以认为,无论目标Pod是重启还是重建,目标Pod都是同一个:主机名和域名没有变化、存储也没有变化(PVC在关联PV后,只要PV不被删除,就会一致关联;由于Pod名称没有变化,因此,同一个PVC还是会关联到同一个Pod)。如果需要这些Pod组成集群,那么每个主机的名称是可以预期且不变的。

在Pod启动过程中,也会发现,3个Pod中,一定是kubia-0最先启动,kubia-2最后启动,同时,只有kubia-0正常运行了,才会继续创建kubia-1;而删除StatefulSet过程中,一定是kubia-2最先删除,kubia-0最后删除。

与Deployment类似,StatefulSet也可以使用kubectl scale进行扩容和缩容,与启动和删除过程类似,当扩容时,一定是从当前最大的序号的下一个序号的Pod开始创建,例如,现在就会从kubia-3开始创建,当缩容时,一定是从当前最大的序号的Pod开始删除,例如,现在就会从kubia-2开始删除。

3 扩缩容失败的处理

在扩容过程中,如果Pod运行异常,则可以直接进行重建或者调度到其他机器上重建。

在缩容过程中,StatefulSet需要保证运行的Pod状态都是正常的。如果Pod运行异常,则缩容过程会阻塞,因为kubernetes无法判断Pod异常状态到底是瞬时状态还是永久性状态,如果是永久性状态,需要解决该问题才能继续推进缩容操作,如果此时继续推进缩容操作,那么运行的Pod数量可能跟实际期望的不同;如果是瞬时状态, 通常过一会儿就会恢复。总的来说就是,只有当Pod运行正常时才进行扩缩容操作。

4 分区滚动更新

ds.spec.updateStrategy.rollingUpdate可以设置Pod的最大超过数量和最大不可用的数量,但是在sts.spec.updateStrategy.rollingUpdate则用于设置分区滚动更新(1.24版本也提供了最大不可用数的设置)。

分区滚动更新就是分段更新,将StatefulSet的所有Pod分成两部分,在进行更新时一部分更新,另一部分不更新,因此,设置分区就是设置一个索引位置,也就是sts.spec.updateStrategy.rollingUpdate.partition:当该值为n时,索引值大于或者等于n的Pod才会被更新,小于n的Pod不会被更新。而且,当小于n的Pod重建时,还是会用旧的配置进行重建。

分区滚动更新的主要使用场景就是实现金丝雀部署,也就是新老版本需要同时运行,运行过程中,可以通过观察新版本的监控指标判断是否继续进行升级。

5 总结

对于需要持久化数据的应用,或者需要多Pod构成集群的应用,可以使用StatefulSet进行部署,每个Pod的主机名和域名在Pod重建后保持不变,也会绑定到同一个PV存储,这就使得Pod在异常重建或者漂移后可以认为还是同一个Pod,这就满足了“有状态服务”的需求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫案例入门教程(纯小白向)——夜读书屋小说

Python爬虫案例——夜读书屋小说 前言 如果你是python小白并且对爬虫有着浓厚的兴趣,但是面对网上错综复杂的实战案例看也看不懂,那么你可以尝试阅读我的文章,我也是从零基础python开始学习爬虫,非常清楚在过程中所遇到的困难&am…

字符编码的了解

前言: 在编写文件读取功能的过程中,我遭遇了一个棘手的乱码难题。经过细致的排查,发现这一问题的根源在于文件的字符编码。为了帮助大家有效地克服编码差异所带来的开发挑战,因此,我收集了字符集编码的相关知识&#x…

想要精通算法和SQL的成长之路 - 旋转链表

想要精通算法和SQL的成长之路 - 旋转链表 前言一. 旋转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 旋转链表 原题链接 由于k的大小可能超过链表长度,因此我们需要根据链表长度取模。那么我们首先需要去计算链表的长度是多少: if (head …

C# GraphicsPath 类学习

先在窗体放2个picturebox, 然后看一下如下代码; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

Pytorch基础:Tensor的transpose方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中,transpose是Tensor的一个重要方法,同时它也是一个torch模块中的一个函数,它们的语法如下所示。 Tensor.transpo…

window安装压缩版postgresql

环境: window 11 专业版postgresql-16.0-1-windows-x64-binaries.zip 一、下载 1.1 从官网下载 https://www.postgresql.org/download/windows/ 1.2 从百度网盘下载 链接:https://pan.baidu.com/s/1fmQbgWSzX4hN07Lgdzfz0g?pwddzyy 提取码&#…

汇编语言王爽第4版实验8答案(和你想的不一样)

实验8 分析一个奇怪的程序 E:\mywork\asm\p906.asm C:\>edit p906.asm assume cs:codecode segmentmov ax,4c00hint 21h start: mov ax,0 s:nop ; nop的机器码占一个字节nopmov di, offset smov si, offset s2mov ax, cs:[si]mov cs:[di],ax s0:jmp short s s1:mov ax,0in…

tauri为窗口添加阴影效果

需求 为窗口添加阴影效果,让窗口显得更立体。 实现方案 通过 tauri 中的 window-shadows 依赖实现。 编码 修改 label 标签内容 修改 src-tauri/tauri.conf.json 文件,设置 label 字段为 “customization” 增加shadows的依赖 修改 src-tauri…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖:【学以致用,授人以渔】2023视频教程汇总,DSP第12期,ThreadX第8期,BSP驱动第26期,USB实战第5期,GUI实战第3期(2023-10-01) - STM32F429 - 硬汉嵌入式论坛 …

函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系

1.函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系 1.1 傅里叶级数中的系数公式推导 我们先来推导一下傅里叶级数中的系数公式,其实笔者已经写过一篇相关笔记,详见:为什么要把一个函数分解成三角函数?(傅利叶级数) f ( x )…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

【数据结构】HashSet的底层数据结构

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 HashSet 一、 HashSet 集合的底层数据结构二…

GraphPad Prism 10 for Mac(统计分析绘图软件)

GraphPad Prism是一款专业的统计和绘图软件,主要用于生物医学研究、实验设计和数据分析。 以下是 GraphPad Prism 的主要功能和特点: 数据导入和整理:GraphPad Prism 可以导入各种数据格式,并提供直观的界面用于整理、编辑和管理数…

RFID与人工智能的融合:物联网时代的智能化变革

随着物联网技术的不断发展,现实世界与数字世界的桥梁已经被打通。物联网通过各种传感器,将现实世界中的光、电、热等信号转化为有价值的数据。这些数据可以通过RFID技术进行自动收集和传输,然后经由人工智能算法进行分析、建模和预测&#xf…

【LeetCode算法系列题解】第76~80题

CONTENTS LeetCode 76. 最小覆盖子串(困难)LeetCode 77. 组合(中等)LeetCode 78. 子集(中等)LeetCode 79. 单词搜索(中等) LeetCode 76. 最小覆盖子串(困难) …

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘

就是我在反序列化时&#xff0c;遇到这样一个警告&#xff1a; Unchecked cast: java.lang.Object to java.util.ArrayList<com.work1.Student>然后我去网上查&#xff0c;有些人说用SuppressWarnings(“unchecked”)去忽略警告&#xff0c;但是我觉得作为一名合格的程序…

SNERT预备队招新CTF体验赛-Web(SWCTF)

目录 1、F12 2、robots 3、game1-喂青蛙 4、game 2 - flap bird 5、game 3 - Clash 6、Get&Post 7、sql &#xff08;1&#xff09;手工注入 &#xff08;2&#xff09;工具注入 8、命令执行漏洞 9、文件上传漏洞 10、文件泄露 11、php反序列化漏洞 12、PHP绕…

【网络编程】UDP数据报套接字编程和TCP流套接字编程

文章目录 1. 网络编程基础1.1 为什么需要网络编程&#xff1f;1.2 网络编程是什么&#xff1f;1.3 概念 2. Socket套接字3. UDP数据报套接字编程3.1 DatagramSocket API3.2 DatagramPacket API3.3 InetSocketAddress API 4. UDP构建服务端客户端&#xff08;一发一收&#xff0…

QSS之QComboBox

QComboBox在Qt开发过程中经常使用&#xff0c;默认的下载列表风格达不到设计师的要求&#xff0c;本篇介绍基本的QComboBox的qss设置。 属性意思QComboBoxQComboBox基本样式QComboBox:editable右边可选择按钮QComboBox:!editable, QComboBox::drop-down:editable不可编辑或下拉…

Python中匹配模糊的字符串

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如何使用thefuzz 库&#xff0c;它允许我们在python中进行模糊字符串匹配。 此外&#xff0c;我们将学习如何使用process 模块&#xff0c;该模块允许我们在模糊…