Ответ
StatefulSet использовал бы для stateful-приложений, где важны устойчивая идентификация подов, стабильное сетевое имя и привязка к постоянному хранилищу.
Конкретные примеры из практики:
- Кластерные базы данных: Например, развертывание отказоустойчивого кластера PostgreSQL с Patroni или Cassandra.
# Упрощенный пример для StatefulSet с PersistentVolume apiVersion: apps/v1 kind: StatefulSet metadata: name: cassandra spec: serviceName: cassandra replicas: 3 selector: { ... } template: { ... } volumeClaimTemplates: - metadata: name: data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 100Gi - Очереди сообщений: Например, Apache Kafka, где каждый брокер должен иметь свой уникальный ID и постоянный диск для логов партиций.
- Кластеры распределенных хранилищ/поиска: Elasticsearch, где нодам нужны стабильные имена для формирования кластера и свои тома для индексов.
Почему StatefulSet, а не Deployment? Он гарантирует:
- Упорядоченный и предсказуемый запуск/останов подов (pod-0, затем pod-1).
- Стабильные идентификаторы и DNS-имена:
pod-0.cassandra.default.svc.cluster.local. - Постоянство хранилища: Каждому поду при пересоздании назначается его уникальный PersistentVolumeClaim.