Мережеве файлове сховище для Kubernetes: NFS, EFS, Filestore

Файлове сховище часто стає вузьким місцем кластера: томи втрачають доступність під навантаженням, а сервіси простоюють в очікуванні даних. Ми налаштовуємо NFS-сервер для Kubernetes під ключ — від проєктування схеми до регламентів супроводу. Наші інженери відповідають за відмовостійкість і помітно скорочують час на запуск нових сервісів.
Часті запитання

NFS-сервер у Kubernetes: де ламається сховище

Типова схема виглядає так: один NFS-сервер у Kubernetes піднімають «нашвидкуруч» — єдиний експорт каталогу, доступ за адресою вузла, монтування у спільну теку для контейнерів.

У тестовому контурі це працює, а в проді першим проявляється зависле монтування тому: процес на вузлі не отримує відповіді й не може завершити операцію.

Зависле монтування тому — це не локальна проблема одного застосунку. Под застрягає в очікуванні, вузол не може коректно його завершити й переходить у недоступний стан — разом із ним зупиняються сусідні сервіси, які до сховища взагалі не зверталися. При цьому в журналах усе виглядає справно: сервер відповідає, явних помилок немає.

Друга міна — втрата даних під час рестарту поду. Якщо запис іде в спільний том без узгодження блокувань, рестарт обриває його на середині, і застосунок після підйому читає половину файлу як цілий. Кілька реплік, що пишуть в одну директорію, додають гонки за іменами й перезапис чужих результатів.

На піковому навантаженні вузьке місце сховища проявляється як зростаюча черга запитів: сервер витрачає час на операції з метаданими, застосунок чекає відповіді й тримає з’єднання. Додавання реплік у такій схемі не допомагає — вони впираються в той самий єдиний вузол.

Усе це лікується не «правильним сервером», а розділенням ролей: режимами монтування, рівнями доступу, лімітами й спостережуваністю за томом. Розбираємо, як це закривається.

Що дає кероване файлове сховище кластеру

Порядок у сховищі видно за швидкістю видачі тому.

За динамічного створення томів і декларативно описаного класу зберігання том з’являється в момент планування поду, і контейнер стартує з уже примонтованим каталогом — без ручного експорту на сервері й очікування чергового адміністратора. Затримка між «потрібен том» і «том готовий» перестає залежати від людини.

Другий ефект — передбачуваний клас відмов сховища. Одиночний NFS-сервер без реплікації зупиняє всі поди, які тримають на ньому дані: простій застосунку дорівнює часу відновлення сервера.

Кероване файлове сховище Kubernetes розводить збій вузла і збій сервісу — клієнт перепідключається до доступної точки, под переїжджає й отримує той самий том за тим самим шляхом, а застосунок не перезбирає стан з нуля.

Третій — продуктивність запису під навантаженням. Вузьке місце проявляється на метаданих раніше, ніж на обсязі: багато дрібних файлів, часта ротація журналів, одночасний запис із десятків подів.

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

Порядок вимірюється конкретно: секунди на видачу тому, кількість операцій, що залишилися руками, частка відмов вузла, погашених без простою застосунку, і рівність запису на піку. Розбираємо, як це налаштовується під ваш кластер.

Власні NFS-вузли проти хмарного файлового сервісу

NFS у Kubernetes підключається як PersistentVolume через StorageClass і драйвер, а режим доступу вирішує, скільки вузлів можуть змонтувати том одночасно: ReadWriteMany — для спільних каталогів, ReadWriteOnce — для одного споживача.

Помилка у виборі проявляється не під час деплою, а під час масштабування: нова репліка зависає в очікуванні тому.

Варіант Коли підходить Обмеження
Власний NFS-вузол Потрібен контроль над експортами, правами й снапшотами Єдина точка відмови: впала машина — стали всі поди зі спільним томом
Керований сервіс провайдера, AWS EFS Кілька зон доступності, не хочеться тримати сховище самим Вища затримка на дрібних операціях, менше налаштувань, залежність від провайдера
Локальні диски вузлів Бази, кеші, чутливість до швидкості введення-виведення Тільки ReadWriteOnce, том прив’язаний до вузла й не переїжджає з подом
Блоковий том із драйвером Одна репліка на запис, швидкий відкат за снапшотами Спільного доступу немає: другий под той самий том не змонтує

Власний вузол дає повний контроль над експортами й снапшотами, але експлуатація, оновлення та резервні копії залишаються на вашій стороні. Керований сервіс знімає цю роботу, зате обмежує налаштування й додає затримку на безлічі дрібних файлових операцій.

Практичне правило: спільні дані — на спільному томі, бази й кеші — на локальних або блокових. Режим доступу перевіряємо до викочування — на одному вузлі ReadWriteOnce працює, а на трьох репліках той самий маніфест уже не підніметься.

Як ми впроваджуємо файлове сховище: етапи робіт

Порядок робіт вибудовуємо так, щоб кожен наступний крок спирався на підтверджені дані попереднього.

Спочатку аудит сховища: дивимося, які томи вже змонтовані в кластер, які заявки на томи залишилися від видалених застосунків, хто пише в спільний каталог і з якими режимами доступу.

На цьому етапі зазвичай спливають два-три мовчазні вузькі місця — перевантажений експорт і застосунок, що тримає монтування в режимі жорстких очікувань.

  1. Аудит сховища. Інвентаризація томів, профілів доступу, точок монтування й прав; замір затримок читання й запису під реальним навантаженням застосунків.
  2. Проєктування схеми. Вибір між спільним експортом і окремими на застосунок, розбиття за класами зберігання, розрахунок запасу за ємністю та пропускною здатністю.
  3. Підготовка серверної частини. Розгортання служби, експорти з обмеженням за підмережею, режим синхронного запису для критичних каталогів, квоти на користувача.
  4. Підключення до кластера. Драйвер сховища, класи зберігання й політики звільнення томів, щоб видалений том повертав місце, а не залишався висіти.
  5. Перевірка відмовостійкості. Гасимо вузол із застосунком, рвемо зв’язок зі сховищем, дивимося, як поводяться поди: переїзд на інший вузол, повторне монтування, швидкість повернення в роботу.
  6. Навантажувальні прогони. Дивимося, за якого паралельного запису починаються черги, і підбираємо параметри монтування під профіль застосунку.
  7. Передача в експлуатацію. Метрики за затримками й заповненням томів, оповіщення про збої, регламент розширення й стисла інструкція для чергової зміни.

Аудит займає більше часу, ніж налаштування, і ми цього не приховуємо: переробка схеми після запуску коштує дорожче, ніж два дні інвентаризації до нього.

За підсумком у команди залишається робочий стенд, відтворювана конфігурація й зрозумілий порядок дій у разі відмови вузла або самого сховища.

Конфігурації, схеми та регламенти: що ви отримуєте

На виході ви отримуєте не набір розрізнених маніфестів, а комплект, за яким сховище розгортають, перевіряють і передають черговій зміні.

Усе лежить у репозиторії поруч із застосунками: зміни проходять рев’ю, а стан класів зберігання й томів відтворюється без ручних правок на вузлах.

  • Конфігурації томів — StorageClass і описи PVC під різні профілі доступу: ReadWriteMany для спільних даних, ReadWriteOnce для навантажених баз; параметри монтування, каталог усередині тому й ліміт за обсягом.
  • Політики доступу до сховища — правила експорту на боці сервера, розмежування за підмережами й просторами імен, окремі права на читання й запис, закритий анонімний доступ.
  • Схема розміщення — який вузол NFS віддає які каталоги, у якій зоні він живе, як том потрапляє в под, де точки відмови й як вони розведені між собою.
  • Регламент резервного копіювання — що копіюється, з якою періодичністю, скільки зберігаються копії, хто запускає відновлення й як перевіряється, що копія справді читається.
  • Документація з інфраструктури — порядок підключення нового тому, дії за недоступності сервера сховища, карта метрик, чек-ліст приймання зміни.
  • Спостережуваність — метрики затримки операцій, зайнятого обсягу й помилок на клієнтах, пороги спрацювання та маршрути оповіщень.
  • План міграції та відкату — як перенести дані з поточного сховища без простою і як повернутися до попередньої схеми, якщо поведінка застосунку розійдеться з очікуваннями.

Кейс: перевели сховище без простою сервісу

До переїзду всі простори імен у кластері Kubernetes працювали з однією точкою монтування NFS. Томи видавалися вручну: заявка, правка списку експортів, очікування інженера — від кількох годин до доби.

Відмова єдиного сервера означала завислі томи: поди не перезапускалися, а черга заявок накопичувалася, поки черговий розбирався з конфігурацією.

Що змінили

Зібрали два вузли сховища з реплікацією експортів і автоматичним перемиканням, класи зберігання описали декларативно — том створюється й монтується без участі людини.

Додали квоти на простір імен, моніторинг затримок введення-виведення й регламент заміни вузла, перевірений на навчальній відмові.

Переїзд ішов паралельно: новий контур підняли поруч зі старим і перенесли дані з перевіркою контрольних сум. Сервіси перемикали по одному — точка монтування змінювалася в маніфесті, под перестворювався, попередній том залишався доступним для відкату. Старий контур тримали в резерві, поки навантаження не відпрацювало повний цикл на новому сховищі.

Результат у цифрах

Видача тому скоротилася з 4–6 годин ручної роботи до 30 секунд автоматичної. Збоїв доступу до даних не було за пів року спостережень — до переїзду їх набиралося 2–3 на місяць. Ручні операції з експортами зменшилися приблизно на 90%, залишилися розширення квот і планові оновлення.

Час відновлення після відмови вузла — з 40 хвилин ручного розбору до автоматичного перемикання за хвилину.

Динамічні томи чи статичне підключення: що вибрати

У Kubernetes том можна видати двома способами, і різниця не в зручності, а в точці контролю. За динамічного режиму заявка посилається на клас зберігання, і компонент, що відповідає за видачу, сам створює том потрібного розміру, прив’язує його до заявки й монтує в под.

За статичного підключення експорт готують заздалегідь, а в кластер потрапляє опис тому з точною адресою й параметрами — застосунок знаходить його за міткою.

Вибір залежить від того, хто володіє даними і як довго вони живуть.

Варіант Коли підходить Обмеження
Динамічні томи Сервіси зі змінним навантаженням, черги, кеші, багато однотипних середовищ Потрібен робочий клас сховища й права на створення томів; життям тому керує політика повернення
Статичне підключення Спільний експорт для групи сервісів, дані, що переживають перестворення кластера, зовнішні масиви Розмір і адреса фіксовані; розширення й ротація — вручну

Ключова деталь — керування життєвим циклом тому. Клас зберігання задає політику повернення: після видалення заявки том або звільняється разом із даними, або зберігається й потребує ручного підключення. Для баз і черг це вирішує, чи переживе стан перестворення середовища.

На практиці обидва режими співіснують: динамічний — для сервісів без стану й тимчасових середовищ, статичний — для даних, які мають пережити кластер. Ми розкладаємо їх за класами зберігання так, щоб жоден том не залишався безгоспним.

Технічні питання перед упровадженням сховища

Перед упровадженням в інженерної команди залишається короткий список сумнівів, від яких залежить доля проєкту: сумісність томів, одночасний запис, права доступу й поведінка за відмови. Розбираємо ті, що спливають на погодженні найчастіше.

Томи сумісні з поточними маніфестами?

Перевіряємо на стенді той самий маніфест, що піде в продуктив: под отримує каталог і бачить звичайну файлову систему. Відмінність від блокового тому одна — немає форматування, тому перенесення й відкат робляться копіюванням каталогу, а не відновленням знімка стану.

Два поди пишуть в один каталог — це безпечно?

Режим ReadWriteMany дозволяє монтування на кілька вузлів, але узгодженість забезпечує застосунок, а не сховище. Для спільних завантажень і артефактів це нормально; там, де важливий порядок запису, залишаємо одного письменника або розносимо дані за підкаталогами з блокуваннями.

Як видаються права доступу?

Через ідентифікатори користувача всередині поду й режим відображення прав root на сервері. Якщо їх не налаштувати, контейнер пише від непривілейованого облікового запису й отримує відмову. Задаємо власника каталогу й групу в шаблоні один раз — нові сервіси успадковують робочу схему.

Що буде в разі відмови вузла або сервера сховища?

У разі відмови вузла том відчіплюється й переїжджає разом із подом — важливо, щоб точка монтування була доступна з нового вузла.

За недоступності самого сервера поди йдуть в очікування введення-виведення й не видаляються штатно, тому таймаути й режим повернення задаємо заздалегідь.

Обговоримо задачу: що підготувати до розмови

План робіт складається з кількох вступних: як влаштований доступ до томів зараз, який профіль навантаження й які обмеження середовища. Чим конкретніші відповіді, тим менше уточнювальних кіл — оцінка й план приходять за один прохід, а не після трьох дзвінків. Повне ТЗ готувати заздалегідь не потрібно.

Що корисно тримати під рукою:

  • версія кластера Kubernetes, спосіб встановлення, кількість вузлів і зон доступності;
  • поточна схема зберігання — NFS-сервер, хмарне файлове сховище або локальні томи — і що в ній не влаштовує;
  • профіль навантаження: розміри томів, кількість одночасних читачів і письменників, чи потрібен спільний том на кілька подів;
  • чутливість до затримки та пропускної здатності на конкретних сценаріях;
  • вимоги до відмовостійкості: що має пережити падіння вузла або зони, допустимий час простою й обсяг втрат;
  • обмеження середовища: мережеві політики, приватні підмережі, вимоги аудиту, доступи до інфраструктури;
  • строки й вікно, у яке допустимо змінювати прод.

Із цим набором ми повертаємося з оцінкою та планом робіт: етапи, ризики й порядок підключення сховища без зупинки сервісів. Якщо частина даних поки невідома — розберемо на розмові й доповнимо по ходу.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142