External Secrets Operator: встановлення та конфігурація в Kubernetes

Ручна видача секретів у кластері майже завжди закінчується збоєм релізу та зайвими погодженнями. Ми налаштовуємо External Secrets Operator під ключ: зв’язуємо сховище секретів із Kubernetes, описуємо доступи політиками та передаємо команді робочу схему. Ротація перестає бути ручною, а викатка йде за регламентом, а не за чиєюсь пам’яттю.
Часті запитання

External Secrets Operator: чому ручні секрети ламають реліз

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

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

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

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

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

Оновлення доїжджає до споживачів без ручних правок, і реліз перестає залежати від того, хто що встиг виправити в себе.

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

Вимірюваний ефект: викатка, відновлення, клас відмов

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

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

Перший вимірюваний зсув — час підготовки релізу. Коли External Secrets Operator сам забирає значення зі сховища й оновлює їх у кластері, крок «принеси й поклади» з процесу зникає, і реліз стартує з того самого стану, що й попередній.

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

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

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

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

Режими доставки секретів: порівняння підходів та обмежень

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

Спосіб доставки Коли підходить Обмеження
Секрети в git, зашифровані Єдиний декларативний потік, мало середовищ Ключ розшифрування поширюється окремо, попередні значення залишаються в історії
Вбудовані Secret-об’єкти кластера Один кластер, поодинокі застосунки Дрейф між середовищами, ротація вручну, немає єдиного джерела правди
Синхронізація із зовнішнього сховища (External Secrets Operator) Кілька кластерів, часта ротація Потрібні права на читання, залежність від доступності сховища, затримка синхронізації
Монтування секрету файлом Застосунок перечитує файл без перезапуску Підходить не всім застосункам, змінні середовища так не оновлюються

Видача секретів застосунку жодним із способів не скасовує рольову модель кластера: доступ усе одно обмежується на рівні простору імен та облікового запису сервісу.

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

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

Впровадження за кроками: аудит, схема, налаштування, перевірка, передача

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

  1. Аудит роботи із секретами. Інвентаризуємо, що і звідки потрапляє в кластер: значення в маніфестах і репозиторіях, змінні середовища, змонтовані файли, права на читання сховища. Результат — карта «навантаження → секрет → джерело → власник».
  2. Схема доступу до сховища. Обираємо єдине джерело істини, модель автентифікації кластера й розмежування за просторами імен, щоб команда бачила лише свої шляхи. Окремо фіксуємо, як зовнішня ротація відображається на навантаженнях.
  3. Впровадження в кластер. Ставимо External Secrets Operator в окремий простір імен, обмежуємо його права необхідним мінімумом і вмикаємо середовища по одному — спочатку стенд, потім прод.
  4. Переведення навантажень. Замінюємо звичайні секрети деклараціями й залишаємо період паралельної роботи: старий і новий способи співіснують, поки розбіжностей немає.
  5. Перевірка відмовостійкості. Імітуємо недоступність сховища, прострочений токен і ротацію значення: дивимося, чи переживають поди перезапуск і чи спрацьовують оповіщення про розсинхронізацію.
  6. Передача в експлуатацію. Віддаємо схеми, конфігурації, інструкції з типових операцій і регламент ротації, розбираємо з командою порядок дій при збої.

Що залишається в репозиторії та кластері: конфігурації й політики

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

  • Маніфести ExternalSecret і SecretStore/ClusterSecretStore — конфігурація синхронізації: які ключі тягнуться зі сховища, з якою періодичністю опитується джерело, які поля потрапляють у підсумковий Secret.
  • Схема інтеграції зі сховищем: шлях до зовнішнього секрет-сховища, спосіб автентифікації через службовий обліковий запис, відповідність «ключ у сховищі → ім’я секрету в кластері».
  • Політики доступу: що дозволено читати кожному сервісу, розподіл за просторами імен, заборона на пряме читання значень із чартів та образів.
  • Регламент ротації: строки життя значень, хто ініціює заміну, як перевіряється, що под перечитав оновлений секрет без ручного перезапуску.
  • Правила обробки збоїв: поведінка при недоступності сховища, дії при розбіжності з джерелом, які події йдуть у моніторинг та алертинг.
  • Документація щодо секретів: карта власників ключів, порядок додавання нового значення, інструкція для чергового на випадок інциденту.
  • План переходу: черговість перенесення вже працюючих секретів, відкат на попередню схему видачі, критерії, за якими вважаємо етап завершеним.

Кейс: прибрали ручну ротацію секретів у великому кластері

Що було до впровадження

Платформа — близько 180 сервісів у Kubernetes, секрети для баз, черг і зовнішніх API лежали в маніфестах і змінних середовища складальних завдань.

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

Ціна проявлялася в двох місцях. По-перше, інциденти: 5–7 відмов за квартал через прострочені ключі та розсинхрон між стендами, кожен — із нічним розбором. По-друге, релізи: викатка чекала вікна ротації, час релізу розтягувався з годин до 2–3 днів.

Що змінили

Розгорнули External Secrets Operator і описали ExternalSecret на кожне навантаження, джерело — HashiCorp Vault. Оператор сам забирає значення й перезбирає Secret при зміні у сховищі; автоматична ротація відбувається за розкладом сховища, без участі людей.

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

Що стало

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

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

External Secrets проти вбудованих секретів: у чому різниця

Вбудовані секрети — це об’єкти Secret, які лежать в etcd кластера. Значення кодується base64, доступ розмежовується ролями, а сам запис живе в одному місці: у маніфесті, Helm-чарті або в скрипті викатки.

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

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

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

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

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

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

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

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

Технічні сумніви: відмовостійкість, права, міграція

External Secrets Operator — контролер, який тримає секрети кластера синхронно із зовнішнім сховищем: змінюється значення у сховищі, змінюється об’єкт у Kubernetes.

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

Що буде, якщо сховище недоступне?

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

Під якими правами працює система?

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

Як проходить поетапна міграція?

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

Що відбувається при ротації секрету?

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

Як відновлюємося після збою?

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

Обговоримо задачу: що надіслати й як піде робота

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

  • Карта кластерів і середовищ: скільки їх, у якому контурі, яка актуальна гілка Kubernetes і хто керує ними зараз.
  • Сховища секретів: хмарний сервіс, HashiCorp Vault або власне рішення, і як секрети потрапляють у кластер сьогодні — вручну, через CI або скриптами.
  • Інвентаризація секретів: які є, до яких сервісів прив’язані й які критичні настільки, що потребують погодження з безпекою.
  • Модель доступу: service accounts, ролі, мережеві обмеження між кластером і сховищем, наявність окремого контуру для перевірок.
  • Вимоги до ротації та відмов: як часто змінюються ключі й що має відбуватися з робочим навантаженням, якщо сховище недоступне.
  • Порядок виведення: які середовища й сервіси переводимо першими, які вікна допустимі для змін.

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

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

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

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

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