Тома Kubernetes: когда нужен Statefulset?

Я подхожу к объемам и передовым методам k8s и заметил, что при чтении документации кажется, что вам всегда нужно использовать ресурс StatefulSet, если вы хотите реализовать постоянство в своем кластере:

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

Я реализовал несколько руководств, в некоторых из них используется StatefulSet, в других - нет.

Фактически, скажем, я хочу сохранить некоторые данные, у меня могут быть свои модули без сохранения состояния (даже серверные модули MySql!), В которых я использую PersistentVolumeClaim, который сохраняет состояние. Если я остановлюсь и перезапущу кластер, я могу вернуться в состояние из тома без необходимости в StatefulSet.

Я прилагаю здесь пример репозитория Github, в котором есть приложение с отслеживанием состояния с MySql и вообще без StatefulSet: https://github.com/shri-kanth/kuberenetes-demo-manifests

Итак, мне действительно нужно использовать ресурс StatefulSet для баз данных в k8s? Или есть какие-то конкретные случаи, когда это может быть необходимая практика?




Ответы (2)


PVC - не единственная причина использовать Statefulset вместо Deployments. Как указано в руководстве Kubernetes:

StatefulSets полезны для приложений, которым требуется одно или несколько из следующего:

  • Стабильные уникальные идентификаторы сети.
  • Стабильное постоянное хранилище.
  • Упорядоченное плавное развертывание и масштабирование.
  • Упорядоченные автоматические скользящие обновления.

Вы можете узнать больше о требованиях к базе данных при развертывании в Kubernetes здесь Запускать или не запускать базу данных в Kubernetes

person Dragan Bocevski    schedule 13.07.2020

StatefulSet - это не то же самое, что PV + PVC.

StatefulSet управляет модулями, основанными на идентичной спецификации контейнера. В отличие от развертывания, StatefulSet поддерживает постоянную идентификацию для каждого из своих модулей. Эти модули созданы на основе одной и той же спецификации, но не являются взаимозаменяемыми: у каждого есть постоянный идентификатор, который он поддерживает при любом изменении расписания.

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

Так действительно ли мне нужно использовать ресурс StatefulSet для баз данных в k8s?

Это зависит от того, чего вы хотите достичь.

StatefulSet дает вам:

  • Возможность иметь стабильный сетевой идентификатор (так что ваши модули будут всегда именоваться как $(statefulset name)-$(ordinal))
  • Возможность иметь стабильное хранилище, поэтому, когда Pod (повторно) запланирован на узел, его volumeMounts монтирует PersistentVolumes, связанные с его утверждениями PersistentVolume.

... MySql и без StatefulSet ...

Как видите, если ваша цель - просто запустить один модуль RDBMS (например, Mysql), который хранит все свои данные (саму базу данных) на PV + PVC, то StatefulSet определенно является излишним.

Однако, если вам нужно запустить кластер Redis (распределенная БД) :-D, это будет практически невозможно сделать без StatefulSet (насколько мне известно и на основе многочисленных потоков примерно того же самого в StackOverflow).

Надеюсь, эта информация вам поможет.

person Nick    schedule 13.07.2020
comment
Даже для кластера Redis зачем нужен набор состояний? У меня есть выбор главного (если узел выходит из строя) и балансировка нагрузки между подчиненными узлами для чтения. Кажется, что стабильный идентификатор памяти / сети в этом случае не нужен ... - person Alex Mawashi; 14.07.2020
comment
Извините, я допустил опечатку. Я думал об Apache Zookeeper. - person Nick; 14.07.2020