• 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在有实例不健康的情况下不允许做缩容操作。

  • 相关阅读:
    c 语言基础:L1-038 新世界
    设计模式浅析(五) ·单例模式
    轴承图片数据集分类效果测试
    SparkSQL的UDF及分析案例,220726,,
    【数据结构】—从直接插入排序升级到希尔排序究极详解(含C语言实现)
    Android 修复在 Settings 首页,按键盘方向键逐个单选
    Java设计模式之状态模式
    万字肝完nodejs入门教程,详解入口,建议收藏(更新中)
    linux常用命令
    基于KubeAdm搭建多节点K8S集群
  • 原文地址:https://blog.csdn.net/wwxsoft/article/details/125453417