Що таке Kubernetes і як він працює | robot_dreams
Для відстеження статусу замовлення - авторизуйтесь
Введіть код, який був надісланий на пошту Введіть код із SMS, який був надісланий на номер
 
Код дійсний протягом 2 хвилин Код з SMS дійсний протягом 2 хвилин
Ви впевнені, що хочете вийти?
Сеанс завершено
На головну
Серверний диригент: що таке Kubernetes і як він працює

Серверний диригент: що таке Kubernetes і як він працює

Гайд від robot_dreams із прикладом синтаксису

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

Але для початку розберемо базові поняття, зокрема, що таке контейнер та оркестрація і для чого застосовують Docker.

Як народилася ідея контейнера і що це таке

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

Як варіант розв'язання проблеми було вигадано технологію віртуалізації машин. Так, наприкінці дев'яностих компанія VMWare випустила інструмент під назвою VMware Virtual Platform, яка давала змогу розділити ресурси сервера на частини, які незалежно функціонують, або віртуальні машини.

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

Будова віртуальних машин

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

Компанії-хостери стали надавати послугу VDS (Virtual Dedicated Server) — «послуга віртуального виділеного сервера». Це платформа, яка надає клієнтам ресурси виділеного сервера без потреби придбання фізичного обладнання.

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

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

Проблема віртуальної машини та як її вирішує контейнер

У кожній віртуальній машині запускається ядро ​​операційної системи (наприклад, Linux чи Windows). Для окремої програми запускати своє ядро ​​операційки, з погляду споживаних ресурсів, досить невигідно. Розв'язанням цієї проблеми стала поява механізму використання контейнерів .

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

Будова контейнера

Ізоляція контейнерів забезпечується вбудованими інструментами вже наявної операційної системи. Наприклад, у Linux є namespaces та cgroups. Тому, коли не потрібні спеціальні можливості віртуалок (наприклад, запуск Windows на Linux), замість них використовують саме контейнери.

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

Робота з контейнерами в Docker

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

Образ можна встановити на сервер та на його базі запустити контейнер. Він описується одним файлом, що дуже зручно, тому що його можна записати в Git-репозиторій. Файл версіонується, всі зміни в ньому фіксуються, і можна робити збирання нових версій контейнера через систему Continuous Integration (наприклад, GitLab CI).

Docker запускається як системна служба на сервері під керуванням Windows чи Linux. Ця служба відповідає за запуск контейнера, зупинку та інше керування.

Як працює Docker

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

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

Концепція контейнерів виявилася настільки успішною, що великі компанії, як-от Google, Amazon, Microsoft та Docker, об'єдналися, щоб розробити загальний стандарт формату образів контейнерів. Це спричинило створення проєкту OCI (Open Container Initiative), який визначає стандарти для контейнерів та образів, базуючись на ідеях Docker.

Що таке оркестрація

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

Тому у великих компаніях вже до появи контейнерів існували власні системи управління інфраструктурою.

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

Kubernetes (K8s)

Команда розробників Google створила систему управління контейнерами під назвою Borg, на основі якої розробили платформу Kubernetes (K8s). Написаний мовою Go, Kubernetes (має відкритий код ) надає засоби для автоматизації процесів розгортання, масштабування та управління контейнерами, забезпечуючи більш легке та ефективне управління складними програмами.

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

Архітектура Kubernetes

Архітектура Kubernetes (K8s) розроблена з урахуванням складних вимог щодо управління контейнерами та мікросервісами. Вона будується на модульності, розширюваності та горизонтальній масштабованості. Розглянемо основні компоненти Kubernetes архітектури.

Архітектура Kubernetes

Поди (Pods)

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

Майстер-вузол

Головний контролювальний компонент кластера називається Master Node (майстер-вузол). Він відповідає за ухвалення рішень про стан кластера, з нього виконується планування та розподіл завдань, а також відбувається керування ресурсами.

Для роботи з об'єктами Kubernetes (подами, службами, реплікаціями тощо) — їх створення, зміни чи видалення — потрібна взаємодія з Kubernetes API. Її можна виконати різними способами:

  • За допомогою утиліти командного рядка kubectl. Утиліта командного рядка kubectl надає зручний спосіб взаємодії з Kubernetes API. Ви можете створювати, змінювати та видаляти об'єкти, а також отримувати інформацію про стан кластера, використовуючи команди kubectl.
  • Програмно. Ви можете використовувати клієнтські бібліотеки, що надаються Kubernetes для взаємодії з API через програмний код. Ці бібліотеки надають зручні методи для створення, читання, оновлення та видалення об'єктів Kubernetes.
  • Безпосередньо. Крім використання клієнтських бібліотек, ви також можете взаємодіяти з Kubernetes API безпосередньо, надсилаючи запити HTTP на відповідні кінцеві точки API. Це може бути актуальним, коли потрібно реалізувати більш специфічну поведінку або управління.

Kubernetes API надає RESTful-інтерфейс, що дає змогу взаємодіяти з об'єктами через HTTP-запити. Для деяких мов програмування існують офіційні клієнтські бібліотеки, які полегшують роботу з API, а також надають засоби для авторизації та аутентифікації.

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

Афінітети можуть бути двох типів:

  • node affinity (афінітети вузла);
  • pod affinity (афінітети пода).

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

Вузли (Node)

Робочі машини в кластері, на яких запускаються контейнери, називають Nodes (вузлами). Nodes виконують фактичні завдання, вони запускають та керують контейнерами, а також передають стан назад на майстер-вузол.

Кожен вузол у кластері повинен мати встановлений контейнерний двигун (Container Runtime). Коли ви запускаєте под у Kubernetes, він створює й управляє контейнерами, використовуючи контейнерний двигун на конкретному вузлі. Ось приклади популярних контейнерних двигунів, які можуть використовувати в Kubernetes:

  • Docker — один з найпопулярніших і найвикористовуваніших контейнерних двигунів. Він забезпечує середовище для запуску контейнерів та керування ними.
  • containerd — більш низькорівневий контейнерний двигун, який був спочатку розроблений як частина проєкту Docker. Він забезпечує базові функції для запуску та керування контейнерами.
  • CRI-O — окремий контейнерний двигун, високопродуктивний та легковагий, оптимізований під мінімальні вимоги під час роботи з контейнерами. Орієнтований на стандарти Container Runtime Interface (CRI).

Також на кожному вузлі є агент kubelet. Це своєрідний «сторож», який підтримує зв'язок між майстер-вузлом та вузлами, стежить за запуском подів та забезпечує їхній стан.

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

Services

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

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

Коли ви створюєте службу, Kubernetes призначає їй унікальне ім'я та віртуальну IP-адресу. Цю віртуальну адресу будуть використовувати, щоб звертатися до служби, замість знати конкретні IP-адреси контейнерів.

Служби також автоматично маршрутизують запити до контейнерів (навіть якщо вони змінюють свої IP-адреси або перезапускаються). Тому вам не потрібно турбуватися про точні IP-адреси контейнерів, ви можете звертатися до служб за їхніми іменами.

Контролери

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

  • ReplicaSet — один з базових типів контролерів. Він забезпечує бажану кількість екземплярів подів (з однаковим образом) у кластері. Якщо кількість подів знижується або збільшується, ReplicaSet автоматично коригує кількість, щоб вона відповідала заданому.
  • Deployment відповідає за управління репліками подів. Простіше кажучи, це абстракція поверх ReplicaSet, яка дає змогу керувати оновленнями застосунків. Вона гарантує можливість плавного оновлення версії програми, а також відкату до попередніх версій у разі проблем.
  • StatefulSet — це контролер для керування подами з унікальними ідентифікаторами та стабільними мережевими іменами.
  • DaemonSet гарантує, що на кожному вузлі в кластері буде працювати по одному екземпляру пода. Його часто використовують для програм, які повинні бути запущеними на кожному вузлі, наприклад, мережеві плагіни або моніторингові агенти.
  • Job и CronJob. Job забезпечує виконання певного завдання (пода) та завершує його успішно. Коли завдання успішно завершується, Job вважають виконаним. Якщо завдання завершується з помилкою, Kubernetes може автоматично перезапустити його для успішного виконання. CronJob — це планувальник, що дає змогу запускати завдання (поди) періодично, подібно до планувальника завдань в операційних системах.

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

Приклад роботи Kubernetes

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

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

  • вебінтерфейсу;
  • служби замовлень;
  • служби оплати;
  • та служби повідомлень.

Автоматизоване розгортання

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

Допомога в автоматизованому масштабуванні

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

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

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

Управління станом та відмовостійкість

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

Управління мережевою зв'язністю та балансуванням навантаження

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

Приклад синтаксису Kubernetes

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

Прикладом може бути опис пода (мінімальної одиниці розгортання Kubernetes) у YAML-файлі:

apiVersion: v1 # Вказівка ​​на версію API Kubernetes, яку використовують для опису цього об'єкта. У цьому випадку — перша версія API.
kind: Pod # Цей параметр визначає тип об'єкта, який ми хочемо створити. В цьому випадку ми створюємо об'єкт типу Pod.
Metadata:  # Початок блоку метаданих для об'єкта
  name: food-order-pod # Задаємо ім'я для об'єкта Pod, що створюється. В цьому випадку ім'я буде food-order-pod.
spec:# Блок, що визначає параметри об'єкта
  Containers:# Тут починається список контейнерів, які будуть запущені всередині Pod.
    — name: food-order-container # Мінус перед name означає початок опису нового контейнера у списку. Тут ми задаємо ім'я контейнера — food-order-container.
      image: food-order-service:latest # Вказуємо образ контейнера, який буде запущений усередині Pod. food-order-service — це ім'я образу, а latest — це тег образу, щоб використовувати останню версію.

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

Висновок

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

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

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

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

 

Ще статті
Експертки про те, як оцінюють кандидатів на нетехнічних інтерв’ю
Частина 2. Робота із записами: вставка, читання, змінення й видалення