Развертывания Kubernetes против StatefulSets

112

Я много копался в Kubernetes, и мне очень нравится то, что я вижу! Одна вещь, о которой мне не удалось получить четкого представления, - это точные различия между ресурсами Deployment и StatefulSet и в каких сценариях вы бы использовали каждый из них (или один из них обычно предпочтительнее другого).

Любой опыт, которым люди могут поделиться, будет потрясающим!

SS781
источник

Ответы:

116

Развертывания и ReplicationControllers предназначены для использования без сохранения состояния и довольно легкие. StatefulSets используются, когда необходимо сохранить состояние. Поэтому последние используют volumeClaimTemplates/ заявляют о постоянных томах, чтобы гарантировать, что они могут сохранять состояние при перезапусках компонентов.

Поэтому, если ваше приложение сохраняет состояние или вы хотите развернуть хранилище с отслеживанием состояния поверх Kubernetes, используйте StatefulSet.

Если ваше приложение не имеет состояния или если состояние может быть создано из серверных систем во время запуска, используйте Deployments.

Дополнительные сведения о работе с учетом состояния приложения можно найти в блоге 2016 года kubernetes' о сохраняющем состоянии приложений

pagid
источник
16
Я также могу связать модули развертывания с постоянными заявками на объем и быть в безопасности.
Torsten Bronger
9
@TorstenBronger Я согласен - в этот момент мы возвращаемся к исходному вопросу о том, в чем смысл StatefulSets?
HDave
6
@HDave С динамическими постоянными томами и быстро развивающимися поставщиками хранилищ (такими как Portworx, OpenEBS) проблема с сохранением данных может быть решена, но порядок именования и запуска / обновления по-прежнему отличается от StatefulSets, что позволяет приложениям, которым требуется главный / подчиненный или другие настройки для правильно сформировать кластер. Хотя я согласен с тем, что, возможно, все это можно свести в единую deploymentконфигурацию с простой спецификацией для установки 1 на узел (демонсет), реплик или упорядочивания с отслеживанием состояния.
Mani Gandham 02
4
Важно понимать, что «порядок запуска / обновления» касается реплик модулей (например, 1, 2, 3 ...), а не разных модулей (например, web, srv, db и т. Д.). Другими словами, это не замена зависимостей docker-compose.
HDave
73
  • Развертывание - вы указываете PersistentVolumeClaim который является общим для всех реплик модуля. Другими словами, общий объем.

    Резервное хранилище, очевидно, должно иметь режим доступа ReadWriteMany или ReadOnlyMany, если у вас более одного модуля реплик.

  • StatefulSet - вы указываете volumeClaimTemplates, чтобы каждый модуль реплики получил уникальный PersistentVolumeClaim. связанный с ним. Другими словами, нет общего тома.

    Здесь резервное хранилище может иметь режим доступа ReadWriteOnce .

    StatefulSet полезен для работы в кластере, например, кластер Hadoop, кластер MySQL, где каждый узел имеет собственное хранилище.

Эммануэль Осимосу
источник
23

TL; DR

Развертывание - это ресурс для развертывания приложения без сохранения состояния, при использовании PVC все реплики будут использовать один и тот же том, и ни одна из них не будет иметь собственного состояния.

Наборы состояний используются для приложений с отслеживанием состояния, каждая реплика модуля будет иметь собственное состояние и будет использовать свой собственный том.

DaemonSet - это контроллер, который обеспечивает работу модуля на всех узлах кластера. Если узел добавляется / удаляется из кластера, DaemonSet автоматически добавляет / удаляет модуль.

Я написал о подробных различиях между развертываниями, StatefulSets и Daemonset, а также о том, как развернуть образец приложения с использованием этих ресурсов K8s: Deployments vs StatefulSets vs DaemonSets .

Али Кахут
источник
5
Чтобы продолжить ваш комментарий, мне кажется, что разница между ними заключается в том, что у одного есть возможность указывать хранилище для конкретного модуля (и, таким образом, сохранять конкретное состояние для модуля), тогда как у другого нет (и, таким образом, он может только сохранять службу по всему штату). В этом смысле на уровне обслуживания оба могут рассматриваться как с отслеживанием состояния. Но на уровне пода только Statefulsets сохраняет состояние.
scabbage
14

StatefulSet

Используйте StatefulSet с распределенными приложениями с отслеживанием состояния, которые требуют, чтобы каждый узел имел постоянное состояние . StatefulSet предоставляет возможность настроить произвольное количество узлов для приложения / компонента с отслеживанием состояния с помощью конфигурации (реплик = N).

Существует два типа распределенных приложений с отслеживанием состояния: Master-Master и Master-Slave. Все узлы в конфигурации Master-Master и узлы Slave в конфигурации Master-Slave могут использовать StatefulSet.
Примеры:
Master-Slave -> Datanodes (slave) в кластере Hadoop
Master-Master -> Узлы базы данных (master-master) в кластере Cassandra

Каждый модуль (реплика / узел) в StatefulSet имеет уникальный и стабильный сетевой идентификатор. Например, в Cassandra StatefulSet с именем 'cassandra' и количеством узлов реплик как N каждый модуль (узел) Cassandra имеет:

  • Порядковый индекс для каждого пакета: 0,1, .., N-1
  • Стабильный сетевой идентификатор: cassandra-0, cassandra-1, .., cassandra-N-1
  • Отдельный постоянный том для каждого модуля в соответствии с шаблоном требования тома, т.е. отдельное хранилище для каждого модуля (узла)
  • Поды создаются в порядке от 0 до N-1 и завершаются в обратном порядке от N-1 до 0.

Обратитесь: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Развертывание

«Развертывание», с другой стороны, подходит для приложений / служб без сохранения состояния, когда узлы не требуют какой-либо специальной идентификации. Балансировщик нагрузки может подключиться к любому узлу по своему выбору. Все узлы равны. Развертывание полезно для создания любого количества произвольных узлов с помощью конфигурации (реплик = N).

Анураг
источник
7

Разница между StatefulSet и развертыванием

StatefulSet эквивалентен специальному развертыванию. Каждый модуль в StatefulSet имеет стабильный уникальный сетевой идентификатор, который можно использовать для обнаружения других участников кластера. Если имя StatefulSet - Kafka, то первый модуль называется Kafka-0, второй - Kafka-1 и так далее; контролируется последовательность запуска и остановки копии модуля, контролируемая StatefulSet. Когда n-й модуль работает, первые модули N-1 уже работают и готовы к работе. Хорошее состояние; модуль в StatefulSet использует стабильный постоянный объем хранения, реализованный с помощью PV или PVC. При удалении модуля объем хранилища, связанный с StatefulSet, по умолчанию не удаляется (для безопасности данных); StatefulSet должен быть привязан к объему PV. Используется для хранения данных о состоянии модуля, а также используется вместе с автономными службами, объявленными принадлежащими этой автономной службе;

Adler.Liu
источник