Kubernetes: Longhorn
Когда мы работаем с Kubernetes, наши приложения масштабируются и перемещаются за секунды. Но есть одна фундаментальная проблема - постоянное хранилище. Как сделать так, чтобы критичные данные не потерялись из-за эфемерной природы контейнеров? Традиционные решения для хранения требуют сложной конфигурации, страдают от проблем с производительностью и, в целом, становятся настоящей головной болью для DevOps-команд.
Приложения, которым нужен доступ к сохранённым данным, требуют хранилища, которое будет высокодоступным, масштабируемым и простым в управлении. И тут на сцену выходит Longhorn. Longhorn - это облачно-нативное, распределённое блочное хранилище, созданное для упрощения постоянного хранения в Kubernetes. Это система хранения, такая же гибкая и устойчивая, как и контейнеризованные приложения. Longhorn без проблем интегрируется в среду Kubernetes и предлагает простоту, надёжность, автоматическую репликацию данных, создание снапшотов, возможности резервного копирования, самовосстановление и лёгкость в использовании.
Проблема, которую решает Longhorn
Kubernetes даёт масштабируемость и гибкость, что упрощает развёртывание контейнеризованных приложений. Но он изначально спроектирован для работы с эфемерными нагрузками - если контейнер умирает, его локальное хранилище уходит вместе с ним. Однако stateful-приложения - базы данных, очереди сообщений, системы логирования - нуждаются в постоянном хранилище.
Классические решения для хранения имеют свои сложности:
- Настройка и управление хранилищем требуют ручной конфигурации storage classes, томов и стратегий репликации.
- Традиционные системы хранения обычно не оптимизированы под распределённые системы, из-за чего растёт задержка и падает производительность.
Longhorn избавляет от этих проблем. Это лёгкое, масштабируемое и распределённое блочное хранилище, изначально созданное для Kubernetes. Оно нативно работает с Kubernetes Storage Classes, Persistent Volumes (PV) и Persistent Volume Claims (PVC).
Longhorn использует распределённую архитектуру Kubernetes, чтобы синхронно реплицировать данные на нескольких узлах, обеспечивая устойчивость и отказоустойчивость. Благодаря этому целостность данных сохраняется даже при сбое узлов. Longhorn упрощает управление хранилищем и позволяет легко выделять, расширять и администрировать тома с помощью Kubernetes-нативных API.
Ключевые компоненты Longhorn
Longhorn Engine (управляет операциями с томами)
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
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 UI - это веб-интерфейс, через который администраторы могут управлять томами Longhorn и следить за их состоянием.
Что умеет Longhorn UI:
- Показывает наглядное представление (графический обзор) томов, реплик, снапшотов и бэкапов Longhorn.
- Позволяет создавать, удалять, изменять размер, управлять и мониторить тома, снапшоты и резервные копии.
- Отображает метрики в реальном времени и состояние здоровья компонентов хранилища.
- Выдаёт оповещения и уведомления о критичных событиях.
- Предоставляет инструменты для диагностики и восстановления после сбоев через логи и системные события.
Примечание: Longhorn можно полностью администрировать через kubectl и API, но UI - это удобная альтернатива для тех, кто не хочет работать только из командной строки.
Longhorn CSI Driver
Container Storage Interface (CSI) Driver - это компонент, который позволяет Kubernetes-нагрузкам работать с Longhorn как с провайдером постоянного хранилища через стандартный CSI-интерфейс.
CSI-драйвер делает так, что приложения в Kubernetes могут использовать хранилище Longhorn так же, как любое другое облачно-нативное хранилище, полностью поддерживая все стандартные операции Kubernetes с томами.
Что делает Longhorn CSI Driver:
- Позволяет Kubernetes автоматически создавать и подключать тома Longhorn, когда это нужно.
- Дает приложениям возможность динамически запрашивать постоянное хранилище.
- Преобразует запросы Kubernetes к хранилищу в вызовы API Longhorn.
- Обеспечивает динамическое выделение томов Longhorn через StorageClass.
- Работает с Kubernetes для поддержки снапшотов и резервных копий томов в целях восстановления после сбоев.
- Является ключевым элементом интеграции Longhorn в экосистему Kubernetes.
Longhorn Replicas
Реплика Longhorn - это копия тома Longhorn, размещённая на другом узле. Longhorn гарантирует, что у каждого тома есть несколько реплик, что защищает от потери данных и обеспечивает их синхронизацию. Если узел или реплика выходят из строя, Longhorn просто переключается на другую реплику, минимизируя простой. Количество реплик можно настроить в зависимости от нужного уровня избыточности данных.
Как работают реплики в Longhorn:
Когда создаётся том, Longhorn автоматически разворачивает несколько реплик в соответствии с политикой избыточности, заданной пользователем. Движок Longhorn записывает данные одновременно во все активные реплики. Если узел с репликой выходит из строя, Longhorn назначает одну из рабочих реплик основным источником данных и начинает восстанавливать потерянную реплику на другом узле.
Data Path
Data Path описывает, как данные передаются от pod приложения в хранилище Longhorn. Когда приложение читает данные, Longhorn Engine забирает их из реплики и отдаёт обратно через CSI-драйвер.
Схема:
Pod -> CSI Driver -> Longhorn Engine -> Replicas -> Physical Storage.
Поток данных (шаги):
- Kubernetes-нагрузка записывает данные в Persistent Volume, который использует Longhorn.
- CSI-драйвер Kubernetes перехватывает запрос и отправляет его в Longhorn Engine.
- Longhorn Engine обрабатывает операцию записи и следит, чтобы она была одинаково применена на всех активных репликах. Один и тот же блок данных записывается во все реплики Longhorn для обеспечения избыточности.
- Каждая реплика хранит данные в виде файла блочного хранилища на отдельном узле Kubernetes.
Control Path
Control Path — это канал взаимодействия между Longhorn Manager и Longhorn Engine. Через него осуществляется координация всех операций и управление работой системы.
Control Path гарантирует, что Longhorn остаётся высокодоступным даже в облачных средах.
Как 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:
- Soft Affinity - предпочитать определённые узлы, но при необходимости разрешать размещение на других.
- Hard Affinity - жёстко закреплять тома за конкретными узлами для оптимальной локальности данных и снижения задержек.
- Anti-Affinity - не размещать тома на одном и том же узле, чтобы повысить отказоустойчивость.
Интеграция и взаимодействие Longhorn с Kubernetes
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 прямо из интерфейса Rancher.
- Rancher предоставляет интерактивную визуальную панель для управления томами, бэкапами и снапшотами Longhorn.
Установка и использование Longhorn
Longhorn можно установить с помощью Helm, kubectl или через интерфейс Rancher UI.
Установка через Helm (рекомендуется)
Helm - предпочтительный способ установки Longhorn. Он упрощает развертывание и управление компонентами системы. Достаточно добавить репозиторий Longhorn и выполнить несколько простых команд.
Подробные шаги установки - здесь.
Установка через kubectl
Можно установить Longhorn, применив готовые YAML-манифесты через kubectl. Это более ручной процесс, но он даёт больше контроля над установкой, что удобно в средах без Helm.
Подробные шаги установки - здесь.
Установка через Rancher UI
Если Rancher уже развёрнут, Longhorn можно поставить буквально в пару кликов прямо из Rancher UI. Это самый простой способ установки.
Подробные шаги установки - здесь.
Другие способы** установки Longhorn в Kubernetes-кластере:
- Helm Controller
- Fleet
- Flux
- ArgoCD
Базовая настройка и лучшие практики
- Убедитесь, что Kubernetes-кластер соответствует минимальным требованиям Longhorn. Подробнее - здесь.
- Настройте количество реплик в зависимости от нужного уровня избыточности данных.
- Мониторьте использование хранилища и производительность, чтобы вовремя находить узкие места.
- Используйте отдельные устройства хранения для томов Longhorn для повышения производительности.
- Следите, чтобы узлы с Longhorn имели достаточные ресурсы.
- Обеспечьте стабильную и быструю сеть между узлами.
Заключение
Longhorn - это простое в установке и обновлении, полностью открытое, облачно-нативное блочное хранилище с постоянным доступом, без скрытых затрат на проприетарные или «open-core» решения.
Его архитектура, основанная на распределённом блочном хранилище и синхронной репликации, обеспечивает высокую доступность и надёжность данных. Интеграция со стандартом Kubernetes CSI упрощает управление хранилищем и позволяет динамически выделять тома.
Проект Longhorn продолжает активно развиваться, постоянно получая новые улучшения.
Longhorn - это open source проект, так что вклад в разработку всегда приветствуется!