【k8s 系列】k8s 学习二十六-5,Statefulset 实战 3

1,181 阅读4分钟

「这是我参与2022首次更文挑战的第 20 天,活动详情查看:2022首次更文挑战

【k8s 系列】k8s 学习二十六-5,Statefulset 实战 3

上一部分我们说到如何使用 Statefulset 部署有状态的应用,Statefulset 可以做到部署的 每一个 pod 能够独立的拥有一个持久卷声明和持久卷

之前我们 用 Statefulset 和 ReplicaSet 对比,自然他们是有相似之处和不同之处,不同之处前面的文章已经分享了,我们来看看他们的相似之处,那么那就是对于管理副本数的扩容和缩容了

Statefulset 扩容和缩容

查看我们环境中拥有的 1 个 Statefulset 和其管理的 2 个 pod

以及 2 个持久卷声明 pvc 和 2 个持久卷 pv

开始手动删除一个 pod

当我们手动删除 sta-kubia-0 的时候,由于 Statefulset 自身管理的副本数是 2 个,通过标签发现环境中少了一个 pod,因此 Statefulset 会立马创建一个和刚才少的那个一模一样的 pod

通过我们查看 pod 的名称和索引值是我们所期望的,并且是 curl 访问 pod 的提供的接口,获取的相应数据也是我们所期望的

修改副本个数为 3

修改副本数,只需要 kubectl get statefulset 修改 spec 下的 replicas 字段即可

修改副本数之后,通过如下命令查看相应资源情况

kubectl get statefulset
kubectl edit statefulset sta-kubia
kubectl get po | grep sta
kubectl get pv
kubectl get pvc

副本数修改为 3 后,Statefulset 进行了扩容,我们发现确实是创建了一个 pod,索引为 2 ,也同时创建 1 给 pvc 和 pv,实际操作后,效果和我们理论的效果是一致的

将副本数修改为 1

那么我们现在开始缩容,效果会不会和我们理论上的还是一样的呢?

操作和上述类似,将副本数修改为 1 即可

进行缩容之后,我们可以看到 索引为 3 和 2 的 两个 pod 都被删掉了,但是他们的 持久化卷声明和持久化卷仍然还在,当然里面的数据也是还在的,感兴趣的小伙伴可以尝试使用 curl 命令去请求一下,结果会如你所愿

将副本数修改回 3

那么现在我们再进行扩容,Statefulset 是否会将刚才删除的 2 个 pod全部恢复回来呢?要恢复成一模一样的哦?

咱们查看到效果果然和我们理论的一毛一样,没有偏差哦

sta-kubia-1 和 sta-kubia-2 又回来了,有没有失而复得的喜悦呢?

Statefulset 说,我说到做到,之前给你说是啥样子的,现在我就会做成啥样子给你看,还不错吧

图解上述案例

如图,分为 3 步骤,该图是用来表示我们手动或者由于异常删除了一个 pod,此时 Statefulset 的副本数是 2

image-20220213182949663

  1. 删除了 1 个pod sta-kubia-1
  2. sta-kubia-1 对应的 卷还是在环境中的,是没有被删除的
  3. Statefulset 通过标签识别到少了 1 个 pod,因此会重新创建 1 个 pod,这个 pod 和原来的 pod 一模一样,标识,状态等等完全一致,新建的 pod sta-kubia-1 仍然直接使用原来的 卷 1

下图是表示修改 Statefulset 的 replicas 进行扩缩容

同样也是分 3 步骤

  1. 环境中 repilicas 副本数 为 3 ,通过编辑 Statefulset ,将副本数修改为 1,此时 k8s 会从最高索引,由大到小的删除,最终剩下 1 个 pod ,也就是 sta-kubia-0
  2. 删除掉 2 个 pod 之后,仍然是保留了原有 pod 的卷,Statefulset 是不会去删除卷的
  3. 人为的将 repilicas 副本数从 1 修改为 3,Statefulset 会如何我们所想的重新恢复原有的 2 个 pod,即 sta-kubia-1,和 sta-kubia-2,这俩pod 仍然可以直接使用原来的卷 1 和 卷 2

看到这里了,有没有发现 Statefulset 和 Deployment 有一个共同点,那就是 Statefulset 删除 pod 的时候,不会去删除卷,Deployment 在滚动升级的时候,不会删除 RS/RS

所以我们是否可以联想到 Statefulset 的升级,也是可以像 Deployment 一样可以支持滚动升级呢?

没错,确实是可以的,以前不太行,k8s 从 1.7 版本之后就支持了,操作的方式和 Deployment 类似,如果对于 Deployment 显示升级应用的细节有疑问的,可以查看文章 【k8s 系列】k8s 学习二十五-2,Deployment 升级应用

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~