Kubernetes

Kubernetes
Тип вільне та відкрите програмне забезпечення
сертифікація[1] і container orchestratord
Розробники Google[2] і Cloud Native Computing Foundationd
Перший випуск 7 червня 2014
Стабільний випуск 1.8.1 (12 жовтня 2017; 6 років тому (2017-10-12))
Операційна система Багатоплатформність
Мова програмування Go
Ліцензія Apache License, Version 2.0[d][3]
Онлайн-документація kubernetes.io/docs/
Репозиторій github.com/kubernetes/kubernetes
Вебсайт kubernetes.io

«Kubernetes» (K8s) — відкрита система автоматичного розгортання, масштабування та управління застосунками у контейнерах.[4] Розроблена компанією Google. Система підтримує ряд інструментаріїв з управління контейнерами, у тому числі Docker.

Дизайн[ред. | ред. код]

Kubernetes визначає набір будівельних блоків («примітивів»), які спільно забезпечують механізми для розгортання, підтримки та масштабування застосунків. Kubernetes слабко зв'язний[en], та розширюваний, щоб відповідати різноманітним робочим навантаженням. Розширюваність в основному забезпечується API Kubernetes, що використовується внутрішніми компонентами, а також розширеннями та контейнерами, що працюють на Kubernetes.[5]

Поди[ред. | ред. код]

Основною одиницею планувальника в Kubernetes є под (англ. pod). Він додає вищий рівень абстракції групуючи контейнеризовані компоненти. Под складається з одного чи більше контейнерів, для яких гарантується розміщення на одному хості і які можуть ділитись ресурсами.[5] Кожен под в Kubernetes в кластері має унікальну IP адресу що дозволяє застосункам використовувати порти без ризику конфлікту.[6] Под може визначати том (англ. volume), такий як локальна директорія, або мережевий диск, і надавати його контейнерам в поді.[7] Подами можна керувати вручну через API Kubernetes, або делегувати керування ними контролеру.[5]

Мітки та селектори[ред. | ред. код]

Kubernetes дозволяє клієнтам (користувачам, чи власним компонентам) додавати до будь-якого об'єкту API такого як ноди чи вузли (англ. nodes) пари ключ-значення, які називаються «мітками» (англ. labels). Відповідно, «селектори міток» (англ. label selectors) — це запити щодо цих міток, які дають відповідні об'єкти.[5]

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

Наприклад, якщо поди мають мітку tier (з такими значеннями як front-end, back-end) та release_track (зі значеннями на зразок staging, production), тоді операція зі всіма нодами back-end і staging може використовувати селектор на зразок:[9]

tier=back-end AND release_track=staging

Контролери[ред. | ред. код]

Контролер — це цикл узгодження, який приводить поточний стан кластера до бажаного.[10] Це здійснюється за допомогою керування набором подів. Одним з різновидів контролерів є контролер реплікації (англ. replication controller), який завідує реплікацією та масштабуванням запускаючи задане число копій пода в кластері. Також він займається створенням подів на заміну тих які впали.[10] Іншими контролерами які входять до ядра системи Kubernetes, є «DaemonSet Controller» для запуску рівно одного пода на кожній машині (чи підмножині машин), і «Job Controller» для запуску подів які працюють до логічного завершення, наприклад як частина пакетної задачі.[11] Набір подів якими керує контролер визначається селектором міток в описі контролера.[9]

Архітектура[ред. | ред. код]

Діаграма архітектури Kubernetes

Kubernetes дотримується архітектури master/slave. Його компоненти можна розділити на ті що керують окремим вузлом[en], і ті які є частиною control plane.[5][12]

Kubernetes control plane (master)[ред. | ред. код]

Kubernetes Master — це основний модуль контролю кластера, який керує навантаженням та комунікаціями у системі. Kubernetes control plane складається з різних компонентів, кожен з яких є окремим процесом, які можуть запускатись як на одному так і на багатьох вузлах, підтримуючи кластер високої доступності.[12] Цими компонентами є:

etcd[ред. | ред. код]

etcd — персистентне, легковагове, розподілене, сховище даних ключ-значення, розроблене в CoreOS яке надійно зберігає дані про конфігурацію кластера, і опис його стану в кожен конкретний момент часу. Інші компоненти стежать за змінами в цьому сховищі щоб привести себе до бажаного стану.[12]

Сервер API[ред. | ред. код]

Сервер API надає API Kubernetes використовуючи JSON через HTTP, яке дає як внутрішній так і зовнішній інтерфейс до Kubernetes.[5][13] Сервер API обробляє і валідує REST запити і оновлює стан об'єктів в etcd, таким чином дозволяючи клієнтам налаштовувати задачі і контейнери на різних робочих вузлах.[14]

Планувальник (англ. Scheduler)[ред. | ред. код]

Планувальник це під'єднуваний компонент, який вибирає на якому вузлі буде виконуватись под (основна сутність якою керує планувальник), покладаючись на доступність ресурсів. Планувальник відслідковує використання ресурсів на кожному вузлі, щоб переконатися що навантаження не надмірне для доступних ресурсів. Для цього, планувальнику треба знати потреби в ресурсах, доступність ресурсів, та інші обмеження і директиви політик які надає користувач, такі як quality-of-service, вимоги афінності/анти-афінності, локальність даних і т. д. По суті, роллю планувальника є звести «пропозицію» ресурсів з «попитом» навантаження.[15]

Менеджер контролерів (англ. Controller manager)[ред. | ред. код]

Менеджер контролерів — це процес який керує вбудованими котролерами Kubernetes такими як DaemonSet Controller та Replication Controller. Контролери спілкуються з сервером API щоб створювати, оновлювати і видаляти ресурси якими вони керують (поди, сервіси і т. д.).[13]

Вузол Kubernetes (slave)[ред. | ред. код]

Вузол (англ. The Node), також може називатись робітником або посіпакою (англ. Worker, Minion) — це машини, на яких розгортаються контейнери (робочі навантаження (англ. workloads)). Кожен вузол кластера має містити систему виконання[en] таку як Docker, і компоненти перелічені нижче.

Kubelet[ред. | ред. код]

Kubelet відповідальний за робочий стан вузла, і він забезпечує «здоровий» стан всіх контейнерів на вузлі. Він займається запуском, зупинкою та підтримкою контейнерів застосунків об'єднаних в поди.[5][16]

Kubelet спостерігає за станом пода, і якщо стан незадовільний, под перерозгортається на той самий вузол. Статус вузла повідомляється master вузлу кожні кілька секунд. Як тільки master виявляє несправність вузла, Replication Controller запускає поди на робочому вузлі.[джерело?]

Контейнер[ред. | ред. код]

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

Kube-proxy[ред. | ред. код]

Kube-proxy — це реалізація мережевого проксі та балансера навантаження, яка підтримує абстракцію сервісу та інші мережеві операції.[5] Відповідає за маршрутизацію трафіка до відповідного контейнера на основі IP та номера порту вхідного запиту.

cAdvisor[ред. | ред. код]

cAdvisor — це агент спостереження, він також збирає дані про використання ресурсів та метрики продуктивності, такі як використання процесора, пам'яті, файлової системи та мережі контейнерами на кожному вузлі.


Локальна розробка[ред. | ред. код]

Існують реалізації Kubernetes кластера, які можна запускати на одній робочій станції, призначені для локальної розробки і тестування: minikube[17] та microk8s[18].

Історія[ред. | ред. код]

Доповідь про Google Container Engine на Google Cloud Summit

Kubernetes (грец. κυβερνήτης, «керівник», «стерновий» чи «капітан»)[19] був створений Джо Біда (англ. Joe Beda), Бренданом Бернсом (англ. Brendan Burns) та Крейгом МакЛаккі (англ. Craig McLuckie),[20] до яких незабаром приєднались інші інженери Google, серед них Браян Грант (англ. Brian Grant) та (англ. Tim Hockin). Вперше він був анонсований Google в середині 2014.[21] На розробку і проектування системи сильно вплинула система Google Borg,[22][23] і багато хто з активних учасників проекту до того займались системою Borg. Початково мав робочу назву Project Seven, на честь персонажа Star Trek Seven of Nine[en], яка є «дружнішим» Борґом.[24] Початково проект Borg було написано на C++[22], але Kubernetes переписаний на Go.

Kubernetes v1.0 випущений 21 липня, 2015.[25] Одночасно з випуском першої Kubernetes v1.0, Google став партнером Linux Foundation сформувавши Cloud Native Computing Foundation (CNCF)[26]. 6 березня 2018, проект Kubernetes зайняв дев'яте місце за кількістю комітів на GitHub, та друге місце за кількістю авторів і відкритих задач, поступившись місцем лише ядру Linux.[27]

Джерела[ред. | ред. код]

  1. а б https://kanger.dev/certification/kcna-kubernetes-and-cloud-native-associate
  2. http://kubernetes.io/
  3. https://github.com/kubernetes/kubernetes/blob/master/LICENSE
  4. What is Kubernetes?. Kubernetes. Архів оригіналу за 30 травня 2019. Процитовано 31 березня 2017.
  5. а б в г д е ж и An Introduction to Kubernetes. DigitalOcean. Архів оригіналу за 5 липня 2018. Процитовано 24 вересня 2015.
  6. Langemak, Jon (11 лютого 2015). Kubernetes 101 – Networking. Das Blinken Lichten. Архів оригіналу за 25 жовтня 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  7. Strachan, James (21 травня 2015). Kubernetes for Developers. Medium. Архів оригіналу за 7 вересня 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  8. Surana, Ramit (16 вересня 2015). Containerizing Docker on Kubernetes. LinkedIn. Процитовано 2 листопада 2015.
  9. а б Intro: Docker and Kubernetes training - Day 2. Red Hat. 20 жовтня 2015. Архів оригіналу за 29 жовтня 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  10. а б Overview of a Replication Controller. Documentation. CoreOS. Архів оригіналу за 22 вересня 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  11. Sanders, Jake (2 жовтня 2015). Kubernetes: Exciting Experimental Features. Livewyer. Архів оригіналу за 20 жовтня 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  12. а б в Kubernetes Infrastructure. OpenShift Community Documentation. OpenShift. Архів оригіналу за 6 July 2015. Процитовано 24 вересня 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  13. а б Marhubi, Kamal (26 вересня 2015). Kubernetes from the ground up: API server. kamalmarhubi.com. Архів оригіналу за 29 жовтня 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  14. Ellingwood, Justin (2 травня 2018). An Introduction to Kubernetes. DigitalOcean (англ.). Архів оригіналу (html) за 5 липня 2018. Процитовано 20 липня 2018. One of the most important master services is an API server. This is the main management point of the entire cluster as it allows a user to configure Kubernetes' workloads and organizational units. It is also responsible for making sure that the etcd store and the service details of deployed containers are in agreement. It acts as the bridge between various components to maintain cluster health and disseminate information and commands.
  15. The Three Pillars of Kubernetes Container Orchestration - Rancher Labs. rancher.com. 18 травня 2017. Архів оригіналу за 24 June 2017. Процитовано 22 травня 2017. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  16. Marhubi, Kamal (27 серпня 2015). What [..] is a Kubelet?. kamalmarhubi.com. Архів оригіналу за 13 листопада 2015. Процитовано 2 листопада 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  17. Архівована копія. Архів оригіналу за 4 квітня 2019. Процитовано 29 березня 2019.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  18. Архівована копія. Архів оригіналу за 29 березня 2019. Процитовано 29 березня 2019.{{cite web}}: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання)
  19. What is Kubernetes?. Kubernetes. Архів оригіналу за 30 травня 2019. Процитовано 31 березня 2017.
  20. Google Made Its Secret Blueprint Public to Boost Its Cloud (амер.). Архів оригіналу за 1 липня 2016. Процитовано 27 червня 2016. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  21. Google Open Sources Its Secret Weapon in Cloud Computing. Wired. Архів оригіналу за 10 September 2015. Процитовано 24 вересня 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  22. а б Abhishek Verma; Luis Pedrosa; Madhukar R. Korupolu; David Oppenheimer; Eric Tune; John Wilkes (April 21–24, 2015). Large-scale cluster management at Google with Borg. Proceedings of the European Conference on Computer Systems (EuroSys). Архів оригіналу за 27 липня 2017. {{cite journal}}: Cite має пустий невідомий параметр: |df= (довідка)
  23. Borg, Omega, and Kubernetes - ACM Queue. queue.acm.org. Архів оригіналу за 9 липня 2016. Процитовано 27 червня 2016. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  24. Early Stage Startup Heptio Aims to Make Kubernetes Friendly. Процитовано 6 грудня 2016.{{cite news}}: Обслуговування CS1: Сторінки з параметром url-status, але без параметра archive-url (посилання)
  25. As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation. TechCrunch. Архів оригіналу за 23 September 2015. Процитовано 24 вересня 2015. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  26. Cloud Native Computing Foundation. Архів оригіналу за 3 липня 2017. {{cite web}}: Cite має пустий невідомий параметр: |df= (довідка)
  27. Conway, Sarah. Kubernetes Is First CNCF Project To Graduate. Cloud Native Computing Foundation (англ.). Архів оригіналу (html) за 29 жовтня 2018. Процитовано 3 грудня 2018. Compared to the 1.5 million projects on GitHub, Kubernetes is No. 9 for commits and No. 2 for authors/issues, second only to Linux.

Посилання[ред. | ред. код]