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

news2024/9/20 14:53:29

文章目录

    • 一、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)

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

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

相关文章

JavaFX第四篇 Button按钮和事件处理

JavaFX第四篇 Button按钮和事件处理 1. 代码2. 讲解3. 代码仓库 上一篇我们讲解了Hello World演示,主要用到Label标签的功能, 这里我们要介绍的是最常用的控件之一:按钮 在现在的软件开发过程中还没发现没有用到按钮的应用, 基本上…

【数据库原理与实践】第八章至第十章作业汇总(更新中)

填空题部分: Chp 8 安全性与完整性 part 1: 数据库的安全性是指保护数据库以防止不合法的使用所造成的( 数据泄露、更改或破坏 )。计算机系统有三类安全性问题,即( 技术安全 )、管理安全和…

ROS:计算图

目录 一、ROS计算图简介二、节点(Node)三、节点管理器(Master)四、消息(Message)五、话题(Topic)六、服务(Service)七、动作(Action)八…

LabVIEW开发燃油阀自动性能测试系统

LabVIEW开发燃油阀自动性能测试系统 燃油阀是航空燃油控制系统的核心部件。燃油阀的流量滞后直接影响控制精度、稳定性和可靠性,而燃油阀生产的性能测试是至关重要的步骤。但是,由于流动滞后是非线性的,因此很难控制和进行实时测试。随着厂家…

CSS3-浮动

(了解)标准流:又称文档流,是浏览器在渲染显示网页内容时默认采用的一套排版规则,规定了应该以何种方式排列元素 常见标准流排版规则: 1. 块级元素:从上往下,垂直布局&am…

Matplotlib---柱形图

1. 绘制简单的柱状图 bar函数用于绘制柱状图。下面是bar函数的语法格式: bar(x, height, width0.8, bottomNone, aligncenter, dataNone, **kwargs)参数解释: x:指定每个柱子的x轴坐标。height:指定每个柱子的高度。width&…

TypeScript ~ 掌握基本类型 ②

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…

vue的学习

title: VUE 一、Vue简介 1.1 简介 ::: tip Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式的js框架,发布于 2014 年 2 月。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0…

F. Gardening Friends(树的直径)

Problem - 1822F - Codeforces 两位朋友Alisa和Yuki在他们的花园里种了一棵有n个顶点的树。树是一个无向图,没有循环、回路或多重边。这棵树中的每条边都有一个长度为k。最初,顶点1是树的根。 Alisa和Yuki种植这棵树不仅仅是为了好玩,而是想…

基于SpringBoot的流浪动物救助平台

1.引言 系统管理也都将通过计算机进行整体智能化操作,对于流浪动物救助平台所牵扯的管理及数据保存都是非常多的,例如首页、个人中心、会员管理、志愿者管理、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿团队活动管理、志愿者申请表管理、…

【性能设计篇】数据库拓展

前两篇文章介绍了分布式存储的机制,为保证数据的高性能以及可拓展,采用分片/分区机制。为保证数据的高可用性,采用复制/镜像机制存储数据。一份数据存储多份。而这两种方式在数据中,就是分片/分区机制。分库分表/读写分离。 读写…

掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别

Flutter动机是什么,解决啥痛点?优势在哪里? 介绍Flutter的历史背景和运行机制,并以界面渲染过程为例与你讲述其实现原理。 1 Flutter的历史背景 为不同的操作系统开发拥有相同功能的应用程序,开发人员只有两个选择&…

gitTortoise图形化工具下载步骤

一,简介 本文主要介绍如何下载安装gitTortoise图形化工具来管理和提交代码。 二,步骤介绍 2.1 安装包下载 下载地址:https://download.tortoisegit.org/tgit/ 打开后,界面如下: 点击选择最新的稳定release版本&am…

二分查找算法及实现

概念 二分查找算法也成为折半查找,是一种非常高效的工作于有序数组的查找算法. 实现 需求 现有一个有序数组 arr [1,2,3,4,5,6,7,8,9], 目标值target 2 ,要求返回目标值target在数组arr中的索引,没有则返回-1; 代码实现 private int binarySearch(int[] arr, int target)…

Android加快你的编译速度

工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。 Gradle构建流程 Gradle 的生命周期可以分为大的三个部分:初始化阶段(Initialization Phase),配置阶段(Configuration Pha…

Linux学习之网络管理和配置文件

在CentOS 7中有两种网络配置方法:SysV(也称为Sys 5)和Systemd。 SysV的命令如下: service network start|stop|restart|status chkconfig --list network Systemd的命令如下: systemctl list-unit-files NetworkManage…

Linux->线程同步

目录 前言: 1 线程同步引入 2 条件变量 2.1 线程饥饿 2.2 条件变量接口 2.3 添加条件变量 3 生产者和消费者模型 前言: 本篇主要讲解了关于线程同步的相关知识,还有生产者和消费者模型的认识和使用。 1 线程同步引入 在讲解线程同步之…

【Unity3D】基于深度和法线纹理的边缘检测方法

1 前言 边缘检测特效中使用屏后处理技术,通过卷积运算计算梯度,检测每个像素周围像素的亮度差异,以识别是否是边缘像素;选中物体描边特效中也使用了屏后处理技术,通过 CommandBuffer 获取目标物体渲染后的模板纹理&…

学习spring: 1.引子

问题 我们来看一段代码: package org.malred;import org.malred.entity.Car; import org.malred.entity.Tire;/*** Hello world!**/ public class App {public static void main(String[] args) {Car car new Car();Tire lt new Tire();car.setLeftTire(lt);Tire rt new T…

状态估计器

文章目录 [toc] 1.状态空间模型1.1.连续状态空间模型1.2.离散状态空间模型 2.矩阵微积分3.二次规划4.概率论4.1.期望与方差4.2.独立事件4.3.向量随机变量4.4.噪声与协方差矩阵4.5.条件概率 5.最小二乘估计5.1.加权最小二乘估计5.2.递推最小二乘估计5.3.状态向量和协方差随时间变…