【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

文章目录

    • 一、StatefulSet理论知识
      • 1、StatefulSet Pod控制器特性
      • 2、什么是有状态服务和无状态服务?
      • 3、Deployment和StatefulSet区别
    • 二、案例:StatefulSet资源实战演示
      • 1、创建WEB站点并验证StatefulSet特点
      • 2、StatefulSet滚动更新
    • 三、总结

一、StatefulSet理论知识

官方中文参考文档

1、StatefulSet Pod控制器特性

StatefulSet(简写sts)也是K8S集群中的一种Pod资源管理器,与deployment Pod控制器不同的是,StatefulSet用于管理无状态程序,特性如下:

  • 稳定的网络标识符:管理的Pod都拥有一个稳定的网络标识符。可以通过网络标识符进行访问。
  • 有序部署和扩展:StatefulSet会按照指定的顺序逐个部署Pod,每个Pod都有一个唯一的序号,这个序号在整个生命周期中都不会改变。在扩展时,也会按照指定的顺序逐个增加Pod。
  • 稳定的存储:每个Pod都用一个独立的持久卷存储,比如NFS。
  • 有状态服务:StatefulSet适用于有状态的服务,例如数据库、缓存等,这些服务需要稳定的网络标识符和持久化存储。

总之,StatefulSet提供了一种可靠的、有序的、有状态的服务部署和扩展方式,适用于需要稳定网络标识符和持久化存储的有状态服务。

2、什么是有状态服务和无状态服务?

无状态服务则是指不需要持久化存储和状态的服务,例如Web服务器、API服务器等。这些服务可以在任何节点上运行,因为它们不需要在不同节点之间共享数据,也不需要在节点故障时进行快速恢复。无状态服务可以通过水平扩展来提高性能和可用性。

有状态服务是指需要持久化存储并且需要保持状态的服务,例如数据库、缓存等。这些服务需要在不同的节点之间保持数据同步,并且需要在节点故障时能够快速恢复。

3、Deployment和StatefulSet区别

Deployment和StatefulSet是Kubernetes中常用的两种控制器,它们的主要区别如下:

  • Deployment是用于管理无状态应用的控制器,而StatefulSet则是用于管理有状态应用的控制器。

  • Deployment可以创建多个Pod副本,这些Pod副本之间没有任何顺序关系,可以随意调度和替换。而StatefulSet创建的Pod副本有固定的顺序,每个Pod副本都有唯一的标识符,可以保证有状态应用的数据持久性和稳定性。

  • Deployment可以进行滚动更新,即在更新过程中保持应用的可用性。而StatefulSet的更新过程需要手动控制,需要先删除旧的Pod副本,再创建新的Pod副本,因此更新过程中会有一定的停机时间。

  • Deployment可以使用RollingUpdate策略进行滚动更新,而StatefulSet则可以使用OnDelete和RollingUpdate两种策略进行更新。

总之,Deployment适用于管理无状态应用,而StatefulSet适用于管理有状态应用。如果应用需要保证数据的持久性和稳定性,建议使用StatefulSet。

二、案例:StatefulSet资源实战演示

1、创建WEB站点并验证StatefulSet特点

第一步:创建名为 sts-web-svc 的SVC ,用于创建statefulset资源时需要关联service,YAML如下:

cat sts-web-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: sts-web-svc
spec:
  selector:
    app: web-nginx
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None     # 设置无IP地址

创建 svc 资源:

kubectl apply -f sts-web-svc.yaml

查看创建的 svc 资源,如下图可以看到创建的svc并没有分配IP地址:

kubectl get svc sts-web-svc

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mh2GSqBh-1687429873545)(D:\MD归档文档\IMG\image-20230622124156022.png)]

第二步:创建statefulset资源

cat sts-web.yaml 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-web
  namespace: default
spec:
  serviceName: sts-web-svc  # 关联SVC资源
  replicas: 2               # 副本数
  selector:
    matchLabels:            # 关联具有app=web-nginx标签的Pod
      app: web-nginx
  volumeClaimTemplates:        # 卷申请模板 
  - metadata:
      name: www                # 卷申请模板名称
    spec:
      accessModes: ["ReadWriteOnce"] # 访问模式
      storageClassName: nfs          # 指定供应商,前提是需要存在此供应商
      resources:
        requests:
          storage: 1Gi               # 存储大小1G
  template:
    metadata:
      labels:
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: nginx:1.18.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www             # 指定卷申请模板名称
          mountPath: /usr/share/nginx/html
        startupProbe:           # 启动探测
          tcpSocket:
            port: 80

执行 YAML :

kubectl apply -f sts-web.yaml

第三步:特点测试

1、Pod都有一个唯一的序号:如下图Pod名字有序

kubectl get pods -l app=web-nginx -o wide

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEhdYVet-1687429873546)(D:\MD归档文档\IMG\image-20230622170004961.png)]

删除 sts-web-0,Pod后自动创建出来的Pod名称不会改变

kubectl delete pod sts-web-0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZR18brWr-1687429873547)(D:\MD归档文档\IMG\image-20230622172250665.png)]

2、Pod独立持久卷存储:查看PVC,自动生成两个PVC,相互隔离

kubectl get pvc -l app=web-nginx
ls /data/nfs_pro|grep default-www-sts-web-*

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCl6BCXF-1687429873547)(D:\MD归档文档\IMG\image-20230622170316050.png)]

3、稳定的网络标识符:我们使用busybox运行Pod,nslookup进行解析

kubectl run busybox --image docker.io/library/busybox:1.28 --rm -it busybox -- sh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAVuvfgk-1687429873547)(D:\MD归档文档\IMG\image-20230622171854741.png)]

2、StatefulSet滚动更新

滚动更新使用 spec.updateStrategy 字段定义,目前statefulset支持两种更新策略如下:

  • RollingUpdate:滚动更新
  • OnDelete:不会自动更新,手动删除Pod后进行更新

下面演示滚动更新:

第一步:创建并执行statefulset资源

cat web-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
  clusterIP: None

创建statefulset,使用nginx:1.18 镜像

cat web.yaml 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: default
spec:
  serviceName: web
  replicas: 5   
  selector:
    matchLabels:           
      app: web
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 0 # 最多不可用Pod,0表示2个Pod可用 
      partition: 2      # 只更新序号大于等于partition值的Pod
  volumeClaimTemplates:       
  - metadata:
      name: web               
    spec:
      accessModes: ["ReadWriteOnce"] 
      storageClassName: nfs          
      resources:
        requests:
          storage: 1Gi               
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx:1.18.0    # 使用1.18.0版本镜像
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: web           
          mountPath: /usr/share/nginx/html

执行YAML文件

kubectl apply -f web-svc.yaml
kubectl apply -f web.yaml

第二步:更新使用 nginx:latest 镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwAHriLC-1687429873547)(D:\MD归档文档\IMG\image-20230622182033324.png)]

重新YAML 一下:

kubectl apply -f web.yaml

验证:由于我们partition: 2 所以Pod不会全部更新,只会更新序号大于2的Pod,包括2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l7VHSbpv-1687429873548)(D:\MD归档文档\IMG\image-20230622182419919.png)]

三、总结

  • statefulset管理的Pod名称是有序的,删除指定Pod后自动创建的Pod名称不会改变。
  • statefulset创建时必须指定server名称,如果server没有IP地址,则会对server进行DNS解析,找到对应的Pod域名。
  • statefulset具有volumeclaimtemplate卷管理模板,创建出来的Pod都具有独立卷,相互没有影响。
  • statefulset创建出来的Pod,拥有独立域名,我们在指定访问Pod资源时,可以使用域名指定,IP会发生改变,但是域名不会(域名组成:Pod名称svc名称.svc名称空间.svc.cluster.local)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PSD笔记

在实际应用中,一个信号我们不可能获得无穷长时间段内的点,对于数字信号,只能通过采样的方式获得N个离散的点。上文提到,实际信号基本上是随机信号,由于不可能对所有点进行考察,我们也就不可能获得其精确的功…

Modbus协议学习方法

在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。   下面我将自己借助软件学…

如何用低代码开发平台快速实现单据打印功能?

每家企业在日常工作中,业务流转时,都经常需要在线打印各种纸质文件,如凭证、采购单、出入库单据、销售合同等,不同企业都有个性化的排版要求,每一次需要在固定文档模板的基础上重新填充业务数据,过程中难免…

目前有哪些比较好用的工单系统?如何选择合适的工单管理系统?

目前有哪些比较好用的工单系统??推荐一个性价比高的“工单管理系统”?好用免费的工单管理软件系统有哪些? 作为一个工程项目管理人员,是离不开工单系统的。每当遇到工程量大的时期要去管理很多杂乱无章的工单可太难了…

搭建selenoid环境

1、拉取浏览器镜像 docker pull selenoid/vnc:chrome_103.02、拉取selenoid-ui容器镜像 docker pull aerokube/selenoid-ui:1.10.43、拉取selenoid容器镜像 docker pull aerokube/selenoid4、编写配置文件 vi /selenoid/config/browsers.json volumes可以做容器路径映射&…

TP composer 新创建一个vendor2,作为新库下载目录

站点目录新建一个vendor2文件夹: 在里面新建一个 composer.json 文件:(只写一个花括号就行) {} 然后这个vendor2目录里,使用宝塔终端执行: composer require zoujingli/ip2region 这样,vendor2目录里就会再多出 v…

java 设计模式--创建者模式

参考:Java常见设计模式总结 概念 概念理解一:将复杂对象的创建过程分解在不同的方法中,不同的创建过程组装成不同对象。对象的创建与产品本身分离开,使得对象的创建过程更加清晰。例如:旅游套餐售卖场景。 一个套餐大…

flutter Android 自定义输出路径 apk名称

默认 Flutter flutter build apk, 是默认的名字 默认的路径,直接修改输出路径 会造成 打包可以,直接运行 会提示找不到 apk 文件; 这里的解决思路是:打包完成后 拷贝目标路径的 APK 到自定义的路径,这样既可以正常打…

Windows软件架构概念

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来聊聊Windows软件架构的概念。 Shaw和Garlan在他们划时代的著作中以如下方式讨论了软件的体系结构:从第一个程序被划分成模块开始,软件系统就有了体系结构。现在&#xff0c…

分布式系统消息通信技术:MOM与RPC

一、中间件 什么是中间件 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台…

剑指 Offer 55 - I. 二叉树的深度 / LeetCode 104. 二叉树的最大深度(二叉树后序遍历,回溯传递值)

题目: 链接:剑指 Offer 55 - I. 二叉树的深度;LeetCode 104. 二叉树的最大深度 难度:简单 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息,主要包括:Be…

智能文档图像处理技术应用与实践

写在前面智能文档处理面临的技术难题智能文档处理的研究领域● 文档图像分析与预处理● 手写板反光擦除● 版面分析与文档还原 写在最后 写在前面 VALSE 2023 无锡视觉与学习青年学者研讨会近期在无锡国际博览中心举办,由江南大学和无锡新吴区联合承办。本次会议旨…

企业级ChatGPT开发的三大核心内幕及案例实战(三)

企业级ChatGPT开发的三大核心内幕及案例实战(三) 2.3 Notion 问答对话AI案例演示及源码分析 Gavin老师:NLP_Matrix_Space 如图2-2所示,我们先看一下Notion 问答对话AI案例的效果。你问一个问题,它会进行回答,然后它会告诉你,信息来源在什么地方,要看具体的信息,可以…

生产者与消费者问题

本篇文章我们使用C探讨一下生产者与消费者问题. 1. 多线程的引入 我们学习了操作系统, 知道了进程和线程的概念, 但是如果不进行代码实战的话, 会很难理解它们. 特别是编程的初学者(比如我), 在了解了进程和线程后通常会感到疑惑: 多线程怎么用? 为啥我平时写代码没有使用到…

TCP协议的相关特性

目录 TCP特点概要 TCP协议段格式 TCP原理 确认应答 超时重传 连接管理(三次握手,四次挥手) 三次握手 四次挥手 流水线传输 滑动窗口 滑动窗口ACK丢失 滑动窗口数据报丢失 流量控制 拥塞控制 延迟应答 停止等待协议 回退N帧协议 面向字节流 缓冲区 粘包问题 TCP异常 &…

Nginx Rewrite的应用

目录 一、Nginx Rewrite 二、Rewrite的功能 1.Rewrite 跳转场景 2.Rewrite 跳转实现 3.Rewrite 实际场景 4.Rewrite 正则表达式 5.Rewrite 命令/语法格式 6.location 分类 7.location 优先级 8.Rewrite和location比较 9.根据以上了解,小案例来操…

python实现Canny算子边缘检测算法

边缘检测是一种将图片中关键信息表现出来的一种图片技术,它的结果并不是字面意思上的获取图片边缘,而是将图片有用的信息勾勒出来,类似素描的结果,但是已经去掉了很多信息。如下所示,一张原始的图片是这样的&#xff1…

自学黑客/网络安全工具软件大全100套

黑客工具软件大全100套 1 Nessus:最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上。它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance–终端用户授权…

Redis7【④ Redis 发布 订阅】

Redis发布和订阅 本章了解即可,命令可以不用敲。 Redis 发布和订阅(Publish/Subscribe,简称 Pub/Sub)是一种消息传递模式,用于在 Redis 中实现消息的发布和订阅。 在 Redis 中,发布者(Publi…