1 statefulset基础
1.1 引入原因
deployment, daemonset, job无状态,但是数据库集群的相关服务一般都是有状态的
1.2 statefulset特点
1) 每个pod有唯一网络标识,可用于发现集群内其他成员.
每个结点有固定id,集群中成员可通过该id互相发现并通信。集群规模固定。
2) statefulset控制的pod启停顺序是受控的,操作第n个pod时,
前n-1个pod已经是运行且准备好的状态
3) statefuleset中的pod采用持久化存储卷,通过PV/PVC来实现,
删除pod默认不会删除与statefulset相关的存储卷。
4) statefulset搭配使用headless service,在statefulset中要
声明其属于哪个headless service。
headless service没有Cluster IP,解析headless service的DNS域名,
返回的是该service对应的全部pod的endpoint列表。
5) 每个satefulset的pod的域名格式如下:
$(podname).(headless server name)
FQDN: $(podname).(headless server name).namespace.svc.cluster.local
1.3 statefulset和deployment的区别
deployment的名字是随机的,无法产生固定身份id,并且pod的ip是运行才会产生的。
1.4 statefulset的存储
集群中的pod需要挂接共享存储。
1.5 statefulset应用
1) 持久化存储,pod重新调度后: 还能访问到相同的持久化数据,基于pvc实现
2) 稳定的网络标志,pod重新调度后:其podname和hostname不变,基于headless service(无cluster ip)
3) 有序部署,pod按照顺序启动,按照从0到N-1顺序
4) 逆序删除,删除pod,按照从N-1到0的顺序
1.6 statefulset组成
headless service + 用于创建PersistentVolumes的volumeClaimTemplates + 定语具体应用的statefulset
1.7 statefulset的每个pod的DNS格式
statefulsetName-{0...N-1}.serviceName.namespace.svc.cluster.local
解释:
serviceName: 是headless service名字
statefulsetName:是statefuleSet的名字
namespace: 是服务锁在的namespace, headless service和statefulset必须在同一个namespace下面
.cluster.local: 是cluster domain
注意:
1)StatefulSet 在节点丢失之后不迁移到其它节点,是 work as design
2)删除statefulset不会删除与该statefulset相关联的volume
3)给pod的存储是通过PersistentVo