Kubernetes必备知识: StatefulSet

简介: StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现 有序部署,有序扩展,即Pod是有顺序的

所属技术领域:

K8s

|名词定义|

StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括
 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
 有序收缩,有序删除(即从N-1到0)
从上面的应用场景可以发现,StatefulSet由以下几个部分组成:
 用于定义网络标志(DNS domain)的Headless Service
 用于创建PersistentVolumes的volumeClaimTemplates
 定义具体应用的StatefulSet
StatefulSet中每个Pod的DNS格式为statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local,其中
 serviceName为Headless Service的名字
 0..N-1为Pod所在的序号,从0开始到N-1
 statefulSetName为StatefulSet的名字
 namespace为服务所在的namespace,Headless Servic和StatefulSet必须在相同的namespace
 .cluster.local为Cluster Domain,

|技术特点|

StatefulSet:主要是时面向有状态应用管理的控制器
StatefulSet能较好地满足一些有状态应用特有的需求
1.每个Pod有Order序号,会按序号创建、删除、更新Pod
2.通过配置headless service,使每个Pod有一个唯一的网络标识(hostname)
3.通过配置pvc template,每个Pod有一块独享的pv存储盘
 StatefulSet范例创建
图片.png
图片.png

 StatefulSet状态
$kubectl get endpoints nginx
$kubectl get sts nginx-web
 管理模式
StatefulSet会创建管理的资源:
ControlleRevision:通过这个资源,StatefulSet可以很方便地管理不同版本的template模板
PVC:如果在StatefulSet中定义了volumeClaimTemplates,StatefulSet会在创建Pod之前,先根据这个模板创建PVC,并把PVC加到Pod volumes中。
Pod:StatefulSet按照顺序创建和、删除、更新Pod,每个Pod有唯一的序号。
 StatefulSet控制器
图片.png

 扩容模拟
StatefulSet的Pod,从序号0开始创建。因此,replicas=N的一个StatefulSet,创建出的Pod序号为[0,N)
图片.png

 扩缩容管理策略
StatefulSet.spec中,有一个字段名为位podManagementPolicy,可选策略为OrderedReady和Parallel,默认为前者。
OrderReady:扩缩容按照order顺序执行。扩容时,必须前面序号的Pod都ready了,才能扩下一个;缩容时,按照倒序删除。
Parallel:并行扩缩容,不需要等前面Pod都ready或删除后再处理下一个。
图片.png

 发布模拟
图片.png

 StatefulSet注意事项
1.还在beta状态,需要kubernetes v1.5版本以上才支持
2.所有Pod的Volume必须使用PersistentVolume或者是管理员事先创建好
3.为了保证数据安全,删除StatefulSet时不会删除Volume
4.StatefulSet需要一个Headless Service来定义DNS domain,需要在StatefulSet之前创建好
5.目前StatefulSet还没有feature complete,比如更新操作还需要手动patch。

|资料来源|

名词定义:https://www.kubernetes.org.cn/statefulset
技术特点:https://www.kubernetes.org.cn/statefulset

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
Kubernetes 容器 Perl
【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
183 0
|
存储 Kubernetes 网络协议
【K8S系列】深入解析StatefulSet(一)
【K8S系列】深入解析StatefulSet(一)
1173 2
|
存储 应用服务中间件 nginx
kubernetes Statefulset控制器
kubernetes Statefulset控制器
|
存储 Kubernetes 负载均衡
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
547 2
|
存储 Kubernetes 网络协议
k8s学习-StatefulSet(模板、更新、扩缩容、删除等)
k8s学习-StatefulSet(模板、更新、扩缩容、删除等)
827 0
|
存储 Kubernetes 数据库
剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景
剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景
932 0
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
573 0
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
577 0
|
Kubernetes Go Docker
【k8s 系列】k8s 学习二十六-3,Statefulset 实战 1
上一部分与大家分享到 Statefulset 与 RplicaSet 的区别,以及 Statefulset 的特点,能做的一些事情及一些注意事项
190 0
|
存储 Kubernetes NoSQL
k8s学习--资源控制器StatefulSet详细解释与应用
StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器,提供稳定的网络标识符和持久化存储能力。相较于 Deployment、DaemonSet 等无状态服务控制器,StatefulSet 支持有状态服务如 MySQL、Redis 等集群的部署和管理。本文详细介绍 StatefulSet 的概念、特点及部署方法,并通过具体示例展示了如何配置 NFS 存储及 StatefulSet 应用,确保每个 Pod 拥有独立且持久的数据存储空间。
582 0

推荐镜像

更多