Назад к вопросам
Middle
67
questionbank
Для какого приложения стоит использовать StatefulSet вместо Deployment и почему?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
StatefulSet стоит использовать для приложений, которым необходимы:
- Стабильная сетевая идентификация. Pod'ы получают уникальное, постоянное hostname в формате
<statefulset-name>-<pod-index>. - Стабильное, постоянное хранилище. Каждой реплике Pod'а назначается свой PersistentVolume. Даже при перезапуске Pod'а его данные остаются привязанными к нему.
- Упорядоченное развертывание и масштабирование. Pod'ы создаются и удаляются в строго определенном порядке (по возрастанию индекса для создания, по убыванию для удаления).
- Упорядоченное или параллельное обновление. Поддерживается как постепенное (rolling update), так и параллельное (in-place or parallel) обновление, но с возможностью контроля порядка.
Примеры таких приложений:
- Базы данных (MySQL, PostgreSQL, MongoDB)
- Брокеры сообщений (Kafka, RabbitMQMQ)
- Cache-системы (Redis, Memcached)
- Распределенные файловые системы (например, Ceph, если запускается в Kubernetes)
- Любое приложение, которому требуется сохранять состояние между перезапусками и иметь постоянную идентификацию.
В отличие от Deployment, где Pod'ы являются взаимозаменяемыми и stateless, StatefulSet гарантирует уникальность и сохранение состояния для каждой реплики, что критично для приложений, зависящих от постоянного хранения данных и стабильной сетевой идентификации.
Пример простейшего StatefulSet для базы данных:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: "mysql" # Необходимо для стабильной сетевой идентификации Pod-ов
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "password" # В продакшене использовать Secrets
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql # Путь, куда монтируется постоянное хранилище
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage # Имя шаблона PVC
spec:
accessModes: [ "ReadWriteOnce" ] # Режим доступа
resources:
requests:
storage: 10Gi # Запрашиваемый объем хранения