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

2023-11-06

一、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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 压缩感知之入门文献

    在搜索相关资料时 看到了一个不错的资源 入门级的介绍 给出了链接 有需要的可以去下载 如过实在有困难 可以留下地址 我会尽量一一恢复 https download csdn net download doumiji 3294118
  • spring boot学习1之main和tomcat启动及log日志

    写了个spring boot例子 的确是零配置 平时需要写个web例子测试之类的时候 用它还挺方便的 现在开发都搞微服务 api端之前都是dubbo或jesry 现在也可以用spring boot了 现在记录下spring boot的小例子
  • DHCP基础配置

    要求 1 DHCP Server0 0 0口使用接口DHCP进行分配IP 2 DHCP Server0 0 1口使用全局DHCP进行分配IP 3 各PC间均可以互通 需求分析 1 对GE 0 0 1接口 IP分配 2 进行配置全局地址池 3
  • 秒懂Python 赋值,浅拷贝,深拷贝

    直接赋值 对象的引用 别名 浅拷贝 copy 拷贝父对象 不会拷贝对象的内部的子对象 深拷贝 deepcopy copy模块的deepcopy方法 完全拷贝了父对象及其子对象 1 基础概念 在Python里 一切皆对象 完全的面向对象 1
  • 手把手教你用C#写一个刷屏软件

    手把手教你用C 写一个刷屏轰炸软件 成品展示 环境准备 新建项目 程序思路 程序部分 完整代码 成品展示 环境准备 VS2019 新建项目 打开界面绘制 打开工具箱开始放置按钮标签以及文本框 最后设计完成的效果 这里需要注意的是这里的每个按
  • BurpSuite安装与浏览器导入证书

    目录 前言 模块介绍 Burp安装 burp配置与jdk环境安装 首次激活 浏览器配置 设置代理端口 导入Burp证书 Chrome浏览器导入证书 Firefox导入证书 前言 Burp Suite是一个用于测试网络应用程序安全性的图形化工
  • pgslql+shp+geoserver 实现用pg库导入shp地图文件,然后通过geoserver发布图层的效果

    首先 要有一个地图shp文件 然后 pg库地址 里面有pg库的安装包和依赖 这个加载进去会自动生成模板 还有geoserver的安装包和navicat premium12的破解版 百度网盘地址 https pan baidu com s 1
  • 点云格式转换

    前言 在接收激光雷达数据后 将点云保存为bin文件 tofile 再转换成pcd文件 便于可视化排查 读取指定文件夹下的所有bin文件 并将bin文件转成txt文件 coding UTF 8 读取指定文件夹下的所有bin文件 并将bin文件
  • Vulkan 与 OpenGL 对比

    Vulkan 与 OpenGL 对比 Vulkan与OpenGL相比 可以更详细的向显卡描述你的应用程序打算做什么 从而可以获得更好的性能和更小的驱动开销 Vulkan的设计理念与Direct3D 12和Metal基本类似 但Vulkan作
  • 使用 Python 创建端到端聊天机器人

    使用 Python 创建端到端聊天机器人 1 效果图 2 原理 2 1 什么是端到端聊天机器人 2 2 创建端到端聊天机器人步骤 3 源码 3 1 streamlit安装 3 2 源码 参考 聊天机器人是一种计算机程序 它了解您的查询意图以
  • php 调用office 组件,GitHub - senmangit/phpoffice: 基于phpspreadsheet封装的excel导表组件,非常好用且功能强大的导表神器...

    phpoffice 简单易用的phpoffice套件 可实现导入 导出excel 将word转为PDF 将pdf转为图片等等功能 一 安装 composer require senman phpoffice dev master 二 使用示
  • django 生产环境和测试环境的区分,数据库切换

    在某些情况下 本地测试使用的数据库和线上的数据库不同 需要区分两个环境 并切换到相应的数据库 解决办法 通过环境变量来区分生产环境和测试环境 settings py ENV PROFILE os getenv ENV if ENV PROF
  • 《Python进阶系列》十三:具备精确分配和释放资源功能的上下文管理器

    上下文管理器 Context managers 允许你在有需要的时候 精确地分配和释放资源 with 语法 使用上下文管理器最广泛的案例就是with 语句了 想象下你有两个需要结对执行的相关操作 然后还要在它们中间放置一段代码 上下文管理器
  • Canvas 基础使用

    一 基本的画布功能 创建
  • Verilog实现的SPI通信

    SPI Serial Peripheral Interface 串行外设接口 高速的 全双工 同步通信总线 SPI以主从方式工作 一般需要至少4根线 单向传输时可用3根 1 MISO Master Input Slave Output 主设
  • css修改浏览器默认滚动条样式

    滚动条样式 webkit scrollbar width 4px height 4px webkit scrollbar thumb border radius 10px webkit
  • Unity调用相机的方式总结

    1 通过C 即脚本 的方式调用相机 参考引用Unity调用摄像头功能简单实现方法 Unity代码调用摄像头 1 新建C 文件 此组件挂在一个物体上 可以是空物体或者camera 2 新建一个plane用于显示图像 利用该gameobject
  • 人脸识别:coco loss-Rethinking Feature Discrimination and Polymerization for Large-scale Recognition

    nips的一篇做分类和识别的工作 其中在人脸识别任务上也做了实验 Rethinking Feature Discrimination and Polymerization for Large scale Recognition Yu Liu
  • 设计模式:适配器模式

    适配器模式 即Adapter模式 又叫包装器Wrapper 用于改变已有类的接口形式 它可以将某个类的接口转换成客户端期望的另一个接口 主要目的是实现兼容性 让原本因接口不匹配不能一起工作的两个类可以协同工作 比如正常的电压是220v 插座
  • 【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

    文章目录 一 StatefulSet理论知识 1 StatefulSet Pod控制器特性 2 什么是有状态服务和无状态服务 3 Deployment和StatefulSet区别 二 案例 StatefulSet资源实战演示 1 创建WEB