Зонди готовності та життєздатності Kubernetes - найкращі практики

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

Зонди готовності та життєдіяльності можна загалом викликати в контексті Kubernetes. Контейнерні зонди - це невеликі процеси, які проходять періодично. Результат цих зондів (Успіх, Невдача чи Невідомий) визначає Kubernetes перспективу стану контейнера. Виходячи з них, Kubernetes вирішує, як поводитися з кожним контейнером, щоб зберегти стійкість, високу доступність і більш високий час роботи.

Перевірки здоров'я - це вимога для будь-якої розподіленої системи!

Перевірки здоров'я Kubernetes:

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

  • /.well-known/live - для живого зонда HTTP
  • /.well-known/ready - для зонда, готового до HTTP

У кількох словах зондування HTTP означає, що Kubernetes виконує через певні проміжки часу запити HTTP Get на /.well-known/live та /.well- unknown/ready. Код статусу відповіді використовується для того, щоб визначити, що потрібно робити з стручком. Якщо код статусу знаходиться в інтервалі [200, 300), тоді все нормально. Інакше:

  • якщо код статусу для живого зонда 4xx або 5xx, струк перезапускається
  • якщо код стану для готового зонда 4xx або 5xx, тоді струк позначається як нездоровий, і трафік HTTP більше не буде перенаправлятися на нього для підвищення надійності та безперервного часу.
Якщо контейнери не залежать від будь-яких служб резервного копіювання, контейнери можуть перевіряти життєздатність та готовність на одному і тому ж оброблювальному пристрої, і наступне не застосовується.

Разом з товаришами по команді від Metro Systems Romania - Команда з надійності сайту ми визначили список найкращих практик для перевірок здоров’я та порадили розробникам додатків дотримуватися їх. Такі найкращі практики:

  1. Живі та готові обробники повинні бути незалежними функціями!

Як вже було сказано раніше, для кожного продукту, розгорнутого в контексті Kubernetes, слід реалізувати 2 обробники, які відповідають на HTTP-дзвінки на "живий" та "готовий". Перша найкраща практика щодо цих зондів полягає в тому, що кожен обробник повинен виконувати власну функцію.

2. Не розв'язуйте логіку "живого" / "готового" від вашої заявки!

Це стосується програм для обробки роботи. Для Kubernetes важливо знати, працює програма чи обробка працює. Якщо логіка для live / ready була відокремлена в новому процесі, результат не є переконливим.

3. Не застосовуйте жодної логіки щодо "живого" обробника. Потрібно повернути статус 200, якщо основний потік працює, а 5xx - якщо ні.

Цей зонд дозволяє Kubernetes знати, чи програма жива чи мертва. Рішення приймається шляхом перевірки коду статусу на /.well-known/live, і якщо заяву оголошено мертвою, Kubernetes перезапускає стручок. З точки зору надійності, відповідь на живий зонд повинен бути правдивим, якщо основний потік програми запущений, а в іншому випадку помилковий.

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

4. Введіть логіку в «готовий» обробник, щоб запропонувати повну відповідь про готовність програми.

Готовий зонд дозволяє Kubernetes знати, чи струк готовий приймати HTTP-трафік. Як розробник, важливо реалізувати тут деяку логіку, щоб перевірити наявність усіх ваших резервних залежностей для програми. Коли реалізований "готовий" обробник, дуже важливо чітко знати, що готовий насправді означає для вашої програми. Іншими словами, на "готовому" обробці важливо виконати всі кроки, які визначають, що програма готова приймати та обробляти https-запити. Наприклад, якщо програмі необхідно встановити з'єднання з базою даних, щоб бути готовим обробляти HTTP-запити, на зонді готовності важливо перевірити, чи встановлено підключення до бази даних та готове до використання.

Розглянемо конкретний випадок: програма застрягає, обробляючи окрему нитку, але головна нитка працює добре. Як розробник, ви знаєте, що перезапуск стручка вирішить проблему, і ви можете переконати Kubernetes в автоматичному виконанні для вас. Все, що вам потрібно зробити, - це переконатися, що програма відповість 5xx на готовому зонді та змусить живий зонд повернути мінімальну кількість 5xx відповідей на дзвінки Kubernetes. У цьому випадку Kubernetes перезапустить стручок, оскільки він вважається мертвим.

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

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

Висновки:

Зонди Live and Ready - це серце і душа програм, розгорнутих у Kubernetes. Вони є стандартними способами спілкування з гіпервізором та розмови про їх стан та проблеми. Живі та готові зонди - це потужна зброя, яка потрібна розробнику та додатку для того, щоб переконатися в надійності та стійкості програми.

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