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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4月前
|
Kubernetes 容器 Perl
【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
【Azure K8S | AKS】在AKS中创建 StatefulSet 示例
|
存储 Kubernetes 网络协议
【K8S系列】深入解析StatefulSet(一)
【K8S系列】深入解析StatefulSet(一)
530 2
|
存储 应用服务中间件 nginx
kubernetes Statefulset控制器
kubernetes Statefulset控制器
|
存储 Kubernetes 负载均衡
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
【Kubernetes系统原理、核心资源、Pod原理与创建及生命周期管理、Job、Cronjob、Statefulset、Service负载均衡Ingress】
391 2
|
20天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
20天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
|
2月前
|
存储 Kubernetes NoSQL
k8s学习--资源控制器StatefulSet详细解释与应用
StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器,提供稳定的网络标识符和持久化存储能力。相较于 Deployment、DaemonSet 等无状态服务控制器,StatefulSet 支持有状态服务如 MySQL、Redis 等集群的部署和管理。本文详细介绍 StatefulSet 的概念、特点及部署方法,并通过具体示例展示了如何配置 NFS 存储及 StatefulSet 应用,确保每个 Pod 拥有独立且持久的数据存储空间。
|
4月前
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
4月前
|
存储 消息中间件 Kubernetes
在K8S中,deploy和Statefulset有何区别?
在K8S中,deploy和Statefulset有何区别?
|
4月前
|
存储 Kubernetes 关系型数据库
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍
35 0