statefulset概述
- StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载 API 对象,它为 Pod 提供持久化标识和有序部署、扩展、删除等特性
StatefulSet特性
- 为pod提供唯一标识,保障部署和扩容缩容的顺序
- 为了解决有状态服务的问题(对应deployments和replicaSets是为无状态服务而设计),其应用场景包括
- 稳定的持久化存储,即pod死亡后重新调度一个新的pod,还是能访问到之前pod的持久化数据,基于PVC实现
- 稳定的网络标志,即pod重新调度后,其PodName和主机名不变,基于Headless Service(即没有Cluster IP 的service)来实现
- 有序部署,有序扩展,即Pod的启动是有顺序,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到n-1,在下一个pod运行之前所有之前的pod必须都是running和ready状态),基于init containers来实现
- 有序收缩,有序删除(即从n-1到0)。缩容时从索引号最大的Pod开始删除,而且一次只能删除一个,因此缩容速度不会太快。有实例不健康时,不允许缩容
什么是无状态服务
- 没有对应的存储需要时时保留,多实例对同一个请求的访问一致
- 多个实例可以共享相同的持久化数据
statefulset更新策略
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 1 # 只有序号 >= partition 的 Pod 会被更新
spec:
updateStrategy:
type: OnDelete # 需要手动删除 Pod 才会更新
statefulset 对pod的管理策略
spec:
podManagementPolicy: OrderedReady
spec:
podManagementPolicy: Parallel # 同时创建/删除所有 Pod
statefulset命名机制概述
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None # Headless 模式
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql" # 必须匹配 Headless Service 名称
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates: # 自动为每个 Pod 创建 PVC
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "ssd"
resources:
requests:
storage: 10Gi
- statefulset会创建有序pod,命名规则为(statefulset-name)-(ordinal-index)。上面这段statefulset会创建三个pod,名称分别是 mysql-0、mysql-1、mysql-2
- StarefulSet通过Headless service提供稳定的Pod域名,域名格式为:\((pod name).\)(headless service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群的域名
- stateful通过volumeClaimTemplates的配置,为每个Pod创建一个pvc,pcv的命名规则为\((volumeClaimTempaltes.name)-\)(pod_name)