k8s中statefulset资源类型的深入理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s中statefulset资源类型的深入理解相关的知识,希望对你有一定的参考价值。

参考技术A

statefulset是为了解决 有状态服务 的问题,而产生的一种资源类型(deployment和replicaSets是解决无状态服务而设计的)。

这里可能有人说,mysql是有状态服务吧,但我使用的是deploment资源类型,mysql的data数据通过pv的方式存储在第三方文件系统中,也能解决mysql数据存储问题。

是的,如果你的mysql是单节点,使用deployment类型确实可以解决数据存储问题。但是如果你的有状态服务是集群,节点之间有主备或者主从之分,且每个节点分片存储的情况下,deployment则不适用这种场景,因为deployment不会保证pod的有序性,集群通常需要主节点先启动,从节点在加入集群,statefulset则可以保证,其次deployment资源的pod内的pvc是共享存储的,而statefulset下的pod内pvc是不共享存储的,每个pod拥有自己的独立存储空间,正好满足了分片的需求,实现分片的需求的前提是statefulset可以保证pod重新调度后还是能访问到相同的持久化数据。

适用statefulset常用的服务有elasticsearch集群,mogodb集群,redis集群等等。

基于上面的特性,可以发现statefulset由以下几个部分组成:

创建一个headless service,service.yaml文件。

注意:该headless类型service和clusterIp类型的serivice有明显区别,spec下是 clusterIp: None

接着创建一个statefulSet的资源,statefulset.yaml文件。

可以注意到statefulset资源pvc的创建是使用的volumesClaimTemplates,会在俩个pod中分别创建一个资源互相隔离的pvc。

在spec相比deployment多了一个serviceName配置,该值就是对应的headless service。

删除statefulset后,pvc不会自动删除需要我们手动删除

v1.7+支持statefulset的自动更新,通过 spec.updateStrategy 设置更新策略,目前支持俩种策略:

RollingUpdate更新策略还支持Partitions,通过 spec.updateStategy.rollingUpdate.partition 来设置。当partition设置后,只有序号大于或者等于partition的pod会在 spec.templdate 更新的时候滚动更新,而其他pod则保持不变(即便是删除后也是使用以前版本重新创建)。

v1.7+可以通过 .spec.podManagementPolicy 设置pod的管理策略,支持以下俩中方式

使用statefulset资源类型的服务通常有以下几点特点

以上是关于k8s中statefulset资源类型的深入理解的主要内容,如果未能解决你的问题,请参考以下文章

深入理解k8s operator 机制

K8s中的StatefulSet应用

深入理解K8S——Pod Preemption资源抢占

K8S介绍系列---Statefulset介绍

理解 K8s 资源更新机制,从一个 OpenKruise 用户疑问开始

理解 K8s 资源更新机制,从一个 OpenKruise 用户疑问开始