Ответ
StatefulSet сохраняет состояние пода за счет трех ключевых механизмов:
-
Устойчивые тома (Persistent Volumes): Каждому поду в StatefulSet стабильно привязывается один или несколько PersistentVolumeClaim (PVC). Эти PVC создаются на основе шаблона
volumeClaimTemplatesи следуют предсказуемому именованию (<volumeClaimTemplateName>-<podName>). Том "переживает" перезапуск пода и привязывается к новому поду с тем же порядковым номером. -
Стабильные сетевые идентификаторы: Каждый под получает предсказуемое имя вида
<statefulset-name>-<ordinal-index>(например,mysql-0,mysql-1) и стабильный DNS-запись:pod-name.service-name.namespace.svc.cluster.local- Это позволяет приложениям внутри кластера надежно находить друг друга даже после рестартов.
-
Упорядоченное и предсказуемое развертывание: Pod'ы создаются, обновляются и удаляются в строгом порядке (по возрастанию индексов), что критично для stateful-приложений, таких как базы данных с репликацией.
Пример манифеста для StatefulSet с PostgreSQL:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
spec:
serviceName: "postgresql"
replicas: 3
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgres
image: postgres:15
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
# Ключевой элемент для сохранения состояния
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd" # Используется предварительно настроенный StorageClass
resources:
requests:
storage: 10Gi
Таким образом, данные на привязанном томе, сетевая идентичность и порядок операций гарантируют, что stateful-приложение сохранит свое состояние.