Kubernetes必备知识: StatefulSet-阿里云开发者社区

开发者社区> 阿里云术语库> 正文

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

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

阿里云术语库提供术语的标准定义、缩略语、术语用法及多语言等,提供术语的增删改查等功能。

官方博客
官网链接