Як з'єднати кластери Kubernetes у різних дата-центрах
Ласкаво просимо до серії коротких посібників з Kubernetes. Це регулярна колонка з найцікавішими питаннями, які ми отримуємо онлайн та на наших тренінгах. Відповідає експерт з Kubernetes.
Сьогоднішній експерт - Даніель Поленчик (Daniele Polencic). Даніель працює інструктором та розробником ПЗ у Learnk8s.
Досить часто інфраструктура реплікується та розподіляється по різних регіонах, особливо у контрольованих середовищах.
Якщо один регіон недоступний, трафік перенаправляється в інший, щоб уникнути перебоїв.
З Kubernetes можна використовувати схожу стратегію та розподіляти робочі навантаження по різних регіонах.
У вас може бути один або кілька кластерів на команду, регіон, середу або комбінацію цих елементів.
Ваші кластери можуть розміщуватися в різних хмарах та в локальному середовищі.
Але як спланувати інфраструктуру для такого географічного розкиду?
Чи потрібно створити один великий кластер на кілька хмарних середовищ по єдиній мережі?
Або завести багато маленьких кластерів та знайти спосіб контролювати та синхронізувати їх?
Один керівний кластер
Створити один кластер по єдиній мережі не так просто.
Уявіть, у вас аварія, втрачено зв'язок між сегментами кластера.
Якщо у вас один майстер-сервер, то половина ресурсів не зможуть отримувати нові команди, тому що їм не вдасться зв'язатися з майстром.
І при цьому у вас старі таблиці маршрутизації (kube-proxy не може завантажити нові) і ніяких додаткових pod'ів (kubelet не може вимагати оновлення).
Що ще гірше, якщо Kubernetes не бачить вузол, він позначає його як втрачений і розподіляє відсутні під'ї по існуючих вузлах.
У результаті pod'ів у вас вдвічі більше.
Якщо ви зробите по одному майстер-серверу на кожен регіон, будуть проблеми з алгоритмом досягнення консенсусу бази даних etcd. (прим. ред. — Насправді база даних etcd не обов'язково має перебувати на майстер-серверах. Її можна запустити в окремій групі серверів в одному регіоні. Щоправда, отримавши у своїй точку відмови кластера. Проте швидко.)
etcd використовує алгоритм raft, щоб узгодити значення, перш ніж записати його на диск.
Тобто більшість екземплярів мають досягти консенсусу, перш ніж стан можна буде записати в etcd.
Якщо затримка між екземплярами etcd різко зростає, як у випадку з трьома екземплярами etcd у різних регіонах, потрібно багато часу, щоб узгодити значення та записати його на диск.
Це відбивається і на контролерах Kubernetes.
Менеджеру контролерів потрібно більше часу, щоб дізнатися про зміну та записати відповідь до бази даних.
А якщо контролер не один, а кілька, виходить ланцюгова реакція, і весь кластер починає працювати дуже повільно.
Вперше керувати колекцією кластерів як єдиним об'єктом намагалися за допомогою інструменту kube federation.
Початок був добрим, але в результаті kube federation так і не став популярним, тому що підтримував не всі ресурси.
Він підтримував об'єднані постачання та послуги, але, наприклад, не державніпідприємства.
Натомість зміна федерації передавалася як інструкцій і відрізнялася гнучкістю.
Уявіть собі, як можна описати поділ реплік кожного кластера у федерації з допомогою одних анотацій.
Вийшов повний безлад.
SIG-cluster виконали велику роботу після kubefed v1 і вирішили підійти до проблеми з іншого боку.
Замість анотацій вони вирішили випустити контролер, який встановлюється кластерами. Його можна налаштовувати за допомогою визначень ресурсів (Custom Resource Definition, CRD).
Для кожного ресурсу, який буде входити до федерації, у вас є визначення CRD користувача з трьох розділів:
стандартне визначення ресурсу, наприклад, деплой;
розділ placement, де ви визначаєте, як ресурс розподілятиметься у федерації;
розділ override, де для конкретного ресурсу можна перевизначити вагу та параметри із placement.
Ось приклад об'єднаного постачання з розділами placement та override.
Як бачите, поставка розподілена за двома кластерами: cluster1 и cluster2.
Перший кластер поставляє три репліки, а другий вказано значення 5.
Якщо вам потрібно більше контролю над кількістю реплік, kubefed2 надає новий об'єкт ReplicaSchedulingPreference, де репліки можна розподіляти за вагою:
Варіант 2: об'єднання кластерів у стилі Booking.com
Розробники Booking.com не займалися kubefed v2, зате придумали Shipper — оператор для постачання на кількох кластерах, кількох регіонах та кількох хмарах.
Але замість того, щоб вигадувати новий спосіб взаємодії з кластером і обертати ресурси в користувацькі визначення, multi-cluster-scheduler впроваджується в стандартний життєвий цикл Kubernetes і перехоплює всі виклики, які створюють поди.
Кожен створюваний під відразу замінюється на пустушку.
Вихідний pod проходить ще через один цикл планування, де після опитування всієї федерації приймається рішення про розміщення.
Нарешті, ПД поставляється в цільовий кластер.
У результаті у вас зайвий pod, який нічого не робить, просто займає місце.
Перевага в тому, що вам не довелося писати нові ресурси для об'єднання постачання.
Кожен ресурс, що створює pod, автоматично готовий до об'єднання.
Це цікаво, адже у вас раптом з'являються постачання, розподілені кількома регіонами, а ви й не помітили. Втім, це досить ризиковано, адже тут усе тримається на магії.
Але якщо Shipper намагається, в основному, пом'якшити наслідки поставок, multi-cluster-scheduler виконує загальніші завдання і, можливо, краще підходить для пакетних завдань.
Він не має просунутого механізму поступових поставок.
Більше про multi-cluster-scheduler можна дізнатися на сторінці офіційного репозиторію.
Якщо хочете прочитати про multi-cluster-scheduler у дії, Admiralty має цікавий випадок застосування з Argo - Робочими процесами, подіями, CI та CD Kubernetes.
Інші інструменти та рішення
Поєднання кількох кластерів та управління ними – складне завдання, універсального рішення не існує.
Якщо ви хочете докладніше вивчити цю тему, ось вам кілька ресурсів:
Submariner від Rancher - Інструмент, що з'єднує оверлей-мережі різних кластерів Kubernetes.
Cilium, плагін інтерфейсу мережі контейнерів, пропонує функцію cluster meshяка дозволяє поєднувати кілька кластерів
Ось і все на сьогодні
Дякую, що дочитали до кінця!
Якщо ви знаєте, як ефективніше з'єднати кілька кластерів, розкажіть нам.
Ми додамо ваш спосіб до посилань.
Особлива подяка Крісу Несбітту-Сміту (Chris Nesbitt-Smith) та Венсану де Сме (Вінсент Де Смет) (інженеру з надійності в swatmobile.io) за те, що прочитали статтю та поділилися корисною інформацією про те, як працює федерація.