Service Mesh на базі Istio: встановлення та налаштування в Kubernetes

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

Istio в Kubernetes: де розпадається зв'язність сервісів

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

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

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

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

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

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

Повтори невдалих запитів, які застосунок робить «про всяк випадок», подвоюють навантаження на вже перевантажений вузол.

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

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

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

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

Що дає сервісна сітка: вимірювані ефекти

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

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

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

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

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

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

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

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

Режими розгортання Istio в Kubernetes

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

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

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

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

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

Етапи впровадження сервісної сітки в кластер

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

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

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

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

Конфігурації та регламенти: що залишається в команди

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

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

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

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

Кейс: прибрали каскадні відмови між сервісами

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

Платформа з кількох десятків сервісів на Kubernetes, пов'язаних прямими викликами, а повтори запитів і тайм-аути — в коді кожного сервісу окремо. Коли один починав відповідати повільно, повтори множили навантаження, і за пару хвилин лягали сусідні сервіси, хоча самі не падали.

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

Що змінили

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

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

Що стало

Частка невдалих викликів знизилася з 4,7% до 0,3%: поодинокі збої гасяться на проксі й не доходять до користувача. Збій локалізується за секунди — видно, який сервіс і який маршрут деградував, замість розбору логів по всьому ланцюжку.

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

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

Чим сітка відрізняється від бібліотеки всередині застосунку?

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

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

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

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

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

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

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

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

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

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

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

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

Наскільки зросте затримка між сервісами?

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

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

Чи можна вмикати поетапно й відкотитися?

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

Хто оновлює сертифікати?

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

Що залишається нам після передачі?

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

Обговорімо завдання і повернімося з оцінкою та планом

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

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

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

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

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

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

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