|NO.Z.00139|——————————|CloudNative|——|KuberNetes&资源调度.V09|——|statefulset.v01|概述|
一、StatefulSet有状态应用管理
### --- 有状态应用管理StatefulSet
~~~ # 注:StatefulSet:是创建有状态应用的,会为每个Pod起一个固定的名称,
~~~ # 每个Pod的名称加上他的service名称就可以访问到这个Pod。
~~~ StatefulSet(有状态集,缩写为sts)常用于部署有状态的且需要有序启动的应用程序,
~~~ 比如在进行SpringCloud项目容器化时,Eureka的部署是比较适合用StatefulSet部署方式的,
~~~ 可以给每个Eureka实例创建一个唯一且固定的标识符,
~~~ 并且每个Eureka实例无需配置多余的Service,
~~~ 其余Spring Boot应用可以直接通过Eureka的Headless Service即可进行注册。
~~~ # Eureka的statefulset的资源名称是eureka,
~~~ eureka-0 eureka-1 eureka-2(启动了3个pod,pod的名称为)
~~~ # Service:headless service(无头service,没有IP),没有ClusterIP eureka-svc
~~~ Eureka-0.eureka-svc.NAMESPACE_NAME
~~~ eureka-1.eureka-svc …(通过这个名称可以连接到Eureka集群)
### --- StatefulSet的基本概念
~~~ StatefulSet主要用于# 管理有状态应用程序的工作负载API对象。
~~~ 比如在生产环境中,可以部署ElasticSearch集群、
~~~ MongoDB集群或者需要持久化的RabbitMQ集群、Redis集群、Kafka集群和ZooKeeper集群等。
~~~ 和Deployment类似,一个StatefulSet也同样管理着基于相同容器规范的Pod。
~~~ 不同的是,StatefulSet为每个Pod维护了一个粘性标识。
~~~ # 这些Pod是根据相同的规范创建的,但是不可互换,每个Pod都有一个持久的标识符,
~~~ 在重新调度时也会保留,一般格式为StatefulSetName-Number。
~~~ 比如定义一个名字是Redis-Sentinel的StatefulSet,指定创建三个Pod,
~~~ 那么创建出来的Pod名字就为Redis-Sentinel-0、Redis-Sentinel-1、Redis-Sentinel-2。
~~~ # 而StatefulSet创建的Pod一般使用Headless Service(无头服务)进行通信,
~~~ 和普通的Service的区别在于Headless Service没有ClusterIP,
~~~ 它使用的是Endpoint进行互相通信,Headless一般的格式为:
~~~ statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local。
### --- StatefulSet说明
~~~ serviceName为Headless Service的名字,创建StatefulSet时,
~~~ 必须指定Headless Service名称; 0..N-1为Pod所在的序号,
~~~ 从0开始到N-1;statefulSetName为StatefulSet的名字;namespace为服务所在的命名空间;
~~~ cluster.local为Cluster Domain(集群域)。
### --- StatefulSet实验一:
~~~ 假如公司某个项目需要在Kubernetes中部署一个主从模式的Redis,
~~~ 此时使用StatefulSet部署就极为合适,因为StatefulSet启动时,
~~~ 只有当前一个容器完全启动时,后一个容器才会被调度,
~~~ 并且每个容器的标识符是固定的,那么就可以通过标识符来断定当前Pod的角色。
### --- StatefulSet实验二:
~~~ 比如用一个名为redis-ms的StatefulSet部署主从架构的Redis,
~~~ 第一个容器启动时,它的标识符为redis-ms-0,并且Pod内主机名也为redis-ms-0,
~~~ 此时就可以根据主机名来判断,当主机名为redis-ms-0的容器作为Redis的主节点,其余从节点,
~~~ # 那么Slave连接Master主机配置就可以使用不会更改的Master的Headless Service,
~~~ 此时Redis从节点(Slave)配置文件如下:
port 6379
slaveof redis-ms-0.redis-ms.public-service.svc.cluster.local 6379 //在master节点上写上slave名称。
tcp-backlog 511
timeout 0
tcp-keepalive 0
……
~~~ 其中redis-ms-0.redis-ms.public-service.svc.cluster.local是
~~~ Redis Master的Headless Service,
~~~ 在同一命名空间下只需要写redis-ms-0.redis-ms即可,
~~~ 后面的public-service.svc.cluster.local可以省略。
二、StatefulSet注意事项
### --- 一般StatefulSet用于有以下一个或者多个需求的应用程序:
~~~ # 需要稳定的独一无二的网络标识符。
~~~ 需要持久化数据。(当然不适用持久化数据也是可以使用的,
~~~ 只是为了数据安全考虑会做这步操作)需要有序的、优雅的部署和扩展。
~~~ 需要有序的自动滚动更新。
~~~ # 如果应用程序不需要任何稳定的标识符或者有序的部署、删除或者扩展,
~~~ 应该使用无状态的控制器部署应用程序,比如Deployment或者ReplicaSet。
~~~ # StatefulSet是Kubernetes 1.9版本之前的beta资源,
~~~ 在1.5版本之前的任何Kubernetes版本都没有。
~~~ Pod所用的存储必须由PersistentVolume Provisioner(持久化卷配置器)
~~~ 根据请求配置StorageClass或者由管理员预先配置,当然也可以不配置存储。
~~~ # 为了确保数据安全,删除和缩放StatefulSet不会删除与StatefulSet关联的卷,
~~~ 可以手动选择性地删除PVC和PV(关于PV和PVC请参考2.2.12节)。
~~~ StatefulSet目前使用Headless Service(无头服务)负责Pod的网络身份和通信,
~~~ 需要提前创建此服务。删除一个StatefulSet时,不保证对Pod的终止,
~~~ 要在StatefulSet中实现Pod的有序和正常终止,可以在删除之前将StatefulSet的副本缩减为0。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器