Развертывание Кубернеса против StatefulSets

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

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

Ответ 1

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

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

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

Более подробную информацию о запуске приложения с отслеживанием состояния можно найти в записи блога 2016 kubernetes о приложениях с отслеживанием состояния.

Ответ 2

  • Развертывание - вы указываете PersistentVolumeClaim, который является общим для всех реплик модуля. Другими словами, общий объем.

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

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

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

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

Ответ 3

Используйте 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/

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

Ответ 4

TL; DR

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

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

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

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

Ответ 5

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

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