Rook — «самообслуживаемое» хранилище данных для Kubernetes

shurup 1 февраля в 10:40 5,3k


29 января технический комитет организации CNCF (Cloud Native Computing Foundation), стоящей за Kubernetes, Prometheus и другими Open Source-продуктами из мира контейнеров и cloud native, объявил о принятии проекта Rook в свои ряды. Отличный повод познакомиться поближе с этим «оркестровщиком систем распределённого хранения данных в Kubernetes».

Что за Rook?


Rook — это написанное на Go программное обеспечение (распространяется по свободной лицензии Apache License 2.0), предназначенное для наделения хранилищ данных автоматизированными функциями, которые делают их самоуправляемыми, самомасштабируемыми и самовосстановливающимися. Для этого Rook автоматизирует (для хранилищ данных, применяемых в окружении Kubernetes): развёртывание, bootstrapping, конфигурацию, provisioning, масштабирование, обновления, миграции, восстановление после сбоев, мониторинг и управление ресурсами.

Проект находится в альфа-стадии и специализируется на оркестровке распределённой системы хранения данных Ceph в кластерах Kubernetes. Авторы заявляют также о планах по поддержке других систем хранения, но это случится не в ближайших релизах.

Компоненты и техническое устройство


В основе работы Rook внутри Kubernetes — специальный оператор (подробнее о Kubernetes Operators мы писали в этой статье), автоматизирующий конфигурацию хранилища и реализующий его мониторинг.

Итак, оператор Rook представляется контейнером, который содержит всё необходимое для развёртывания и последующего обслуживания хранилища. Среди обязанностей оператора:

  • создание DaemonSet для демонов хранения Ceph (ceph-osd) с простым кластером RADOS;
  • создание подов для мониторинга Ceph ceph-mon, проверяющими состояние кластера; для кворума в большинстве случаев разворачиваются три экземпляра, и при падении любого из них поднимается новый);
  • управление CRDs (Custom Resource Definitions) для самого кластера, пулов хранения, object stores (наборов ресурсов и сервисов для обслуживания HTTP-запросов, выполняющих PUT/GET для объектов, — они совместимы с S3 и Swift API), а также файловых систем;
  • инициализация подов для запуска всех нужных сервисов;
  • создание агентов Rook.

Агенты Rook представлены отдельными подами, которые разворачиваются на каждом узле Kubernetes. Предназначение агента — конфигурация плагина FlexVolume, обеспечивающего поддержку томов хранения в Kubernetes. Агент реализует эксплуатацию хранилища: подключает сетевые устройства хранения, монтирует тома, форматирует файловую систему и т.п.


Место и роль компонентов Rook в общей схеме кластера Kubernetes

Rook предлагает три вида хранилищ:

  1. блочное (Block, StorageClass) — монтирует хранилище к единственному поду;
  2. объектное (Object, ObjectStore) — доступно внутри и вне кластера Kubernetes (по S3 API);
  3. разделяемая ФС (Shared File System, Filesystem) — файловая система, которую можно монтировать на чтение и запись из множества подов.

Внутреннее устройство Rook включает в себя:

  • Mons — поды для мониторинга Ceph (с уже упомянутыми ceph-mon);
  • OSDs — поды с демонами ceph-osd (Object Storage Daemons);
  • MGR — поды с демоном ceph-mgr (Ceph Manager), предоставляющим дополнительные возможности мониторинга и интерфейсы для внешних систем (мониторинга/управления);
  • RGW (опционально) — поды с объектным хранилищем;
  • MDS (опционально) — поды с разделяемой ФС.




Все демоны Rook (Mons, OSDs, MGR, RGW, MDS) скомпилированы в единый бинарник (rook), запускаемый в контейнере.

Для краткого представления проекта Rook может пригодиться также эта небольшая (12 слайдов) презентация от Bassam Tabbara (CTO в Quantum Corp).

Эксплуатация Rook


Оператор Rook полноценно поддерживает Kubernetes версии 1.6 и выше (и, частично, более старый релиз K8s — 1.5.2). Его инсталляция в простейшем сценарии выглядит так:

cd cluster/examples/kubernetes
kubectl create -f rook-operator.yaml
kubectl create -f rook-cluster.yaml

Кроме того, для оператора Rook подготовлен Helm chart, благодаря чему инсталляция может проводиться и так:

helm repo add rook-alpha https://charts.rook.io/alpha
helm install rook-alpha/rook

Имеется небольшое количество опций настройки (например, можно отключить поддержку RBAC, если эта возможность не используется в вашем кластере), которые передаются в helm install через параметр --set key=value[,key=value] (или хранить в отдельном YAML-файле, а передавать — через -f values.yaml).

После установки оператора Rook и запуска подов с его агентами остаётся создать сам кластер Rook, простейшая конфигурация которого выглядит следующим образом (rook-cluster.yaml):

apiVersion: v1
kind: Namespace
metadata:
  name: rook
---
apiVersion: rook.io/v1alpha1
kind: Cluster
metadata:
  name: rook
  namespace: rook
spec:
  dataDirHostPath: /var/lib/rook
  storage:
    useAllNodes: true
    useAllDevices: false
    storeConfig:
      storeType: bluestore
      databaseSizeMB: 1024
      journalSizeMB: 1024


Примечание: особое внимание стоит обратить на атрибут dataDirHostPath, корректное значение которого необходимо для сохранения кластера после перезагрузок. Для случаев его использования как постоянного места хранения данных Rook на хостах Kubernetes авторы рекомендуют иметь в этом каталоге хотя бы 5 Гб свободного дискового пространства.

Остаётся собственно создать кластер из конфигурации и убедиться, что поды создались в кластере (в пространстве имён rook):

kubectl create -f rook-cluster.yaml
kubectl -n rook get pod
NAME                              READY     STATUS    RESTARTS   AGE
rook-api-1511082791-7qs0m         1/1       Running   0          5m
rook-ceph-mgr0-1279756402-wc4vt   1/1       Running   0          5m
rook-ceph-mon0-jflt5              1/1       Running   0          6m
rook-ceph-mon1-wkc8p              1/1       Running   0          6m
rook-ceph-mon2-p31dj              1/1       Running   0          6m
rook-ceph-osd-0h6nb               1/1       Running   0          5m

Апгрейд кластера Rook (до новой версии) — это процедура, которая на данном этапе требует поочерёдного обновления всех его компонентов в определённой последовательности, а начинать её можно только после того, как вы удостоверились в полностью «здоровом» состоянии текущей инсталляции Rook. Подробную пошаговую инструкцию на примере обновления Rook версии 0.5.0 до 0.5.1 можно найти в документации проекта.

В ноябре прошлого года в блоге Rook было опубликовано сравнение производительности с EBS. Его результаты достойны внимания, а если совсем вкратце, то они таковы:




Перспективы


Текущий статус Rook — alpha, а последним крупным релизом на сегодняшний день является версия 0.6, выпущенная в ноябре 2017 года (актуальное исправление — v0.6.2 — вышло 14 декабря). Уже в первой половине 2018 года ожидаются релизы более зрелых версий: беты и стабильной (официально готовой для использования в production).

Согласно roadmap проекта, у разработчиков есть подробное видение по развитию Rook как минимум в двух ближайших релизах: 0.7 (его готовность в трекере GitHub оценивается как 60 %) и 0.8. Среди ожидаемых изменений — перевод поддержки Ceph Block и Ceph Object в статус бета-версии, динамический provisioning томов для CephFS, развитая система логирования, автоматизированные обновления кластера, поддержка снапшотов для томов.

Принятие Rook в число проектов CNCF (пока что на самом раннем этапе — «inception-level», — наравне с linkerd и CoreDNS) является своеобразной гарантией растущего интереса к продукту. Насколько он закрепится в мире облачных приложений, станет лучше ясно после появления стабильных версий, которые, безусловно, принесут Rook новых «испытателей» и пользователей.

P.S.


Читайте также в нашем блоге:

Проголосовать:
+23
Сохранить: