Развертывание Кубернеса против 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. Используется для хранения данных о состоянии модуля, а также в сочетании с безголовыми службами, объявленными как принадлежащие этому безголовому сервису;