在Kubernetes实战中,StatefulSet控制器用于部署和管理有状态应用,这些应用需要稳定的持久化存储、有序的部署和扩展、以及唯一的网络标识。以下是一些StatefulSet控制器的实战要点:
创建StatefulSet
创建StatefulSet通常需要一个YAML文件,其中包含了StatefulSet的定义,包括:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-statefulset
spec:
serviceName: my-statefulset-service # 关联的服务名称,用于Headless Service
replicas: 3 # 希望运行的副本数量
selector:
matchLabels:
app: my-stateful-app # 用于选择匹配Pod的标签选择器
template:
metadata:
labels:
app: my-stateful-app
spec:
terminationGracePeriodSeconds: 180 # 可选,优雅关闭Pod的超时时间
containers:
- name: my-container
image: my-image:v1
ports:
- containerPort: 80
volumeMounts:
- name: data-volume
mountPath: /data # 将存储卷挂载到容器内
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: my-pvc # 使用已存在的PersistentVolumeClaim(PVC)
volumeClaimTemplates: # 可选,动态创建PVC
- metadata:
name: data-volume
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
storageClassName: standard # 指定存储类
特点与实战操作
-
有序创建和删除:StatefulSet中的Pod按照序号(
0
、1
、2
等)依次创建和删除,保证了Pod间的依赖关系得到妥善处理。 -
稳定的网络标识:每个Pod有一个唯一的hostname格式为
<statefulset-name>-<ordinal>
,并可以创建Headless Service,使Pod拥有稳定的DNS记录。 -
持久化存储:StatefulSet要求每个Pod都挂载持久化存储卷,以确保数据在Pod重建时得以保留。
-
滚动更新:StatefulSet支持滚动更新,可以有序地逐个更新Pod,以减少对有状态应用的影响。
-
扩容与缩容:在扩缩容时,新的Pod也会按照顺序创建或删除,并且每个Pod都有自己独立的数据存储。
实战操作示例
- 创建StatefulSet:
kubectl apply -f statefulset.yaml
- 查看StatefulSet和关联的Pod:
kubectl get statefulsets
和kubectl get pods
- 扩容StatefulSet:编辑StatefulSet的
.spec.replicas
字段,然后执行kubectl apply -f statefulset.yaml
- 更新应用版本:更改StatefulSet中容器的镜像版本,然后执行更新操作,StatefulSet会执行有序的滚动更新
注意事项
- 删除StatefulSet并不会自动删除其关联的PersistentVolumeClaims(PVCs)和PersistentVolumes(PVs),因此在删除StatefulSet前,需要明确是否也需要删除这些存储资源。
- 对于有状态应用,应在删除StatefulSet前确保应用数据已经妥善备份,或者在应用自身具备迁移数据的能力之后再进行删除操作。如果需要删除与StatefulSet关联的存储资源,需要单独删除对应的PVC。