1. StatefulSet基本概述
对于我们部署的应⽤,⼤体可以分为两类,⼀类是⽆状态应⽤
,⼀类是有状态应⽤
-
像web这种类型的应用,就属于无状态应用,他们不需要存储任何数据至本地,也没有任何次序之分,同时所提供的服务也是完全一样的,像这类应用,就可以通过Deployment控制器来进行编排和部署;
-
像MySQL、Redis这类需要存储数据的应用程序,称之为有状态应用,它们有的有角色之分,有的是主节点,有的是从节点,而有的又存在先后次序之分。
1.0 应用场景
StatefulSet是一种用于运行有状态应用程序的控制器
,它具有稳定的网络标识符
、有序的
、逐个更新的部署方式以
及持久性存储
等特点,适用于需要这些特性的有状态应用程序
1.1 什么是StatefulSet
StatefulSet 是用来管理有状态应用的工作负载 API 对象。
StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。
Kubernetes StatefulSet是一种用于运行有状态应用的控制器。
StatefulSet是一个有序的、可标识的Pod组,并且每个Pod都有一个独特的标识符。
这使得StatefulSet能够管理有状态应用程序,例如数据库或队列服务,这些应用程序需要稳定的网络标识符或持久性存储,并且需要有序的、逐个更新的部署方式。
1.2 StatefulSet特点
1. 稳定且唯一的网络标识符
2. 稳定且持久的存储.
3. 有序、平滑地部署和扩展.
4. 有序、平滑的删除和终止.
5. 有序的滚动更新
1.(StatefulSet提供稳定的Pod名称,结合HeadLessService提供Pod唯⼀的DNS标识)
2.为每个Pod提供⼀个PVC,作为后端的存储,Pod故障重新启动任然会使⽤此前的PVC
3.⽐如redis主从复制r1-r6,⼀般先启动主节点r1,⽽后启动从节点r2-r6
4.⽐如redis主从复制r1-r6,⼀般先从r6-r2从节点开始删除,最后删除r1主节点
5.⽐如Redis主从复制r1-r6,⼀般先更新r2-r6从节点,⽽后更新r1主节点,前提是能兼容
在上⾯描述中,“稳定的”意味着 Pod 调度或重调度的整个过程是有持久性的(名称不变、pvc不变)。如果应⽤程序不需要任何稳定的标识符或有序的部署以及删除,则应该使⽤⽆状态的副本控制器来部署应⽤程序,⽐如Deployment或者ReplicaSet
1.3 StatefulSet资源状态
StatefulSet 资源的状态主要包括以下几个方面:
-
Replicas: 指定的副本数,即 .spec.replicas字段的值。表示 StatefulSet 管理的副本数量。
-
ReadyReplicas: 表示已经就绪的副本数量,即当前运行且已经READY的Pod数。
-
CurrentReplicas: 表示当前正在运行的副本数量,即运行中的Pod总数。
-
UpdatedReplicas: 表示已经更新的副本数量,即最近一次更新中,更新成功的Pod数。
-
CurrentRevision: 当前正在执行的修订版本号。
-
UpdateRevision: StatefulSet 的当前修订版本号。 StatefulSet 的模板(.spec.template)每次更新时,这个值就会增加1
-
collisionCount:表示在创建 Pod 时发生的命名冲突的次数。
-
UpdateStatus: 最近一次更新的状态,可以是"Running"或者"Failed"。
-
ObservedGeneration: 最近一次对 StatefulSet 资源的更改,已经被看到的 Generation 数。也就是说如果 StatefulSet 的 .spec 字段被修改,该值会更新。
status:
observedGeneration: 2
replicas: 3
readyReplicas: 3
currentReplicas: 3
updatedReplicas: 3
updateRevision: "2"
currentRevision: "2"
observedGeneration 是 2,表示 StatefulSet 的 .spec 字段已经修改过两次。
replicas 是 3,表示指定的副本数为 3。
readyReplicas, currentReplicas 和 updatedReplicas 都是 3,表示所有的 3 个副本都已经准备就绪。
updateRevision 和 currentRevision 都是 "2",表示 StatefulSet 的模板已经更新两次,当前正在运行的也是第 2 个版本。
updateStatus 没有出现,表示最近一次更新状态是正常的。
1.4 StatefulSet组成部分
StatefulSet由三个组件组成:HeadLessService
、StateFulSet控制器
、VolumeClaimTemplate
StatefulSet控制器
StatefulSet名称是固定,且创建时按照顺序进⾏创建,并固定对应的Pod名称
Headless Service
Service 是 Kubernetes 项目中用来将一组 Pod 暴露给外界访问的一种机制(在我看来,把他当作为反向代理的架构更容易理解)
访问service的方式
- 是以 Service 的 VIP(Virtual IP,即:虚拟 IP)方式。比如:当我访问 10.0.23.1,这个 Service 的 IP 地址时,10.0.23.1 其实就是一个 VIP,它会把请求转发到该 Service 所代理的某一个 Pod 上。
- 是以 Service 的 DNS 方式。比如:这时候,只要我访问“my-svc.my�namespace.svc.cluster.local”这条 DNS 记录,就可以访问到名叫 my-svc 的 Service 所代理的某一个 Pod
而在Service DNS的方式下,还会有两种处理方式
- Normal Service。这种情况下,你访问“my-svc.my�namespace.svc.cluster.local”解析到的,正是 my-svc 这个 Service 的 VIP,后面的流程就跟VIP 方式一致了。
- Headless Service。这种情况下,你访问“my-svc.my�namespace.svc.cluster.local”解析到的,直接就是 my-svc 代理的某一个 Pod 的 IP 地址。可以看到,这里的区别在于,Headless Service 不需要分配一个 VIP,而是可以直接以 DNS 记录的方式解析出被代理 Pod 的 IP 地址