K8s: 控制器之StatefulSets对象

(k8s)kubernetes中的StatefulSet StatefulSet 是用来管理有状态应用的工作负载 API 对象。StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。Kubernetes StatefulSet是一种用于运行有状态应用的控制器。StatefulSet是一个有序的、可标识的Pod组,并且每个Pod都有一个独特的标识符。这使得StatefulSet能够管理有状态应用程序,例如数据库或队列服务,这些应用程序需要稳定的网络标识符或持久性存储,并且需要有序的、逐个更新的部署方式。 阅读详情

StatefulSet


1 ) 概述

  • Stateful,也就是有状态应用,微服务无状态是一个理想的这么一个环境
  • 有些应用是有状态的,比如这个web服务器,它只能运行在一台server上
  • 因为它要访问一些持久化的存储
  • 比如说 mysql 它就是一个典型的有状态的应用,不希望应用随时漂移到别的节点上,然后数据发生变化
  • 为什么说它有状态?
    • 就是因为它的数据是落在这个磁盘上的
    • 虽然云原生应用里面,尽量的把一些服务都变成云原生的应用
    • 在实际生活中,在实际企业开发中,很多应用它是有状态的
  • 那什么是无状态的呢?
    • 比如一个博客应用,它是无状态的,它不依赖于你底层的数据库服务地址
    • 这个应用可以部署多个
  • 在这个mysql服务器,它是有状态的应用,K8s为了应对,提出了 StatefulSets 的概念
  • StatefulSets 它是用来管理Deployment和扩展一组Pod,并且为这个pod提供序号唯一性的保证
  • 所以它和Deployment的不同是在于
    • 它管理了一组相同容器定义的pod, 它为每个Pod维护了一个固定的ID
    • 在Deployment,它的ID是一个Pod名称加后面随机字母的组合,它的名称是动态拼出来的
    • 但是,StatefulSet的pod, 它的容器名称有一个永久不变的ID, 如果建3个,就会变成 -0, -1, -2 这样的不变ID
  • StatefulSets 会定义你期望的一个状态,比如说你有3个副本,它会给你创建3个副本
  • StatefulSets 的使用场景
    • 有稳定唯一的网络标识符
    • 有一个稳定的持久化的存储,可以有序的去缩放,有序的去更新扩容
      • 有序的是指更新是从012345…按顺序更新,而不是随机的去更新
    • 这样的应用更适合 StatefulSets 来管理,而不是Deployment
  • StatefulSets 的限制
    • 必须有这个挂载 PersistentVolume 挂载卷,可以是本地,也可以是对象存储
    • 需要有一个外部的持久化化存储,基于 storage class来匹配,那么这里面有一点很重要
    • 注意,如果说删掉 StatefulSets 中的pod并不会删除它的关联的存储
    • 这样是保证数据的安全,而在Deployment里删除pod, 其创建的临时数据文件都会消失
    • 对于 StatefulSets 它其实更着重的是这些数据
  • 所以 K8s 它设计的时候,存储这个对象和 StatefulSets,是两个隔离的对象
  • 另外,StatefulSets 需要用 headless 服务来创建pod标识
  • headless叫无头服务
    • 就是我的请求, 有时候不想走负载均衡,直接想通过IP链接到后端
    • 这个时候在 K8s 中,它就提供这个headless这个服务
    • 在HTTP发请求的时候发一个post请求之前,会发一个head请求,这个headless请求会做一些事情
    • 比如说对方后端的这个IP地址是哪里?做一些 session 的认证
    • headless请求, 就是直接能够不发这个head请求,直接和后端的服务进行一个交互,直接进行CRUD的操作
    • 在这种情况下, 需要要把这个 clusterip 设成为 none
    • 就是 StatefulSets 里面的 pod 在容器里面不用固定的IP

2 )应用

  • 在这里面,我们会先创建一个Service,然后再创建这个StatefulSets

  • 新建 sfs-demo1.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mongodb
    spec:
      serviceName: mongodb  #必须配置 和service名字统一起来
      replicas: 2
      selector:
        matchLabels:
          app: mongodb
      template:
        metadata:
          labels:
            app: mongodb
        spec:
          containers:
            - name: mongo
              image: mongo:4.4          
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mongodb
    spec:
      selector:
        app: mongodb
      type: ClusterIP
      # HeadLess  
      clusterIP: None
      ports:
        - port: 27017    #本 Service 的端口
          targetPort: 27017  #容器的端口
    
  • $ kubectl apply -f sfs-demo1.yaml

    statefulset.apps/mongodb created
    service/mongodb created
    
  • $ kubectl get all

    NAME            READY   STATUS    RESTARTS   AGE
    pod/mongodb-0   1/1     Running   0          20s
    pod/mongodb-1   1/1     Running   0          19s
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
    service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP     6d2h
    service/mongodb      ClusterIP   None         <none>        27017/TCP   20s
    
    NAME                       READY   AGE
    statefulset.apps/mongodb   2/2     20s
    
  • $ kubectl rollout restart statefulset mongodb 重启

  • $ kubectl scale statefulset mongodb --replicas=5 扩容

  • $ kubectl get all

    NAME            READY   STATUS    RESTARTS   AGE
    pod/mongodb-0   1/1     Running   0          3m31s
    pod/mongodb-1   1/1     Running   0          3m33s
    pod/mongodb-2   1/1     Running   0          2m33s
    pod/mongodb-3   1/1     Running   0          21s
    pod/mongodb-4   1/1     Running   0          20s
    
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
    service/kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP     6d2h
    service/mongodb      ClusterIP   None         <none>        27017/TCP   6m49s
    
    NAME                       READY   AGE
    statefulset.apps/mongodb   5/5     6m49s
    
  • $ kubectl get svc

    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)     AGE
    kubernetes   ClusterIP   10.1.0.1     <none>        443/TCP     6d2h
    mongodb      ClusterIP   None         <none>        27017/TCP   8m49s
    
  • $ kubectl get endpoints mongodb -o yaml

    apiVersion: v1
    kind: Endpoints
    metadata:
      annotations:
        endpoints.kubernetes.io/last-change-trigger-time: "2024-04-23T06:21:28Z"
      creationTimestamp: "2024-04-23T06:14:58Z"
      labels:
        service.kubernetes.io/headless: ""
      name: mongodb
      namespace: default
      resourceVersion: "292772"
      uid: e600cd76-37e9-48c1-90f8-fae2b31bbbd4
    subsets:
    - addresses:
      - hostname: mongodb-1
        ip: 10.244.1.107
        nodeName: node1.k8s
        targetRef:
          kind: Pod
          name: mongodb-1
          namespace: default
          resourceVersion: "292407"
          uid: 654c1164-9a0d-46c0-8148-61f71a6e7224
      - hostname: mongodb-0
        ip: 10.244.1.108
        nodeName: node1.k8s
        targetRef:
          kind: Pod
          name: mongodb-0
          namespace: default
          resourceVersion: "292437"
          uid: cef974da-f02d-4d93-bb00-0c74d534c866
      - hostname: mongodb-3
        ip: 10.244.1.109
        nodeName: node1.k8s
        targetRef:
          kind: Pod
          name: mongodb-3
          namespace: default
          resourceVersion: "292757"
          uid: caf43581-9e7c-48db-a761-1cb74e0ea871
      - hostname: mongodb-2
        ip: 10.244.2.67
        nodeName: node2.k8s
        targetRef:
          kind: Pod
          name: mongodb-2
          namespace: default
          resourceVersion: "292743"
          uid: 1eeba1cb-0e50-45fa-81d2-f4022dbd8b63
      - hostname: mongodb-4
        ip: 10.244.2.68
        nodeName: node2.k8s
        targetRef:
          kind: Pod
          name: mongodb-4
          namespace: default
          resourceVersion: "292770"
          uid: 4e3dc9f3-4f28-4802-af9a-705c12404ae5
      ports:
      - port: 27017
        protocol: TCP
    
  • $ kubectl exec -ti mongodb-0 -- mongo 测试数据存储

    MongoDB shell version v4.4.29
    connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("74389cfe-1776-43ef-a37a-61cf5a7a9d82") }
    MongoDB server version: 4.4.29
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
      https://docs.mongodb.com/
    Questions? Try the MongoDB Developer Community Forums
      https://community.mongodb.com
    ---
    The server generated these startup warnings when booting:
            2024-04-23T06:18:17.563+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
            2024-04-23T06:18:17.563+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
    ---
    >
    
  • $ exit 退出

    bye
    
  • $ run mongodb-client --rm --tty -i --restart='Never' --image mongo:4.4 --command -- bash 连接数据库测试

    If you don't see a command prompt, try pressing enter.
    root@mongodb-client:/#
    
  • $ mongo --host mongodb-0.mongodb

    MongoDB shell version v4.4.29
    connecting to: mongodb://mongodb-0.mongodb:27017/?compressors=disabled&gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("83892098-096c-4521-acf4-54aa13312392") }
    MongoDB server version: 4.4.29
    Welcome to the MongoDB shell.
    For interactive help, type "help".
    For more comprehensive documentation, see
      https://docs.mongodb.com/
    Questions? Try the MongoDB Developer Community Forums
      https://community.mongodb.com
    ---
    The server generated these startup warnings when booting:
            2024-04-23T06:18:17.563+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
            2024-04-23T06:18:17.563+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
    ---
    >
    

关于run相关参数

  • $ kubectl run nginx --image=nginx
    • 启动一个 Nginx 实例
  • $ kubectl run hazelcast --image=hazelcast --port=5701
    • 启动一个 hazelcast 单个实例,并开放容器的5701端口
  • $ kubectl run hazelcast --image=hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"
    • 运行一个 hazelcast 单个实例,并设置容器的环境变量"DNS_DOMAIN=cluster" and “POD_NAMESPACE=default”
  • $ kubectl run nginx --image=nginx --replicas=5
    • 启动一个 replicated 实例去复制 nginx
  • $ kubectl run nginx --image=nginx --dry-run
    • 试运行,不创建他们的情况下,打印出所有相关的 API 对象
  • $ kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
    • 用可解析的 JSON 来覆盖加载 deployment 的 spec,来运行一个 nginx 单个实例
    • 替换 … 为具体key, value
  • $ kubectl run -i --tty busybox --image=busybox --restart=Never
    • 运行一个在前台运行的 busybox 单个实例,如果退出不会重启
Kubernetes K8S之资源控制器StatefulSets详解 Kubernetes的资源控制器StatefulSet详解与示例 阅读详情

相关推荐

kubernetes(k8s) :控制器(ReplicaSet、Deployment、DaemonSet、job、Cronjob)

文章目录1.控制器pod分类和控制器类型1.replication、controller和reolicaset控制器2.Deployment控制器3.DaemonSet控制器4.StatefulSet控制器5.job、cronjob和hpa控制器2. 控制器的部署和实例2.1 ReplicaSet应用2.2 Deployment应用2.3 DaemonSet应用2.4 job控制器2.5 Cronjob应用 1.控制器 Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现

weixin_43936969的博客 976

StatefulSets有状态应用概念及常用操作

StatefulSets概念及常用操作

教Linux的李老师 2057

kubernetes(k8s):管理有状态应用的工作负载 API 对象StatefulSet控制器和kubectl的弹性伸缩

文章目录1.StatefulSets简介2. statefulset通过headless service维持pod的拓扑状态2.1 通过headless service(无头服务)确保网络标识是一致2.2 StatefulSet控制器2.3 StatefulSet的两种应用状态2.4 挂接存储3. kubectl的弹性伸缩3.1 方式一:改变StatefulSet副本数量3.2 方式二:更改yaml文件3.3 方式三:命令 kubectl edit 编辑该字段:3.4 方式四:使用 kubectl patc

weixin_43936969的博客 1023

云原生|kubernetes| StateFulSets控制器详解

【代码】云原生|kubernetes| StateFulSets控制器详解。

zsk_john的技术分享专用博客 1261

【Kubernetes】StatefulSet对象详解

在 Kubernetes 中运行应用程序的常见方法是创建部署对象(Deployment),它管理一个或多个 Pod 实例的副本集。但是,某些应用程序需要保留唯一标识符和网络标识符,比如数据库应用程序。这时候就需要用到 StatefulSet 对象。StatefulSet 是 Kubernetes 的一种对象类型,提供管理有状态应用程序的能力。它可以用于管理有唯一标识符和网络标识符要求的应用程序,如数据库、消息队列等。命名的稳定性。

陈书予 9205

20、Kubernetes 控制器:Deployment、StatefulSets 和 DaemonSets 详解

本文深入解析了 Kubernetes 中的四大核心控制器:Deployment、StatefulSets、DaemonSets 和 ReplicaSet。详细介绍了它们的配置方式、使用场景及操作方法,包括伸缩、更新策略(RollingUpdate 与 Recreate)、回滚机制、标签选择器和实际用例。通过实例演示了如何创建和管理这些控制器,并阐述了它们在无状态应用、有状态应用和集群级守护进程管理中的作用,帮助用户更好地掌握 Kubernetes 应用编排的核心技能。

oo7890的博客 67

k8s之StatefulSet详解

本篇是基于k8s-v1.15.0版本。 1、介绍 RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。 StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识

最美dee时光的博客 6万+

CFturbo 2024保姆级教程:从流量扬程到三维叶轮,手把手搞定离心泵水力设计

本文提供CFturbo 2024离心泵水力设计的全流程实战指南,从流量扬程参数输入到三维叶轮模型导出,详细解析设计步骤与优化技巧。涵盖叶轮尺寸确定、子午面型线设计、叶片角度调整等关键环节,帮助工程师高效完成CAE辅助的离心泵水力设计,提升设计质量与效率。

weixin_42569329的博客 936

kubernetes(k8s):控制器-Deployment、StatefulSet、DaemonSet、job、cronjob

StatefulSet,常用于部署有状态的且需要有序启动的应用程序。Kubernetes 的 StatefulSet 是专为管理有状态应用设计的控制器,通过提供稳定的网络标识持久化存储及,解决了有状态应用在集群化部署中的核心痛点。第一个应用完成启动后,才会启动第二个应用,依此类推。

qq_28131747的博客 709

【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞

【代码】【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞。

weixin_41369892的博客 904

Ubuntu24.04下Librenms的完整安装与配置指南

本文提供了在Ubuntu 24.04 LTS系统上完整安装与配置LibreNMS网络监控系统的详细指南。内容涵盖系统环境准备、依赖安装、源码获取、PHP/数据库/Nginx配置、Composer安装、网页向导设置以及设备添加与日常使用,帮助用户快速部署一套功能强大的开源网络监控解决方案。

tgb3456789的博客 1140

k8s集群StatefulSets的Pod调度查询丢失问题?

考点之你了解k8s集群StatefulSets的Pod调度查询丢失问题吗?k8s集群中StatefulSet管理的Pod已经完成调度并启动,为什么还是无法查询Pod 的 DNS 命名?

囧么肥事 663

YOLOv11改进 | 引入SFSConv空间频率选择卷积(含SFSC3k2二次创新),空间频率特征协同作用,检测性能全面提升

本文提出在YOLOv11中引入SFSConv空间频率选择卷积模块,通过显式分离和动态融合空间域与频率域特征,解决传统卷积对多尺度目标检测的局限性。SFSConv包含空间频率分离、动态权重融合和协同特征重建三个核心机制,并进一步创新提出SFSC3k2结构,通过双路频率分支增强特征协同作用。该改进显著提升了YOLOv11在遥感、医学等多尺度复杂场景下的检测性能,实验显示在微小目标检测任务中mAP提升5%-10%。代码实现展示了SFSConv模块的核心逻辑及其在PyTorch中的高效实现。

走向CTO的路上... 769

【微服务】Kubernetes对象之StatefulSets(有状态系统服务设计)

目录 Kubernetes StatefulSets(有状态系统服务设计) 具有以下特点时使用StatefulSets 限制 组件 部署和扩展 Pod管理 OrderedReady Pod Management Update Strategies 删除   Kubernetes StatefulSets(有状态系统服务设计): 具有以下特点时使用StatefulSets...

探索世界,改变世界 4137

7、RNA 二级结构预测:包含接吻发夹基序的新策略

本文提出三种用于预测RNA二级结构中接吻发夹基序的新策略,结合规范化规则与非歧义动态规划,分别在时间与空间复杂度之间进行权衡。策略A以O(n⁴)时间和O(n²)空间实现高效预测;策略B通过存储次优结果扩大搜索空间,空间复杂度升至O(n³);策略C全面探索组合可能,时间复杂度为O(n⁵),但保持O(n²)空间。实验表明不同策略适用于不同复杂度的序列,为RNA结构预测提供了灵活且可扩展的解决方案。

j7k8l的博客 133

OpenOCD入门到精通:第 4 章 配置文件体系详解

本文深入解析OpenOCD配置文件的体系结构和工作机制。首先介绍了配置文件的搜索路径优先级和加载顺序,以及配置阶段与运行阶段的区别。然后详细分析了interface配置文件的适配器参数调优方法,包括ST-Link、CMSIS-DAP和FTDI等常见调试器的配置示例。最后重点讲解了target配置文件的核心结构,包括TAP声明、目标创建和工作区设置等关键步骤,并以stm32f1x为例展示了完整的配置流程。通过本文可以全面了解OpenOCD配置文件的分层设计理念和参数化配置方法。

从事嵌入式linux android驱动开发,拥有全栈能力 595

k8s集群化部署之控制器

一、控制器类型 pod一般分为自主式 Pod和控制器管理的 Pod 自主式 Pod:Pod 退出后不会被创建 控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目 常用的控制器有四类: ReplicaSet和ReplicationController Deployments DaemonSet StatefulSets 其中ReplicaSet和ReplicationController不单独使用,一般是和Deployments控制器一起使用的 Replication Controll

weixin_43834060的博客 382

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

将该路径修改到config/semanticktti.yaml文件中的data_path节点下。下载semanticKITTI数据集的点云数据和标签,解压到一起。系统:Ubuntu18。

zhaoguanhua的博客 2601

Kubernetes StatefulSets有状态应用

创建 StatefulSet 它创建了一个 Headless Service nginx 用来发布 StatefulSet web 中的 Pod 的 IP 地址。 apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVe

爱死亡机器人 1084

我用C#实现上位机数据一键导出Excel:从乱码到百万行数据秒级导出的实战技巧

ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("日报表");// 1. 标题(合并单元格)worksheet.Cells["A1"].Value = $"产线日报表 -DateTimeNowToString// 2. 表头和数据(同上)worksheet.Cells["A3"].Value = "时间";// ...省略表头和数据填充// 3. 合计行(公式计算)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 713

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Kubernetes中的statefulset控制器

在statefulset控制器创建的pod,每次重新创建pod时,虽然pod的ip会变,但是每个pod的网络标识pod的名字)和pod的存储状态不会变。

huaz_md的博客 675

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)

【代码】kubernetes学习之资源(对象)控制器概述---概念和实战(五)

zsk_john的技术分享专用博客 630

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

k8s资源对象(2) 控制器(ReplicaSet,deploy,StatefulSet,DaemonSet,job)

k8s控制器使用

运维架构师学习之路 635

k8s的控制器实践

k8s的控制器实践

NickDeCodes的博客 173

k8s 部署 Headlamp

k8s 部署 Headlamp

liu_chen_yang的博客 1121

关于 K8s 的一些基础概念整理-补充【k8s系列之二】

本文继续整理下 K8s 的一些基础概念,作为前一篇概念汇总的补充。

欢迎来到橙子家的博客。 1490
上一篇: K8s: 控制器之Deployment对象
下一篇: K8s: 控制器之DaemonSet对象和调度
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值