Бесконечно масштабируемое хранилище для Kubernetes

Неограниченное масштабируемое хранилище для Kubernetes

Разрушительный эксперимент, чтобы убедиться, что наши данные восстанавливаются

Иногда вам просто нужно хранилище, которое работает. Роскошь обладания хранилищем Cloud провайдера не всегда возможна, и вам нужно управлять всем самостоятельно. Вот с чем мне пришлось столкнуться для своего клиента, работающего в здравоохранении.

В этой статье вы узнаете, почему и как установить Rook Ceph, чтобы предоставить вашей кластеризованной системе Kubernetes простой в использовании реплицированный storage class.

Затем мы развернем приложение для совместного использования файлов, уничтожим узел, на котором оно находится, и посмотрим, что произойдет. Сможет ли Ceph снова сделать наши файлы доступными?

Transparent containers in a line, to the horizon. Photo by Kelly on Pexels.

Выбор решения для хранения

Хранение всегда было проблемой в Kubernetes, поскольку сам по себе он не предоставляет редундантное и распределенное хранилище. С помощью простой кластеризации Kubernetes вы можете прикрепить только том hostPath для постоянного хранения.

У моего клиента есть собственная инфраструктура в пределах предприятия, и он хотел быть уверен, что ни одни из его данных не потеряются, если один из его серверов выйдет из строя. Большинство его приложений – это монолиты, которые самостоятельно не содержат механизмов репликации данных.

Так что мне пришлось выбирать из различных решений хранения. Моему клиенту не требовались сверхвысокие производительности, но он хотел стабильное решение. Я выбрал Rook Ceph потому, что:

Подготовьте ваш кластер

Вам понадобится кластер Kubernetes с минимум 3 узлами и 1 свободным прикрепленным диском для каждого.

Я рекомендую использовать Scaleway Kapsule, чтобы легко создать кластер Kubernetes и предоставить неформатированные диски. После запуска кластера Kubernetes мы создадим прикрепленный том (диск) для каждого узла:

  • Перейдите в раздел “Экземпляры”
  • Выберите свой узел
  • Перейдите на вкладку “Прикрепленные тома”
  • Нажмите на “+” (Создать том) и создайте новый диск

Загрузите файл kubeconf и поместите его в ~/.kube/config. Теперь у вас должен быть доступ к вашему кластеру с помощью kubectl CLI.

Установка Rook Ceph

1. Эта статья имеет связанный репозиторий на GitHub, давайте склонируем его, чтобы у нас были все необходимые ресурсы

git clone https://github.com/flavienbwk/ceph-kubernetescd ceph-kubernetes

2. Склонируйте репозиторий Rook и разверните оператор Rook Ceph

git clone --single-branch --branch release-1.11 https://github.com/rook/rook.gitkubectl create -f ./rook/deploy/examples/crds.yamlkubectl create -f ./rook/deploy/examples/common.yamlkubectl create -f ./rook/deploy/examples/operator.yaml

3. Создайте кластер Ceph

kubectl create -f ./rook/deploy/examples/cluster.yaml -n rook-ceph

Подождите несколько минут, чтобы Ceph настроил диски. Состояние должно быть HEALTH_OK:

kubectl get cephcluster -n rook-ceph

4. Создайте классы хранилища

В Rook Ceph вы можете использовать два основных класса хранилища. Один – RBD – позволяет вам иметь реплицированное хранилище в режиме ReadWriteOnce. Второй, который мы установим, – CephFS, позволяет вам иметь реплицированное хранилище в режиме ReadWriteMany. RBD означает RADOS Block Device и позволяет вам создать класс хранилища для создания томов в вашем кластере Kubernetes. Это поддерживает только ReadWriteOnce тома (RWO). CephFS работает как реплицированный NFS-сервер. Это позволит нам создавать тома в режиме ReadWriteMany (RWX).

kubectl create -f ./rook/deploy/examples/csi/rbd/storageclass.yaml -n rook-cephkubectl create -f ./rook/deploy/examples/filesystem.yaml -n rook-cephkubectl create -f ./rook/deploy/examples/csi/cephfs/storageclass.yaml -n rook-ceph

5. Разверните панель управления Ceph

kubectl create -f ./rook/deploy/examples/dashboard-external-https.yaml -n rook-ceph

Перенаправьте доступ к панели управления по HTTP:

kubectl port-forward service/rook-ceph-mgr-dashboard -n rook-ceph 8443:8443

Подключитесь с именем пользователя admin и следующим паролем:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"

Вы должны увидеть следующую страницу, перейдя по адресу https://localhost:8443

Изображение от автора: панель управления Ceph

Развертывание приложения

Мы развернем самостоятельное приложение для обмена файлами (psitransfer), чтобы проверить, правильно ли связаны наши тома.

1. Разверните приложение для обмена файлами (NodePort 30080)

kubectl create -f ./psitransfer-deployment-rwx.yaml

2. Узнайте, на каком узле оно развернуто

kubectl get pods -o wide -l app=psitransfer

Получите IP-адрес этого узла (через интерфейс Scaleway) и убедитесь, что приложение работает по адресу http://nodeip:30080

3. Загрузим файлы

Скачайте файлы 5MB, 10MB и 20MB с веб-сайта xcal1.vodafone.co.uk.

Загрузите их в наше приложение для передачи файлов. Нажмите на появившуюся ссылку на экране.

Теперь вы должны увидеть импортированные файлы. Нажмите на них и оставьте ссылку во вкладке вашего браузера, мы будем использовать ее позже.

После загрузки около 400 МБ файлов мы видим, что репликация данных согласована по всем дискам. Мы видим, что запись происходит одновременно на всех трех дисках при загрузке файлов. На следующем скриншоте использование составляет 1% для каждого диска: хотя я загрузил с одного хоста, кажется, что репликация работает ожидаемым образом, с равномерным сохранением данных на трех дисках (OSD). Диск 2 имеет много действий “чтение”, так как два других диска синхронизируют данные с него.

Теперь панель инструментов Ceph должна выглядеть так:

C. Уничтожить и проверить

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

  1. Посмотреть, на каком узле развернуто приложение
kubectl get pods -o wide -l app=psitransfer

2. Выключите питание на узле через консоль Scaleway

Это имитирует отключение питания на узле. Он должен стать NotReady через несколько минут:

$> kubectl get nodeNAME                                             STATUS     ROLES    AGE    VERSIONscw-ceph-test-clustr-default-5f02f221c3814b47a   Ready      <none>   3д1ч   v1.26.2scw-ceph-test-clustr-default-8929ba466e404a00a   Ready      <none>   3д1ч   v1.26.2scw-ceph-test-clustr-default-94ef39ea5b1f4b3e8   NotReady   <none>   3д1ч   v1.26.2

И наш узел 3 недоступен в панели инструментов Ceph:

Теперь панель инструментов Ceph должна выглядеть так:

3. Перепланировать нашу поду

Запланированная пода на недоступном узле. Однако наша пода все еще считает, что она активна:

$> kubectl get pods -o wide -l app=psitransferNAME                                      READY   STATUS    RESTARTS   AGE   IP            NODEpsitransfer-deployment-8448887c9d-mt6wm   1/1     Running   0          19ч   100.64.1.19   scw-ceph-test-clustr-default-94ef39ea5b1f4b3e8

Удалите ее для повторного планирования на другом узле:

kubectl delete pod psitransfer-deployment-8448887c9d-mt6wm

Проверьте статус вновь запущенной поды. Ваше приложение должно быть доступно снова по ранее сохраненной ссылке.

Чтобы избежать необходимости вручную удалять поду для повторного планирования при отключении узла, установите количество реплик вашего приложения равным как минимум 3 по умолчанию.

Теперь вы можете перезапустить ранее отключенный узел.

Когда использовать rook-ceph-block или rook-cephfs?

Если вашим приложениям требуется лучшая производительность и блочное хранилище с режимом доступа RWO, используйте класс хранилища rook-ceph-block (RBD). С другой стороны, если вашим приложениям требуется общая файловая система с режимом доступа RWX (CephFS) и соответствием POSIX, используйте класс хранилища rook-cephfs.

Если вы выбираете RBD и пытаетесь перепланировать поду, когда ее исходный узел находится в автономном режиме, как мы делали с CephFS, вы получите ошибку от PVC со следующим сообщением: “Volume is already exclusively attached to one node and can’t be attached to another” (Том уже исключительно подключен к одному узлу и не может быть подключен к другому). В этом случае вам просто нужно подождать, пока PVC снова не привяжется (моему кластеру потребовалось ~6 минут, чтобы автоматически переатрибутировать PVC к моей поде и позволить ей запуститься).

Попробуйте такое поведение следуя соответствующей главе связанного репозитория.

Заключительное слово

Вы научились устанавливать и развертывать приложение с помощью Ceph. Вы даже доказали, что оно реплицирует данные. Поздравляю ✨

Все изображения, если не указано иное, принадлежат автору.