3.4 StatefulSet(状态集)
statefulset是用于管理有状态应用程序的WorkloadAPI对象,管理Deployment和一组Pod,保证有序和Pod唯一性的。和Deployment类似,状态集StatefulSet基于一个相同的容器规格spec管理Pod,不同的是,状态集Statefuli为他们每个Pod保持一个粘性身份,Pod从同样的规范创建,但不可交换,每个都有一个持久标识符(在任何调度中都会保持标识)。状态集与任何其他控制器在相同的模式下运行,StatefulSet Controller将会做一些必要的更新使其更新到期望的状态。
【StatefulSet的使用场景】
状态集StatefulSet对如下的应用具备价值:需要稳定、唯一网络标识的,需要稳定、持久存储的,需要有序、优雅的Deployment和扩展的,需要有序、自动滚动升级的,其中稳定是跨POD调度的持久性的同义词。如果应用不需要任何稳定标识或有序Deployment、删除、扩展,那就不需要通过创建stateful对象来创建的,可能像Deployment、ReplicaSet控制器可能更符合此时的需求。
【局限】
为Pod提供的存储要么使由PersistentVolume Provisioner基于请求的storage class
提供、要么由admin提供提供;删除或扩展状态集Stateful将不会删除相关联的volumes;当前状态集Stateful需要一个Headless Service负责网络Pod的标识;当StatefulSet删除时不提供任何终止Pod的保证,所以必须手动先缩减状态集为0,然后再删除;
【组成】
下面是一个示例:
# Headless Service,这里是Nginx
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
# 状态集
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
# 使用 PersistentVolumes 提供的存储
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
【升级策略】
.spec.updateStrategy
字段可以配置容器、标签、资源等的自动滚动更新策略,当.spec.updateStrategy.type
设置为OnDelete
,状态集Stateful控制器将不会自动更新状态集中的Pod,用户必须手动删除Pod以便控制器可以在修改.spec.template
后创建新的Pod;如果.spec.updateStrategy.type
设置为RollingUpdate
,状态集控制器将会删除并重新创建状态中的每个Pod。