• Kubernetes学习笔记-StatefulSet:部署有状态的多副本应用(1)20220624


    回顾:
    之前学习了如何运行一个单实例pod和无状态的多副本pod,如何通过持久化存储运行一个有状态的pod,可以运行多个副本的实例,运行一个提供持久化存储的单数据库pod实例,这个持久化存储可以是简单的pod卷或绑定到持久化卷上的持久卷声明。
    是否可以通过ReplicaSet来复制数据库pod呢?答案是否定的
    通过ReplicaSet可以复制无状态pod,但是如果每个pod都有独立的持久卷声明,就是有状态的,无法通过ReplicaSet复制多个绑定了持久卷的pod。可以通过StatefulSet来管理有状态pod
    可以创建一个StatefulSet资源替代ReplixaSet来运行这类pod


    对比StatefulSet和ReplicaSet、ReplicationController
    ReplicaSet和ReplicationController管理pod都是无状态的,任何时候他们都可以被一个全新的无状态pod替换。但是有状态的pod挂掉后,需要被替换的实例拥有相同的名称、网络标识、状态,这就需要StatefulSet来管理这类pod。
    StatefulSet保证pod在重新调度后保留他们标识和状态,他可以方便的扩容、缩容。与ReplicaSet不同的是,StatefulSet创建的pod每个都拥有一组独立的数据卷(持久化状态),pod名字都是有规律的,而不是每个新pod都是随机获取一个名字


    用StatefulSet管理的pod名称
    一个StatefulSet创建的每个pod都有一个从零开始的顺序索引,这个会体现在pod的名称和主机名上,还会体现在pos对应的固定存储上。这些pod名称是可预知的,他是由StatefulSet的名称加该实例的顺序索引值组成。
    有状态的pod有时候需要通过其主机名来定位,而无状态的pod则不需要,因为每个无状态的pod都是一样的,在需要的时候随便选择一个即可。但对于有状态的pod来说,因为他们彼此不同,通常希望操作的是其中特定的一个。
    所以StatefulSet通常要求创建一个用来记录每个pod网络标记的headless Service。通过这个Service每个pos将拥有独立的DNS记录,这个集群里他的伙伴或者客户端可以通过主机名方便的找到他。
    也可以通过DNS服务,查找域名对应的SRV服务,获取一个StatefulSet中所有pod名称。

    扩缩容StatefulSet

    1)扩容

    扩容一个StatefulSet会使用下一个还没用到的顺序索引值创建一个新的pod实例。

    2)缩容

    缩容一个StatefulSet时,比较好的是很明确哪个pod将要被删除,对比Replicaet缩容操作则不同,不知哪个实例会被删除,也不能指定先删除哪个实例。。缩容StatefulSet将会最先删除最高索引值的实例。

    因为StatefulSet缩容任何时候只会操作一个pod实例,送一有状态应用的缩容不会很迅速。比如一个分布式存储应用若同时下线多个节点,则可能导致其中数据丢失。

    基于以上原因,StatefulSet在有实例不健康的情况下不允许做缩容操作。

  • 相关阅读:
    FPGA-串口接收图像写入RAM并读出在TFT显示屏上显示
    什么是悲观锁,乐观锁,举例和适用场景,悲观锁实现
    【知识积累】关于解决生产Limit导出重复数据的心路历程
    【神印王座】悲啸洞穴中隐藏的人有多强?实力不如魔神皇,靠一绝招魔神皇都怕
    Windows下DOS窗口修改编码
    高级深入--day40
    Shiro学习笔记(1)——shiro入门
    Spring Boot 常用注解与详解
    推荐三个搭建专有知识库+大模型智能助手开源项目
    Vue组件之间通信
  • 原文地址:https://blog.csdn.net/wwxsoft/article/details/125453417