Kubernetes Deployments vs StatefulSets


110

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

Будь-який досвід, яким люди можуть поділитися, був би приголомшливим !!

Відповіді:


113

Розгортання та реплікація контролерів призначені для використання без громадянства і досить легкі. StatefulSets використовуються тоді, коли стан потрібно зберігати. Тому останні використовують volumeClaimTemplates/ претендують на постійні томи, щоб гарантувати, що вони можуть підтримувати стан через перезавантаження компонентів.

Тож якщо у вашій програмі є репутація, або якщо ви хочете розгорнути пам’яті, що зберігаються на вершині Kubernetes, використовуйте StatefulSet.

Якщо ваша програма не має статусу, або якщо стан можна створити з бекенд-систем під час запуску, тоді використовуйте Deployments.

Більш детальну інформацію про запуск додаткової програми можна знайти у публікації в блозі kubernetes про важливі додатки 2016 року


16
Я також можу з'єднати стручки розгортання з постійними заявками на обсяг і бути в безпеці.
Торстен Бронгер

9
@TorstenBronger Я згоден - в який момент ми повертаємося до початкового питання про те, що є точкою StatefulSets?
HDave

6
@HDave За допомогою динамічних стійких томів та швидко розвиваються постачальників пам’яті (наприклад, Portworx, OpenEBS) проблему з збереженням даних можна вирішити, але порядок іменування та запуску / оновлення все ще відрізняється від StatefulSets, завдяки чому програми, які потребують налаштування master / slave або іншої установки правильно сформувати кластер. Хоча я згоден, що, можливо, все це можна скласти в єдиний deploymentконфігурацію за допомогою простої специфікації, щоб встановити 1-за-вузол (демон-набір), репліки або впорядкований стан.
Мані Гандхем

4
Важливо усвідомити, що "порядок запуску / оновлення" стосується реплік Pod (тобто 1, 2, 3 ...) - не різних стручків (тобто веб, srv, db тощо). По-іншому, це не є заміною залежностей від докер-композиту.
HDave

72
  • Розгортання - Ви визначаєте PersistentVolumeClaim, яким поділяються всі репліки pod. Іншими словами, спільний обсяг.

    У резервному сховищі, очевидно, повинен бути ReadWriteMany або ReadOnlyMany accessMode, якщо у вас є більше однієї копії.

  • StatefulSet - Ви визначаєте volumeClaimTemplates так, щоб кожен струк репліки отримував унікальний PersistentVolumeClaim, пов'язаний з ним. Іншими словами, немає спільного обсягу.

    Тут резервне сховище може мати ReadWriteOnce accessMode.

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


23

TL; DR

Розгортання - це ресурс для розгортання програми без стану, якщо використовується ПВХ, всі репліки будуть використовувати той самий том і жодна з них не матиме свого стану.

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

DaemonSet - це контролер, який гарантує, що стручок працює на всіх вузлах кластера. Якщо вузол додано / видалено з кластеру, DaemonSet автоматично додає / видаляє поділ.

Я писав про детальні відмінності між Deployments, StatefulSets & Daemonsets та про те, як розгорнути зразок програми за допомогою цих ресурсів K8s: Deployments vs StatefulSets vs DaemonSets .


4
Щоб продовжити ваш коментар, мені здається, що різниця між двома полягає в тому, що один має можливість вказати специфічний сховище для сховища (і, таким чином, зберегти специфічний стан для стручка), тоді як інший не (і таким чином може зберігати лише службу загальнодержавна). У цьому сенсі на рівні сервісу обидва можуть розглядатися як державні. Але на рівні стручка є релевантними лише набори Stateful.
парша

14

StatefulSet

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

Існує два види державних розподілених додатків: Master-Master і Master-Slave. Усі вузли в конфігурації Master-Master та Slave-вузли в конфігурації Master-Slave можуть використовувати StatefulSet.
Приклади:
Master-Slave -> Датаноди (раби) в кластері Hadoop
Master-Master -> Вузли бази даних (master-master) в кластері Cassandra

Кожен Pod (репліка / вузол) у 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 - Кафка, то перший струк називається Кафка-0, другий Кафка-1 тощо; керується послідовністю початку та зупинки копії стручка, що контролюється StatefulSet. Коли експлуатується n-й струмок, перші N-1 стручки вже запущені і готові Хороший стан; стручок у StatefulSet використовує стабільний стійкий об'єм зберігання, реалізований ПВ або ПВХ. При видаленні стручка об'єм пам’яті, пов’язаний із StatefulSet, за замовчуванням не видаляється (для безпеки даних); StatefulSet повинен бути прив’язаний до об'єму PV. Використовується для зберігання даних про стан об'яв, а також використовується разом із послугами без голови, оголошених, що належать до цієї послуги без головної;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.