(k8s)kubernetes中的StatefulSet

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 资源的状态主要包括以下几个方面:

  1. Replicas: 指定的副本数,即 .spec.replicas字段的值。表示 StatefulSet 管理的副本数量。

  2. ReadyReplicas: 表示已经就绪的副本数量,即当前运行且已经READY的Pod数。

  3. CurrentReplicas: 表示当前正在运行的副本数量,即运行中的Pod总数。

  4. UpdatedReplicas: 表示已经更新的副本数量,即最近一次更新中,更新成功的Pod数。

  5. CurrentRevision: 当前正在执行的修订版本号。

  6. UpdateRevision: StatefulSet 的当前修订版本号。 StatefulSet 的模板(.spec.template)每次更新时,这个值就会增加1

  7. collisionCount:表示在创建 Pod 时发生的命名冲突的次数。

  8. UpdateStatus: 最近一次更新的状态,可以是"Running"或者"Failed"。

  9. 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由三个组件组成:HeadLessServiceStateFulSet控制器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 地址
Headless
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值