A/B Deployment у Kubernetes: налаштування розподілу трафіку та збір метрик

Трафік між версіями розподіляється вручну, і незрозуміло, яка з них дає збій. Ми налаштовуємо A/B Deployment у Kubernetes під ключ: розділяємо потоки, збираємо метрики за кожною версією та залишаємо регламент, щоб випуск перестав бути ризиком.
Часті запитання

A/B Deployment: де ламається розподіл трафіку

Розподіл трафіку в Kubernetes налаштовується за пів години: ваги на вхідному балансувальнику, два набори подів, перемикач. Ламається A/B Deployment не на конфігу, а на тому, що дві версії сервісу живуть одночасно.

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

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

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

Третя відмова — відкат релізу вручну за дзвінком.

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

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

Що дає керований розподіл трафіку

Коли трафік розподіляється вагами на маршруті, а не перемиканням «викотити все одразу», частка нової версії стає керованим параметром.

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

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

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

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

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

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

Варіанти розподілу трафіку: порівняння підходів

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

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

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

Впровадження A/B Deployment: етапи робіт

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

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

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

Артефакти на виході: маніфести, схеми, регламенти

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

  • Конфігурації маршрутизації — маніфести з вагами версій, правилами відбору за заголовками запиту та ознаками сесії. Зміна частки трафіку — правка одного параметра, без перезбірки застосунку.

  • Політики доступу та ролі — хто змінює ваги, хто лише читає метрики, хто викочує другу версію; права видані за мінімально необхідним набором.

  • Схема потоків трафіку — від зовнішнього балансувальника до подів кожної версії, з позначеними точками зняття метрик і місцем спрацьовування правила відбору.

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

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

  • Інструкції для чергової зміни — покрокові сценарії: метрика пішла в мінус, друга версія перестала відповідати, потрібно терміново зняти експеримент.

  • Чек-ліст передачі — що ваша команда проходить разом з нашими інженерами на першому самостійному випуску.

Кейс: розподіл трафіку з метриками до і після

До: ручне перемикання та відкат за інструкцією

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

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

На релізних вікнах частка відповідей з кодом 5xx доходила до 1,8%, а причина з'ясовувалася вже після факту.

Після: порівняння варіантів на живому трафіку

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

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

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

За підсумками трьох місяців випусків: ручних операцій залишилося дві замість одинадцяти, частка помилок на проді впала до 0,2%, а 94% релізів пройшли без повернення на попередню версію — відкат перестав бути штатною частиною випуску.

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

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

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

Відкат так само швидкий, але перемикається одразу вся аудиторія, тому помилка видна всім, а відкриті з'єднання при зміні середовища рвуться.

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

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

Синьо-зелене допускає міграцію всередині вікна перемикання, але спільна база залишається, і несумісна зміна ламає одну зі сторін.

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

Синьо-зелене дає результат «все або нічого» — різна база заважає набрати статистику, і рішення ухвалюють за фактом, а не за даними.

Часті технічні сумніви перед стартом

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

Чи потрібно змінювати код застосунку?

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

Чи можна залишити спільну базу між версіями?

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

Наскільки достовірна статистика випуску?

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

Що робити з уже налаштованою маршрутизацією?

Наявні правила зберігаємо: A/B-маршрут вішаємо поверх із вищим пріоритетом і перехоплюємо лише потрібний заголовок або частку трафіку. Перед увімкненням прогоняємо пріоритети на стенді.

Чи сумісні середовища між собою?

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

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

Щоб оцінка була предметною, а не «на око», нам потрібен мінімум вихідних даних за вашим контуром. Достатньо описати словами й підтвердити доступами — далі ми зберемо схему розподілу трафіку та план впровадження під ваш релізний цикл.

  • Схема маршрутизації як є: ingress або service mesh, які правила ваг уже налаштовані, чи є канареечні релізи і як зараз розподіляється потік між версіями.
  • Цільові метрики випуску: за якими сигналами вважаємо версію вдалою — частка помилок, затримка відповіді, конверсія ключового сценарію, глибина бізнес-події.
  • Доступи до контуру: тестовий і продуктивний кластери, права на зміну маршрутів і політик, окремий контур для репетиції перемикання ваг.
  • Межі експерименту: які версії порівнюємо, чи потрібне утримання користувача в одній групі між сесіями, як поводитися з авторизованими та гостьовими сесіями.
  • Бюджет ризику: припустима частка трафіку на нову версію, умова автоматичного відкату й час, за який перемикання має відбуватися.
  • Спостережуваність: які збирачі метрик і трасування вже стоять, куди пишуться логи, чи є готові панелі та алерти за розходженням груп.
  • Обмеження середовища: режими мережі між сервісами, вимоги щодо шифрування, регламент змін у продуктиві та вікна, коли реліз допустимий.

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

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

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

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