什么是StatefulSet
StatefulSet 是Kubernetes中的一种控制器,他解决的什么问题呢?我们知道Deployment是对应用做了一个简化设置,Deployment认为一个应用的所有的pod都是一样的,他们之间没有顺序,也无所谓在那台宿主机上。需要扩容的时候就可以通过pod模板加入一个,需要缩容的时候就可以任意杀掉一个。但是实际的场景中,并不是所有的应用都能做到没有顺序等这种状态,尤其是分布式应用,他们各个实例之间往往会有对应的关系,例如:主从、主备。还有数据存储类应用,它的多个实例,往往会在本地磁盘存一份数据,而这些实例一旦被杀掉,即使从建起来,实例与数据之间关系也会丢失,而这些实例有不对等的关系,实例与外部存储有依赖的关系的应用,被称作“有状态应用”。StatefulSet与Deployment相比,相同于他们管理相同容器规范的Pod,不同的时候,StatefulSet为pod创建一个持久的标识符,他可以在任何编排的时候得到相同的标识符。
StatefulSet的应用特点:
- 稳定且有唯一的网络标识符 当节点挂掉,既pod重新调度后其PodName和HostName不变,基于Headless Service来实现
- 稳定且持久的存储 当节点挂掉,既pod重新调度能访问到相同的持久化存储,基于PVC实现
- 有序、平滑的扩展、部署 即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现。
- 有序、平滑的收缩、删除 既Pod是有顺序的,在收缩或者删除的时候要依据定义的顺序依次进行(既从N-1到0,既倒序)。
我们可以把这些抽象成两种应用状态:
- 拓扑状态。是应用多个实例之间的不完全对等的关系,这些应用实例是必须按照定义的顺序启动的。例如主应用A先于从应用B启动,如果把A和B删掉,应用还要按照先启动主应用A再启动从应用B,且创建的应用必须和原来的应用的网络标识一样(既PodName和HostName)。这样他们就可以按照原来的顺序创建了。
-
之间不是完全对等的关系
极客时间版权所有: https://time.geekbang.org/column/article/41017
所以 StatefulSet的核心功能就是,通过某种方式记录应用状态,在Pod被重建的时候,通过这种方式还可以恢复原来的状态。
从上面的应用场景可以发现,StatefulSet由以下几个部分组成:
- Headless Service 用于定义网络标识(DNS)
- volumeClaimTemplates 用于创建PV
- StatefulSet 用于定义具体应用
讲解Headless Service
我们知道kubernetes中的service是定义pod暴露外部访问的一种机制,例如:3个pod,我们可以定义一个service通过标签选择器选到这三个pod,然后让问这个service就可以访问这个pod。可以出门左转,看一下 Service的讲解。 我们这里具体讲一下Headless service。
Headless service是Service通过DNS访问的其中一种方式,只要我们访问"mypod.stsname.namespace.svc.cluster.local",我们就会访问到stsname下的mypod。而Service DNS的方式下有两种处理方法:
- Normal Service 这里访问"mypod.stsname.namespace.svc.cluster.local"的时候会得到mypod的service的IP,既VIP。
- Headless Service 这里访问"mypod.stsname.namespace.svc.cluster.local"的时候会得到mypod的IP,这里我们可以看到区别是,Headless Service 不需要分配一个VIP,而是通过DNS访问的方式可以解析出带代理的Pod的IP
Headleaa Service的定义方式:
Headless Service也是一个标准的Service的YAML文件,只不过clusterIP定义为None,既,这个service没有VIP作为"头"。以DNS会记录的方式记录所有暴露它代理的Pod。而它代理的Pod依然会采用标签选择器的机制选择。既:所有携带了 app=myapp 标签的pod。都会被service代理起来。
DNS格式:
StatefulSet详解
kubectl explain sts.spec 主要字段解释:
- replicas 副本数
- selector 那个pod是由自己管理的
- serviceName 必须关联到一个无头服务商
- template 定义pod模板(其中定义关联那个存储卷)
- volumeClaimTemplates 生成PVC
部署一个statefulset服务
这里我们用的storageClass,PV和PVC会动态创建。这个跑成功必须创建一个rook服务的动态存储,创建方法参考 rook官网。
查看一下服务
查看pv/pvc
查看pod
验证解析
扩容(扩展应该是按顺序扩展)
缩容 (按倒序缩容)
升级
查看升级策略
kubectl explain sts.spec.updateStrategy
- rollingUpdate 滚动更新
kubectl explain sts.spec.updateStrategy.rollingUpdate
- partition 分区更新,默认partition的值是0,当partition等N,N+的都会更新。
默认partition是从0开始更新
当partition等于4的时候,4以后的都要更新。
Normal Service
极客时间版权所有
__EOF__