Развертывания Kubernetes против StatefulSets
Я много копаю в Кубернетесе, и мне нравится то, что я вижу много! Одна вещь, о которой я не смог получить четкое представление о том, каковы точные различия между ресурсами Deployment и StatefulSet и в каких сценариях вы будете использовать каждый (или один из них обычно предпочтительнее другого).
Любой опыт, которым люди могут поделиться, был бы потрясающим!!
7 ответов
Развертывания и ReplicationControllers предназначены для использования без сохранения состояния и довольно легки. StatefulSets используются, когда необходимо сохранить состояние. Поэтому последнее использование volumeClaimTemplates
/ утверждает постоянные тома, чтобы гарантировать возможность сохранения состояния при перезапуске компонента.
Так что, если ваше приложение с сохранением состояния или если вы хотите развернуть хранилище с сохранением состояния поверх Kubernetes, используйте StatefulSet.
Если ваше приложение не имеет состояния или если состояние может быть создано из backend-систем во время запуска, используйте Deployments.
Развертывание - вы указываете PersistentVolumeClaim, который является общим для всех реплик модуля. Другими словами, общий объем.
Резервное хранилище, очевидно, должно иметь ReadWriteMany или ReadOnlyMany accessMode, если у вас более одного модуля реплики.
StatefulSet - вы указываете volumeClaimTemplates, чтобы каждый модуль реплики получал уникальный PersistentVolumeClaim, связанный с ним. Другими словами, нет общего объема.
Здесь резервное хранилище может иметь ReadWriteOnce accessMode.
StatefulSet полезен для запуска вещей в кластере, например кластере Hadoop, кластере MySQL, где каждый узел имеет свое собственное хранилище.
TL;DR
Развертывание - это ресурс для развертывания приложения без сохранения состояния, при использовании PVC все реплики будут использовать один и тот же том, и ни один из них не будет иметь собственного состояния.
Наборы состояний используются для приложений с отслеживанием состояния, каждая реплика модуля будет иметь собственное состояние и будет использовать свой собственный том.
DaemonSet - это контроллер, который обеспечивает работу модуля на всех узлах кластера. Если узел добавляется / удаляется из кластера, DaemonSet автоматически добавляет / удаляет модуль.
Я подробно писал о различиях между развертываниями, StatefulSets и Daemonset, а также о том, как развернуть образец приложения с помощью этих ресурсов K8s: Deployments vs StatefulSets vs DaemonSets.
Используйте StatefulSet с распределенным приложением, для которого требуется, чтобы каждый узел имел постоянное состояние и возможность конфигурировать произвольное количество узлов через конфигурацию (replicas = 'X').
Все узлы в конфигурации master-master и подчиненные узлы в конфигурации master-slave могут использовать StatefulSet вместе со службой. Главные узлы (такие как master, master-Secondary) могут каждый быть Pod с некоторым постоянным объемом вместе со службой, поскольку эти узлы не нуждаются в увеличении или уменьшении. Они также могут быть StatefulSet с репликами = 1.
Примеры StatefulSet:
- Датододы (рабы) в кластере Hadoop (ведущий-ведомый)
- Узлы базы данных (мастер-мастер) в кластере Кассандра
Каждый Pod (реплика) в StatefulSet имеет
- Уникальная и стабильная сетевая идентификация
- Kubernetes создает один PersistentVolume для каждого VolumeClaimTemplate
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
"Развертывание", с другой стороны, подходит для приложений / служб без сохранения состояния, когда узлам не требуется какой-либо особый идентификатор (балансировщик нагрузки может достигать любого узла, который он выбирает), а число узлов может быть произвольным числом.
Разница между StatefulSet и развертыванием
StatefulSet эквивалентен специальному развертыванию. Каждый модуль в StatefulSet имеет стабильный уникальный сетевой идентификатор, который можно использовать для обнаружения других участников кластера. Если имя StatefulSet - Kafka, то первый модуль называется Kafka-0, второй - Kafka-1 и так далее; контролируется последовательность запуска и остановки копии модуля, контролируемая StatefulSet. Когда n-й модуль работает, первые модули N-1 уже работают и готовы к работе. Хорошее состояние; модуль в StatefulSet использует стабильный постоянный объем хранения, реализованный с помощью PV или PVC. При удалении модуля объем хранилища, связанный с StatefulSet, по умолчанию не удаляется (для безопасности данных); StatefulSet должен быть привязан к объему PV. Используется для хранения данных о состоянии модуля, а также используется вместе с автономными службами, объявленными принадлежащими этой автономной службе;
Что такое StatefulSet?
Это компонент Kubernetes, который используется специально для приложений с отслеживанием состояния.
Что такое приложение с отслеживанием состояния?
Любое приложение, которое хранит данные для отслеживания своего состояния. Или можно сказать, что приложения отслеживают состояние, сохраняя информацию в каком-то хранилище.
Примерами приложений с отслеживанием состояния являются все виды баз данных.
- MongoDB
- MySQL
- Эластичный поиск
Развертывание == без гражданства
Что такое приложение без гражданства?
Те приложения, которым не нужно вести учет предыдущих запросов и взаимодействий, обрабатываются как совершенно новые и изолированные на основе поступающей с ними информации.
Развертывание приложения с отслеживанием состояния и без сохранения состояния Приложение с отслеживанием состояния используется для развертывания с использованием компонента Statefulset в Kubernetes.
Приложение без сохранения состояния используется для развертывания с помощью компонента развертывания Kubernetes.
Точно так же, как развертывание statefulset позволяет реплицировать модули приложений или запускать несколько их реплик.
Вы также можете настроить хранилище с ними обоими одинаковым образом.
Так в чем разница между Statefulset и Deployment или почему мы должны использовать разные для каждого типа приложений?
StatefulSet против развертывания
- Репликация приложений с отслеживанием состояния более сложна и имеет несколько требований, которых нет у приложений без сохранения состояния.
Давайте обсудим пример
Допустим, у нас есть один модуль MongoDB, который обрабатывает запросы от модуля приложения NodeJs, развернутого с помощью развертывания. Допустим, мы увеличили количество модулей приложений NodeJ с 1 до 3, чтобы они могли обрабатывать больше клиентских запросов, и параллельно вы масштабируете модули MongoDB, чтобы они могли обрабатывать больше запросов NodeJ.
Масштабирование вашего приложения NodeJs довольно простое, модули будут идентичными и взаимозаменяемыми, поэтому масштабировать развертывание довольно просто. Развертывание создаст модули в произвольном порядке, и они получат случайные хэши в конце имени модуля.NodeApp-f5cdee
,NodeApp-fasx34
,NodeApp-ax7jds
.
Развертывание получит одинsvc
что помогает сбалансировать нагрузку на любой модуль любого запроса.
Когда вы удаляете или уменьшаете развертывание, они одновременно удаляются в произвольном порядке.
Если говорить о MongoDB, реплики пода, которые были развернуты с использованием statefulset, не могут быть созданы и удалены одновременно в любом порядке, и к ним нельзя обращаться случайным образом. Причина этого в том, что блоки-реплики statefulset не идентичны, поскольку каждый из них имеет свою собственную дополнительную идентичность блоков.
Примечание. Предоставление каждому модулю собственной обязательной идентичности делает разницу между сохранением состояния и развертыванием.
Statefulset поддерживает фиксированную идентичность для каждого модуля, поэтому они создаются на основе одной и той же спецификации, но не являются взаимозаменяемыми!
Он имеет постоянный идентификатор при любом изменении расписания, что означает, что когда модуль умирает, он заменяется новым модулем и сохраняет ту же идентичность.
Но зачем нужно это тождество?
Если мы говорим об одном модуле MongoDB, который раньше читал и писал данные, но если вы добавите второй модуль MongoDB, это не может действовать таким же образом, потому что если мы позволим экземплярам MongoDB изменять данные, которые в конечном итоге с несоответствием данных.
Вместо этого существует механизм, который решает, что только модуль может записывать или изменять данные, которые совместно используются для чтения несколькими экземплярами MongoDB, поэтому модуль, который позволяет изменять данные, называется ведущим, а другие называются подчиненными .
Примечание. Ведущее и подчиненное устройства не используют одно и то же физическое хранилище, даже если они используют одни и те же данные.
Идентификация модуля
В stateful каждый модуль имеет свой собственный идентификатор и получает фиксированное имя порядка, но не то же самое в случае развертывания.
Если мы создадим 3 реплики satefulset, то это создаст как
MongoDB-0
,MongoDB-1
,MongoDB-2
здесь первый хозяин, следующие рабы.
Примечание. Statefulset не будет создавать следующий модуль в реплике предыдущего модуля, который еще не запущен и не запущен, и тот же порядок для удаления, но в обратном порядке.
Конечные точки модуля
- Каждый модуль в statefulset получает от службы собственную конечную точку DNS.
Итак, наконец, мы можем сказать, что приложение Statefulset имеет 2 символа.
- Предсказуемое имя модуля
- Фиксированное индивидуальное DNS-имя
При перезапуске модулей IP-адрес изменится, но имя и конечные точки останутся прежними.