概述
RC,部署,DaemonSet都是面向无状态的服务,它们所管理的豆荚的IP,名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL, MongoDB集群等。
StatefulSet本质上是部署的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的豆荚拥有固定的豆荚名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(主机名),还必须要用到共享存储。
在部署中,与之对应的服务是服务,而在StatefulSet中与之对应的无头服务,无头的服务,即无头服务,与服务的区别就是它没有集群IP,解析它的名称时将返回该无头服务对应的全部吊舱的端点列表。
除此之外,StatefulSet在无头服务的基础上又为StatefulSet控制的每个吊舱副本创建了一个DNS域名,这个域名的格式为:
(podname美元)。(无头服务器名称)
FQDN:美元(podname)。(无头服务器名称).namespace.svc.cluster.local
StatefulSet示例
接下来看一些示例,演示下上面所说的特性,以加深理解。
apiVersion: v1
:
服务元数据:
名称:nginx
标签:
应用:规范nginx
:
港口:
-
<李>
端口:80
名称:web
clusterIP:没有
选择器:
应用:nginx
apiVersion:应用程序/v1
: StatefulSet
元数据:
名称:网络规范
:
选择器:
matchLabels:
应用:nginx .spec.template.metadata #必须匹配。
标签名:“nginx"#声明它属于哪个无头服务。
副本:3 #默认是1
模板:
元数据:
标签:
应用:nginx .spec.selector #必须匹配。规范matchLabels
:
terminationGracePeriodSeconds: 10
容器:
-
<李>名称:nginx
图片:k8s.gcr.io/nginx-slim: 0.8
港口:
-
<李> containerPort: 80
名称:web
volumeMounts:李> <李>名称:www
mountPath:/usr/share/nginx/html
volumeClaimTemplates: #可看作聚氯乙烯的模板李> 李
名称:www规范
:
accessModes:(“ReadWriteOnce"]
storageClassName:“gluster-heketi"#存储类名,改为集群中已存在的
资源:
请求:
存储:1 gi
通过该配置文件,可看出StatefulSet的三个组成部分:李>
无头服务:名为nginx,用来定义Pod网络标识(DNS域)。
StatefulSet:定义具体应用,名为nginx,有三个吊舱副本,并为每个荚定义了一个域名。
volumeClaimTemplates:存储卷申请模板,创建PVC、指定PVC名称大小,将自动创建PVC、且PVC必须由存储类供应。
为什么需要无头服务无头服务?
在用部署时,每一个豆荚名称是没有顺序的,是随机字符串,因此是豆荚名称是无序的,但是在StatefulSet中要求必须是有序,每一个圆荚体不能被随意取代,荚重建后Pod名称还是一样的。而Pod IP是变化的,所以是以Pod名称来识别.pod名称是豆荚唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个豆荚一个唯一的名称。
为什么需要volumeClaimTemplate ?
对于有状态的副本集都会用到持久存储,对于分布式系统来讲,它的最大特点是数据是不一样的,所以各个节点不能使用同一存储卷,每个节点有自已的专用存储,但是如果在部署中模板的豆荚里定义的存储卷,是所有副本集共用一个存储卷,数据是相同的,因为是基于模板来的,而StatefulSet中每个豆荚都要自已的专有存储卷,所以StatefulSet的存储卷就不能再用圆荚体模板来创建了,于是StatefulSet使用volumeClaimTemplate,称为卷申请模板,它会为每个吊舱生成不同的PVC、并绑定pv,从而实现各舱有专用存储。这就是为什么要用volumeClaimTemplate的原因。
创建:
美元kubectl创建- f nginx。yaml
服务“nginx"创建
statefulset“web"创建
看下这三个吊舱创建过程:
第号一个是创建web-0
kubectl得到pod
web-0 1/1美元ContainerCreating 0 51 s
#待web-0运行且准备好时,创建web-1
kubectl得到pod
web-0 1/1美元0 51 s
运行web-1 ContainerCreating 0/1 0 42 s
#待web-1运行且准备好时,创建web-2
kubectl得到pod
web-0 1/1美元0 1 m
web-1 1/1运行运行0 45 s
web-2 1/1 ContainerCreating 36 0年代
#最后三个舱全部运行且准备
美元kubectl准备Pod
名称状况重启年龄
web-0 1/1运行0 4 m
web-1 1/1运行0 3 m
web-2 1/1运行0 1 m
根据volumeClaimTemplates自动创建的PVC
美元kubectl pvc
名字状态体积容量访问模式STORAGECLASS年龄