StatefulSet是用来管理stateful(有状态)应用的
StatefulSet管理Pod时,确保Pod有一个按序增加的ID
与Deployment最大的不一样是StatefulSet始终将一系列不变的名字分配给Pod.这些Pod从一个模板建立,可是并不能相互替换html
对于有以下要求的应用程序,StatefulSet很是适用
须要稳定、惟一的网络标识(dnsname)
每一个Pod始终对应各自的存储路径(PersistantVolumeClaimTemplate)
按顺序的增长副本、减小副本,并在减小副本时执行清理
安顺序自动的执行滚动更新nginx
若是一个应用不须要一个稳定的网络标识,或者不须要按顺序部署、删除、增长副本,应该用deployment(无状态)控制器web
Pod的存储要么由storage clas对应的PersistentVolume Provisioner提供,要么由集群管理员事先建立api
删除或scale down一个StatefulSet将不会删除其对应的数据卷,这样保证数据安全安全
删除StatefulSet时,将没法保证Pod正常终止.若是要按顺序优雅的终止StatefulSet中的Pod,能够在删除StatefulSet以前,将scale down 到0 网络
当使用默认的Pod Management Policy(OrderedReady)进行滚动更新时,可能进入一个错误状态,并须要人工介入app
apiVersion: v1 kind: Service metadata: name: nginx-service #headless service的名称 labels: app: nginx #自定义标签 spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx #关联app: nginx的pod --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-d #statefulset控制器的名称 spec: selector: matchLabels: app: nginx #关联app: nginx的pod进行控制 serviceName: "nginx-service" #指定headless service replicas: 2 template: metadata: labels: app: nginx #pod的标签 spec: terminationGracePeriodSeconds: 10 containers: - name: nginx #pod里容器的名称 image: nginx:1.7.9 ports: - containerPort: 80 name: web
StatefulSet中的Pod具有一个惟一标识,该标识由如下几部分组成less
2.1序号dom
假设一个StatefulSet的副本数为N,其中每一个Pod都会被分配一个须要,序号的取值范围从0开始,而且该须要在StatefulSet是惟一的.spa
Pod的Name是StatefulSet的Name + 序号;好比这个配置文件里,有两个副本,第一个Pod的Name就是web-d-0,第二个Pod的Name就是web-d-1
2.2稳定的网络ID
1)StatefulSet中Pod的hostname格式为$(statefulSet name)-$(Pod序号),上面的例子将要建立2个Pod,第一个Pod的Name为:web-d-0,第二个Pod的Name为web-d-1
2)StatefulSet可使用Headless service来控制其Pod所在的域;该域(domain)的格式为: $(service name).$(namespace).svc.cluster.local;
上面例子的域就是:nginx-service.defaule.svc.cluster.local
3)StatefulSet中每一个Pod都被分配一个dnsNmae,格式为:$(pod name).$(所在域)
上面的例子 Pod的dnsName就是 web-d-0.nginx-server.default.svc.cluster.local,其余pod能够经过这个地址找到它
2.3稳定的存储
kubernetes为每个VolumeClaimTemplate建立一份PersistentVolum(存储卷).在上面的例子中,每个Pod都将由StorageClass(存储类)my-storage-class为其建立一个1GB大小的存储卷.
StatefulSet 中 pod.spec.terminationGracePeriodSeconds
不能为 0
上面例子中StatefulSet被建立时:
OrderedReady
OrderedReady 是 .spec.podManagementPlicy
的默认值。其对 Pod 的管理方式已经在 部署和伸缩 StatefulSet 时的执行顺序 详细描述
Parallel
.spec.podManagementPlicy
的取值为 Parallel,则 StatefulSet Controller 将同时并行地建立或终止其全部的 Pod。此时 StatefulSet Controller 将不会逐个建立 Pod,等待 Pod 进入 Running 和 Ready 状态以后再建立下一个 Pod,也不会逐个终止 Pod。
注意:此选项只影响到伸缩(scale up/scale down)操做。更新操做不受影响。
On Delete
若是StatefulSet的.spec.updateStrategy.type字段被设置为OnDelete,当修改.spce.template的内容时,StatefulSet Controller将不会自动更新Pod.必须得手动删除Pod,从新用修改的过得配置文件建立的时候,才会按照修改过得配置文件 建立Pod
Rolling Updates
.spec.updateStrategy字段的默认值是RollingUpdates,该策略为StatefulSet实现了Pod的自动滚动更新,在用户更新StatefulSet的.spec.template字段的时候,StatefulSet Controller将自动的删除并重建StatefulSet中的每一个Pod,处理顺序以下:
1)从序号最大的Pod开始,逐个删除和更新每个Pod,直到序号最小的Pod被更新
2)当正在更新的Pod达到了Running和Ready状态后,才继续更新其前序Pod
Partitions参数:
经过指定.spce.updateStrtegy.rollingUpdate.partition字段,能够分片(partitioned)执行rolling update更新策略;当更新StatefulSet的.spec.template时:
··序号大于或等于.spce.updateStrtegy.rollingUpdate.partition的Pod将被删除重建
··序号小于.spce.updateStrtegy.rollingUpdate.partition的Pod将不会更新,即便手工删除该Pod,kubernetes也会使用前一个版本的.spec.template重建该Pod
··若是.spce.updateStrtegy.rollingUpdate.partition大于.spec.replicas,更新.spec.template将不会影响任何Pod
大部分状况,都用不到.spce.updateStrtegy.rollingUpdate.partition参数,除非:执行预发布、执行金丝雀更新、执行按阶段更新
参考如下文档:https://kuboard.cn/learning/k8s-intermediate/workload/wl-statefulset/#statefulset-%E6%A6%82%E8%BF%B0