StatefulSets для приложений с состоянием
Развёртывайте и управляйте приложениями с состоянием, например базами данных, с помощью StatefulSets, обеспечивая стабильные сетевые идентификаторы и постоянное хранилище.
«StatefulSets для приложений с состоянием» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
StatefulSets для приложений с состоянием
Добро пожаловать! На этом уроке Вы подробно изучите StatefulSets — объект Kubernetes, предназначенный для управления приложениями с состоянием.
В отличие от приложений без состояния, которые легко масштабировать и заменять, приложениям с состоянием нужны уникальные идентификаторы и постоянное хранилище для каждого экземпляра. К таким приложениям относятся базы данных, очереди сообщений и пользовательские приложения, локально хранящие данные.
Зачем нужны StatefulSets: проблема
Обычные развертывания отлично подходят для приложений без состояния. Если под выходит из строя, его заменяет новый, и не имеет значения, какой именно под обрабатывает запрос.
Однако для приложений с состоянием каждой реплике часто нужны стабильный уникальный идентификатор и собственное выделенное хранилище. Если под базы данных перезапускается, ему необходимо повторно подключиться к своему тому данных.
Стабильная сеть и идентификатор пода
Важная особенность StatefulSets — предоставление стабильных уникальных сетевых идентификаторов каждому поду.
- Подам присваиваются предсказуемые имена в определенном порядке, например
web-0иweb-1. - После перезапусков они сохраняют свои имена узлов.
- Благодаря этому другие службы могут надежно подключаться к определенной реплике.
Стабильное постоянное хранилище
StatefulSets гарантируют, что каждый под получит собственное стабильное постоянное хранилище. Для этого используются утверждения постоянного тома (PVC).
При создании пода StatefulSet автоматически создает PVC на основе определения volumeClaimTemplates. Если под выйдет из строя и будет создан заново, он повторно подключится к тому же PVC и, следовательно, к исходным данным.
Структура YAML StatefulSet
Определение StatefulSet в YAML похоже на Deployment, но содержит несколько важных дополнений. Оно включает:
apiVersion,kind,metadataspec.replicas,spec.selector,spec.template(как у развертываний)spec.serviceName: связывает объект с автономной службой.spec.volumeClaimTemplates: определяет способ создания PVC для каждого пода.
Автономная служба для стабильных идентификаторов
Чтобы StatefulSets могли предоставлять стабильные сетевые идентификаторы, им нужна автономная служба. У автономной службы нет IP кластера. Вместо этого она напрямую возвращает IP-адреса выбранных ею подов.
StatefulSet использует эту службу для регистрации DNS-записей каждого своего пода, например pod-0.my-service.my-namespace.svc.cluster.local.
apiVersion: v1
kind: Service
metadata:
name: my-app-headless
spec:
ports:
- port: 80
name: web
clusterIP: None # This makes it a headless service
selector:
app: my-appVolumeClaimTemplates
Раздел volumeClaimTemplates уникален для StatefulSets. Это шаблон для утверждений постоянного тома (PVC), которые будут созданы для каждой реплики.
Каждый под в StatefulSet, например my-app-0 и my-app-1, получит собственный PVC, например data-my-app-0 и data-my-app-1, на основе этого шаблона, что обеспечит выделенное хранилище.
volumeClaimTemplates:
- metadata:
name: data # This name is used in Pod's volumeMounts
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 1GiПолный пример StatefulSet
Ниже приведен полный пример простого StatefulSet для Nginx. Обратите внимание на serviceName, связывающий объект с автономной службой, и на volumeClaimTemplates.
Чтобы развернуть этот объект, сохраните его в файле nginx-statefulset.yaml и выполните команду kubectl apply -f nginx-statefulset.yaml.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx-headless" # Must match headless service name
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www # Mounts the volume from the PVC
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www # This name links to volumeMounts.name
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginxИмена и порядок подов
После развертывания Вы увидите поды с именами вроде web-0 и web-1. Эти индексы стабильны и уникальны.
StatefulSets обеспечивают строгий порядок операций масштабирования. Под создаются по порядку (0, 1, 2...), а завершаются в обратном порядке (..., 2, 1, 0).
Такой порядок крайне важен для многих распределенных систем с состоянием, поскольку помогает сохранять согласованность.
Масштабирование и поэтапные обновления
StatefulSet можно масштабировать так же, как Deployment, с помощью команды kubectl scale statefulset web --replicas=3.
Поэтапные обновления также поддерживаются, сохраняя тот же порядок: поды обновляются по одному в обратном порядке номеров, причем следующий под не обновляется, пока предыдущий не будет готов.
Такая тщательная координация сводит к минимуму перебои в работе приложений с состоянием.
Проверьте свои знания
Какие из следующих характеристик или требований являются ключевыми для StatefulSets в Kubernetes?
Повторение: StatefulSets в действии
Отличная работа! На этом уроке Вы изучили StatefulSets — мощный объект Kubernetes для управления приложениями с состоянием.
- Они предоставляют стабильные сетевые идентификаторы и обеспечивают выполнение операций в определенном порядке.
- Они используют
volumeClaimTemplatesдля выделенного постоянного хранилища каждой реплики. - Автономная служба необходима для стабильных сетевых идентификаторов.
StatefulSets играют фундаментальную роль в надежном запуске баз данных и других критически важных рабочих нагрузок с состоянием в Kubernetes.
Часто задаваемые вопросы
Урок «StatefulSets для приложений с состоянием» бесплатный?
Да — полный текст урока «StatefulSets для приложений с состоянием» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «StatefulSets для приложений с состоянием»?
Развёртывайте и управляйте приложениями с состоянием, например базами данных, с помощью StatefulSets, обеспечивая стабильные сетевые идентификаторы и постоянное хранилище. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «StatefulSets для приложений с состоянием»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- StatefulSets для приложений с состоянием
- DaemonSets для задач на узлах
- Разбор операторов Kubernetes
- Определения пользовательских ресурсов (CRD)