Когда мы работаем с Kubernetes, наши приложения масштабируются и перемещаются за секунды. Но есть одна фундаментальная проблема - постоянное хранилище. Как сделать так, чтобы критичные данные не потерялись из-за эфемерной природы контейнеров? Традиционные решения для хранения требуют сложной конфигурации, страдают от проблем с производительностью и, в целом, становятся настоящей головной болью для DevOps-команд.
Приложения, которым нужен доступ к сохранённым данным, требуют хранилища, которое будет высокодоступным, масштабируемым и простым в управлении. И тут на сцену выходит Longhorn. Longhorn - это облачно-нативное, распределённое блочное хранилище, созданное для упрощения постоянного хранения в Kubernetes. Это система хранения, такая же гибкая и устойчивая, как и контейнеризованные приложения. Longhorn без проблем интегрируется в среду Kubernetes и предлагает простоту, надёжность, автоматическую репликацию данных, создание снапшотов, возможности резервного копирования, самовосстановление и лёгкость в использовании.
Проблема, которую решает Longhorn
Kubernetes даёт масштабируемость и гибкость, что упрощает развёртывание контейнеризованных приложений. Но он изначально спроектирован для работы с эфемерными нагрузками - если контейнер умирает, его локальное хранилище уходит вместе с ним. Однако stateful-приложения - базы данных, очереди сообщений, системы логирования - нуждаются в постоянном хранилище.
Классические решения для хранения имеют свои сложности:
Longhorn избавляет от этих проблем. Это лёгкое, масштабируемое и распределённое блочное хранилище, изначально созданное для Kubernetes. Оно нативно работает с Kubernetes Storage Classes, Persistent Volumes (PV) и Persistent Volume Claims (PVC).
Longhorn использует распределённую архитектуру Kubernetes, чтобы синхронно реплицировать данные на нескольких узлах, обеспечивая устойчивость и отказоустойчивость. Благодаря этому целостность данных сохраняется даже при сбое узлов. Longhorn упрощает управление хранилищем и позволяет легко выделять, расширять и администрировать тома с помощью Kubernetes-нативных API.
Longhorn Engine - это компонент на уровне data plane, отвечающий за все операции ввода/вывода для конкретного тома. Он запускается как процесс Linux и работает по принципу «один том - один движок» (контроллер). Для каждого тома Longhorn есть свой отдельный Engine. Это один из ключевых элементов системы, обеспечивающий целостность данных, доступность и устойчивость через синхронную репликацию и механизмы восстановления после сбоев.
Что делает Longhorn Engine:
Репликация данных и восстановление
По умолчанию каждый том Longhorn имеет две реплики. Longhorn Engine синхронно реплицирует все операции записи на эти реплики, чтобы обеспечить избыточность данных и устойчивость к сбоям. Если одна реплика выходит из строя, движок автоматически восстанавливает её, используя другую рабочую реплику. Всё это происходит без ручного вмешательства, а целостность данных при этом не страдает.
Обработка запросов ввода/вывода
Longhorn Engine находится между приложением и системой хранения. Он получает блочные запросы на чтение и запись через драйвер CSI (Container Storage Interface) и обрабатывает их максимально эффективно.
Снапшоты и бэкапы
Longhorn поддерживает создание снапшотов и инкрементных резервных копий.
Управление томами
С помощью Longhorn Engine можно динамически выделять, изменять размер и удалять тома. Это сильно упрощает работу с хранилищем в Kubernetes.
Управление репликами
Движок постоянно проверяет здоровье реплик и при необходимости автоматически запускает их ремонт или повторную синхронизацию при сбоях или расхождениях в данных.
Сетевая коммуникация
Longhorn Engine использует распределённый уровень блочных устройств, который абстрагирует физическую инфраструктуру хранения. Благодаря этому тома работают стабильно на разных узлах без привязки к конкретным физическим дискам.
Оптимизация производительности
Движок спроектирован так, чтобы эффективно справляться с высоконагруженными задачами. Он использует умное кэширование и распределённые механизмы хранения, чтобы снизить задержку и обеспечить стабильную производительность для stateful-приложений.
Longhorn Manager - это компонент control plane, который оркестрирует и управляет всей системой Longhorn. Он работает в виде Kubernetes DaemonSet и взаимодействует с API-сервером Kubernetes. Запускаясь как Kubernetes-контроллер, он обрабатывает запросы на хранилище, ведёт метаданные томов и следит за корректным выполнением операций Longhorn.
Что делает Longhorn Manager:
Планирование томов и управление их жизненным циклом
Longhorn Manager определяет, на каких узлах и в каком виде размещать тома и реплики, учитывая доступность узлов, объём свободного места и локальность данных. Он отвечает за создание, расширение, миграцию, удаление и обслуживание томов Longhorn.
Планирование и координация реплик
Следит, чтобы реплики были равномерно распределены по доступным узлам.
Координация снапшотов и бэкапов
Управляет процессом создания снапшотов и резервных копий, чтобы сохранять целостность и консистентность данных.
Мониторинг состояния и обработка сбоев
Отслеживает здоровье всей системы Longhorn, обнаруживает сбои узлов и другие проблемы. Следит, чтобы фактическое состояние системы совпадало с желаемым состоянием, заданным пользователем.
Интеграция с Kubernetes
Использует Kubernetes Custom Resource Definitions (CRD), чтобы нативно работать с хранилищем внутри кластера.
Примечание: на каждом узле кластера Kubernetes запускается экземпляр Longhorn Manager, который общается с другими менеджерами, поддерживая распределённый control plane для хранилища.
Longhorn UI - это веб-интерфейс, через который администраторы могут управлять томами Longhorn и следить за их состоянием.
Что умеет Longhorn UI:
Примечание: Longhorn можно полностью администрировать через kubectl и API, но UI - это удобная альтернатива для тех, кто не хочет работать только из командной строки.
Container Storage Interface (CSI) Driver - это компонент, который позволяет Kubernetes-нагрузкам работать с Longhorn как с провайдером постоянного хранилища через стандартный CSI-интерфейс.
CSI-драйвер делает так, что приложения в Kubernetes могут использовать хранилище Longhorn так же, как любое другое облачно-нативное хранилище, полностью поддерживая все стандартные операции Kubernetes с томами.
Что делает Longhorn CSI Driver:
Реплика Longhorn - это копия тома Longhorn, размещённая на другом узле. Longhorn гарантирует, что у каждого тома есть несколько реплик, что защищает от потери данных и обеспечивает их синхронизацию. Если узел или реплика выходят из строя, Longhorn просто переключается на другую реплику, минимизируя простой. Количество реплик можно настроить в зависимости от нужного уровня избыточности данных.
Как работают реплики в Longhorn:
Когда создаётся том, Longhorn автоматически разворачивает несколько реплик в соответствии с политикой избыточности, заданной пользователем. Движок Longhorn записывает данные одновременно во все активные реплики. Если узел с репликой выходит из строя, Longhorn назначает одну из рабочих реплик основным источником данных и начинает восстанавливать потерянную реплику на другом узле.
Data Path описывает, как данные передаются от pod приложения в хранилище Longhorn. Когда приложение читает данные, Longhorn Engine забирает их из реплики и отдаёт обратно через CSI-драйвер.
Схема:
Pod -> CSI Driver -> Longhorn Engine -> Replicas -> Physical Storage.
Поток данных (шаги):
Control Path — это канал взаимодействия между Longhorn Manager и Longhorn Engine. Через него осуществляется координация всех операций и управление работой системы.
Control Path гарантирует, что Longhorn остаётся высокодоступным даже в облачных средах.
Сила Longhorn - в том, что он упрощает сложные операции с хранилищем, обеспечивая при этом надёжность данных и производительность. Все операции выполняются по чётко выстроенному рабочему процессу, чтобы сохранить целостность данных и высокую доступность.
Создание тома
Когда пользователь создаёт PVC (PersistentVolumeClaim) в Kubernetes, CSI-драйвер переводит этот запрос в вызов API Longhorn. Longhorn Manager выделяет новый том и назначает его на узел, следуя политике планирования. Затем создаётся Longhorn Engine, а реплики инициализируются на выбранных узлах для обеспечения избыточности.
Репликация тома
Когда приложение записывает данные в том, запрос на запись проходит через CSI-драйвер в Longhorn Engine. Движок синхронно реплицирует операцию записи на все реплики, чтобы данные оставались согласованными.
Снапшоты и бэкапы
Снапшот фиксирует состояние данных тома в определённый момент времени. Longhorn использует блочный механизм создания снапшотов, эффективно захватывая текущее состояние тома.
Бэкапы снапшотов могут сохраняться во внешнее хранилище, например, в NFS или объектное хранилище, совместимое с AWS S3.
Политики планирования помогают оптимизировать производительность и поддерживать высокую доступность.
Тонкое выделение (Thin Provisioning)
Longhorn использует тонкое выделение ресурсов - это значит, что пространство на диске выделяется по мере необходимости. Вместо того чтобы резервировать весь объём сразу, Longhorn постепенно выделяет место по мере записи данных.
Этот подход помогает эффективно использовать ресурсы хранилища, так как выделяется только реально используемое пространство. Особенно полезно в средах с непостоянной нагрузкой на хранилище.
Data Locality
Longhorn старается размещать реплики на тех узлах, которые находятся ближе всего к pod приложения, использующего том. Это помогает минимизировать сетевые задержки и повысить производительность.
Пример
Если основная нагрузка тома работает на Node A, Longhorn гарантирует, что хотя бы одна реплика будет находиться на том же узле. Это снижает задержку, потому что данные не нужно гонять между узлами. Если же нагрузка переезжает на Node B, Longhorn динамически перестраивает размещение реплик, чтобы снова оптимизировать локальность.
Примечание: при планировании томов и реплик Longhorn учитывает правила node affinity. Он также старается держать реплики на разных дисках, чтобы минимизировать последствия отказа одного диска.
Volume Scheduling
Longhorn динамически планирует размещение томов и их реплик, учитывая такие факторы, как:
Node Affinity
Longhorn использует правила Kubernetes node affinity, чтобы размещать реплики на конкретных узлах или группах узлов. Это помогает выбирать узлы с нужными характеристиками хранилища или сетевым подключением.
Правила Node Affinity в Longhorn:
Longhorn изначально спроектирован для плотной интеграции с Kubernetes, что позволяет ему работать как нативное решение для хранения данных в экосистеме оркестрации контейнеров.
Как Longhorn интегрируется с Kubernetes StorageClass, томами, PVC и CSI
Longhorn использует Kubernetes StorageClass для задания политик выделения хранилища: количество реплик, частота создания снапшотов, настройки резервного копирования и т. д. Пользователь может создать PVC, ссылаясь на нужный StorageClass, и Longhorn динамически создаст требуемый Persistent Volume (PV). Это обеспечивает выделение хранилища «по требованию» в зависимости от потребностей приложения.
CSI-драйвер служит «мостом», преобразуя запросы Kubernetes к хранилищу в вызовы API Longhorn. Благодаря этому pod может монтировать тома Longhorn так же, как и любой другой поддерживаемый Kubernetes бэкенд.
Longhorn полностью соответствует стандартам Container Storage Interface (CSI).
Взаимодействие pod с Longhorn
Pod работает с томами Longhorn через PVC. CSI-драйвер монтирует том в файловую систему pod, что даёт приложению возможность читать и записывать данные. Kubernetes отвечает за монтирование и размонтирование томов.
Интеграция с Rancher
Longhorn - это проект CNCF, разработанный Rancher, и он является решением по умолчанию для хранения данных в Kubernetes-кластерах, управляемых Rancher.
Плюсы интеграции Longhorn с Rancher:
Longhorn можно установить с помощью Helm, kubectl или через интерфейс Rancher UI.
Установка через Helm (рекомендуется)
Helm - предпочтительный способ установки Longhorn. Он упрощает развертывание и управление компонентами системы. Достаточно добавить репозиторий Longhorn и выполнить несколько простых команд.
Подробные шаги установки - здесь.
Установка через kubectl
Можно установить Longhorn, применив готовые YAML-манифесты через kubectl. Это более ручной процесс, но он даёт больше контроля над установкой, что удобно в средах без Helm.
Подробные шаги установки - здесь.
Установка через Rancher UI
Если Rancher уже развёрнут, Longhorn можно поставить буквально в пару кликов прямо из Rancher UI. Это самый простой способ установки.
Подробные шаги установки - здесь.
Другие способы** установки Longhorn в Kubernetes-кластере:
Longhorn - это простое в установке и обновлении, полностью открытое, облачно-нативное блочное хранилище с постоянным доступом, без скрытых затрат на проприетарные или «open-core» решения.
Его архитектура, основанная на распределённом блочном хранилище и синхронной репликации, обеспечивает высокую доступность и надёжность данных. Интеграция со стандартом Kubernetes CSI упрощает управление хранилищем и позволяет динамически выделять тома.
Проект Longhorn продолжает активно развиваться, постоянно получая новые улучшения.
Longhorn - это open source проект, так что вклад в разработку всегда приветствуется!