Middle
За коя апликация трябва да се използва StatefulSet вместо Deployment и защо?
sobes.tech AI
Отговор от AI
StatefulSet трябва да се използва за приложения, които изискват:
- Стабилна мрежова идентификация. Pod-овете получават уникално, постоянно hostname във формат
<име-на-statefulset>-<индекс-на-pod>. - Стабилно, постоянно хранилище. На всяка реплика на Pod се назначава собствен PersistentVolume. Дори при рестартиране на Pod, данните остават свързани с него.
- Подредено внедряване и мащабиране. Pod-овете се създават и изтриват в строго определен ред (по възходящ ред за създаване, по низходящ за изтриване).
- Подредено или паралелно обновяване. Поддържа както постепенни (rolling update), така и паралелни (in-place или parallel) обновявания, с контрол върху реда.
Примери за такива приложения:
- Бази данни (MySQL, PostgreSQL, MongoDB)
- Посредници на съобщения (Kafka, RabbitMQ)
- Кеш системи (Redis, Memcached)
- Разпределени файлови системи (например Ceph, ако се изпълнява в Kubernetes)
- Всяко приложение, което трябва да запазва състояние между рестарти и да има постоянна идентификация.
За разлика от Deployment, където Pod-овете са взаимозаменяеми и без състояние, 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 # Изискван обем за съхранение