Kubernetes

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Kubernetes
Kubernetes (container engine).png
Тип Управление конфигурацией, системное администрирование
Разработчик Первоначальный Google в настоящее время Cloud Native Computing Foundation
Написана на Go
Операционная система Linux
Первый выпуск 7 июня 2014
Последняя версия
Состояние Актуальное
Лицензия Apache License 2.0
Сайт kubernetes.io

Kubernetes (часто так же используется обозначение «K8s»[2], название образовано от греческого κυβερνήτης, — «кормчий», «рулевой»[2], по-русски — Кубернетес или Кубернетис) — открытое программное обеспечение для автоматизации развёртывания, масштабирования и управления контейнеризированными приложениями[3]. Оригинальная версия была разработана компанией Google. Впоследствии Kubernetes был передан под управление Cloud Native Computing Foundation. Предназначение Kubernetes — предоставить «платформу для автоматического развёртывания, масштабирования, управления приложениями на кластерах или отдельных хостах».[4] Кубернетис поддерживает различные технологии контейнеризации, включая Docker, VMWare и ряд других.[5]

Kubernetes используется фондом Wikimedia Foundation, инфраструктура которого мигрировала на это приложение с самостоятельно разработанного ПО для организации кластеров[6].

История[править | править код]

Google Container Engine talk at Google Cloud Summit

Kubernetes начала разрабатываться программистами компании Google Joe Beda, Brendan Burns и Craig McLuckie,[7], к которым, в дальнейшем присоединились их коллеги Brian Grant и Tim Hockin. Впервые он был анонсирован Google в середине 2014 года.[8] На разработку и внутреннюю идеологию Kubernetes серьёзно повлиял другой продукт Google, оставшийся внутренней разработкой — система управления кластерами Google Borg, [9][10] над которым ранее работали многие из наиболее важных разработчиков Kubernetes.

Оригинальное наименование проекта — Project Seven, отсылка к героине сериала Star Trek, возвращённой в индивидуальное и дружественное к людям состояние из статуса члена нечеловеческого роевого кибернетического разума Коллектива Боргов.[11] Семь ручек на штурвале логотипа проекта — аллюзия на этот художественный образ.

Kubernetes v1.0 был выпущен в 21 июля 2015 года.[12] После выпуска этой версии Google, в партнёрстве с Linux Foundation, организовал специальный фонд Cloud Native Computing Foundation (CNCF)[13], которому передал Kubernetes в качестве начального технологического вклада в деятельность CNCF.

Концепции и внутреннее устройство[править | править код]

Как и многие другие сложные продукты, Kubernetes в рамках своей экосистемы определяет ряд специфических для этой экосистемы понятий и концепций. Ниже перечислены наиболее важные:

Ноды (узлы)[править | править код]

Нода (узел, node) — это отдельная физическая или виртуальная машина, на которой развёрнуты и выполняются контейнеры приложений. Каждый узел в кластере Kubernetes содержит сервисы для запуска приложений в контейнерах (например Docker), а так же компоненты, предназначенные для централизованного управления нодой.

Поды[править | править код]

Базовая единица для управления и запуска приложений в Kubernetes называется «под» (англ."pod"). Под — это один или несколько контейнеров, которым гарантирован запуск на одном узле (то есть на одной физической или виртуальной машине), обеспечивается разделение ресурсов[14] и предоставляется уникальный в пределах кластера IP-адрес[15]. Последнее позволяет приложениям, развёрнутым на поде, использовать фиксированные и предопределённые номера портов без риска конфликта. Для совместного использования из контейнеров, развёрнутых в пределах под может быть определён — том (volume), представляющий из себя каталог на локальном диске или сетевой диск[16].

Поды могут напрямую управляться с использованием API Kubernetes или управление ими может быть передано контроллеру.[14]

Разделы[править | править код]

Раздел (Volume) — это каталог или сетевой диск, возможно, с данными в нём, который доступен контейнерам пода.

Метки и селекторы[править | править код]

Kubernetes обеспечивает работу простого хранилища пар ключ-значение (key-value). Этот механизм, называемый метки («labels») может быть использован для маркировки любого объекта API Kubernetes, например, пода или ноды. Селекторы меток («label selectors») — это запросы, которые позволяют получить ссылку на объекты, соответствующие какой-то из меток.[14]

Метки и селекторы — это главный механизм Kubernetes, который позволяет выбрать, какой из объектов следует использовать для запрашиваемой операции.[17]

Сервисы[править | править код]

Сервисом в Kubernetes называют совокупность логически связанных наборов pod и политик доступа к ним[18]. Например, сервис может соответствовать одному из уровней программного обеспечения, разработанного в соответствии с принципами многоуровневой архитектуры ПО. Набор подов, соответствующий сервису, получается в результате выполнения селектора соответствующей метки[14]

Kubernetes обеспечивает функционал обнаружения сервисов, и маршрутизации по запросу. Он умеет переназначать необходимые для обращения к сервису IP-адрес и доменное имя сервиса различным подам, входящим в его состав. При этом обеспечивается балансировка нагрузки между подами, чьи метки соответствуют сервису в стиле Round robin DNS, а так же корректная работа в том случае, если один из узлов кластера вышел из строя и размещённые на нём поды автоматически переместились на другой.[15] По умолчанию сервис доступен внутри управляемого Kubernetes кластера, например поды бэкенда группируются для обеспечения балансировки нагрузки и в таком виде предоставляются фронтенду, но он может быть настроен и для того, чтобы предоставлять доступ к входящим в его состав подам извне, как к единому фронтенду.[19]

Контроллеры[править | править код]

Контроллер — это процесс, который управляет состоянием кластера, пытаясь привести его от фактического к желаемому.[20] Он делает это, оперируя набором подов, который, определяется с помощью селекторов меток, являющихся частью определения контроллера.[21] Выполнение контроллеров обеспечивается компонентом Kubernetes Controller Manager.

Один из типов контроллеров, самый известный — это «Контроллер репликации» («Replication Controller»), который обеспечивает масштабирование, запустив указанное количество копий пода в кластере. Он также обеспечивает запуск новых инстансов пода, в том случае если узел, на который работает управляемый этим контроллером под, выходит из строя..[20]

Другие контроллеры, входящие в основную систему Kubernetes, включают в себя «DaemonSet Controller», который обеспечивает запуск пода на каждой машине (или подмножеством машин) и «Job Controller» для запуска подов, которые выполняются до завершения, например, как часть пакетного задания.[22]

Операторы[править | править код]

Операторы (Operators) — специализированный вид программного обеспечения Kubernetes, предназначенный для включения stateful (то есть сохраняющих своё состояние между выполнениями, таких как СУБД, системы мониторинга или кэширования) сервисов в инфраструктуру, создаваемую при помощи Kubernetes[23],[24].

Назначение операторов — предоставить возможность управления stateful-приложениями в кластере Kubernetes прозрачным для Kubernetes способом и скрыть подробности их настроек от основного процесса управления кластером Kubernetes.

Архитектура и компоненты[править | править код]

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

Kubernetes реализует архитектуру master/slave. Компоненты Kubernetes могут быть разделены на те, которые осуществляют управление индивидуальными нодами, и входящие в состав подсистемы управления Kubernetes.[14][25]

Подсистема управления Kubernetes[править | править код]

Подсистема управления Kubernetes состоит из набора компонент, каждый из которых может выполняться или на одной мастер-ноде или на множестве параллельно работающих мастер-нод, совместно обеспечивающих режим высокой доступности.[25] Подсистема обеспечивает управление распределением нагрузки и коммуникациями внутри кластера и состоит из следующих приложений:

etcd[править | править код]

Один из компонент Kubernetes — etcd — легкий распределённый движок хранилища key-value, разработанный CoreOS. Etcd не позиционируется как полноценная СУБД, а предназначен для хранения конфигурационных данных приложений кластера, представляя из себя функциональный эквивалент каталога /etc UNIX.

Сервер API[править | править код]

Сервер API Kubernetes — ключевой компонент системы. Он предоставляет JSON REST API, использующий HTTP в качестве транспорта. Этот API используется для организации внешнего и внутреннего доступа к функциям Kubernetes.[14][26] Сервер API обновляет состояние объектов, хранящееся в etcd, позволяя своим клиентам управлять распределением контейнеров и нагрузки между нодами управляемой системы.

Планировщик[править | править код]

Планировщик (Scheduller) — это компонент системы (один из контроллеров[27]), который выбирает, на какой ноде должен выполняться какой под, опираясь на критерии доступности ресурсов. Планировщик отслеживает использование ресурсов на каждом из узлов, обеспечивая распределение нагрузки так, чтобы она не превышала доступный объём ресурсов. Для этой цели планировщик должен обладать информацией о доступных на каждом из узлов ресурсах, требованиях к ним со стороны управляемых подов, а так же различных дополнительных пользовательских ограничениях и политиках, таких как QoS, требования affinity/anti-affinity выполняемых процессов, физической локализации данных и т. д.. Подводя итог, роль планировщика — находить и предоставлять ресурсы в зависимости от запросов, возникающих в связи с загрузкой.[28]

Controller manager[править | править код]

Сontroller manager — процесс, выполняющий основные контроллеры Kubernetes, такие как DaemonSet Controller и Replication Controller run in. Контроллеры взаимодействуют с сервером API Kubernetes, создавая, обновляя и удаляя управляемые ими ресурсы (поды, точки входа в сервисы, и т. д.)[26]

Kubectl[править | править код]

Kubectl — интерфейс командной строки Kubernetes, наряду с API обеспечивающий управление ресурсами, подконтрольными Kubernetes.[18],[29]

Нода (узел) Kubernetes[править | править код]

Процедура работы Kubernetes состоит в том, что ресурсы нод Kubernetes динамически распределяются между выполняемыми на них подами. Как уже было сказано выше, каждый узел в кластере Kubernetes содержит нижеперечисленные типовые компоненты:

Сервис для запуска контейнеров[править | править код]

В зависимости от типа используемого контейнерного движка, узел Kubernetes содержит сервис для запуска контейнеров соответствующего вида . С точки зрения программной среды Kubernetes контейнеры инкапсулируются в подах. Сами контейнеры являются наиболее низкоуровневыми программными компонентами, с которыми взаимодействует ПО Kubernetes. Они, в свою очередь, содержат выполняемые приложения, библиотеки и иные необходимые для работы этих приложений ресурсы. Для внешнего мира контейнеры доступны через назначаемый каждому из контейнеров IP-адрес.

Kubelet[править | править код]

Kubelet отвечает за статус выполнения подов на ноде, что включает в себя отслеживание того, что каждый из контейнеров корректно выполняется, находясь в рабочем состоянии. Kubelet обеспечивает запуск, останов и управление контейнерами приложений, организованными в поды. Функционально Kubelet можно рассматривать как аналог supervisord.[14][30]

Kubelet мониторит состояние подов и, в случае, если обнаруживает, что какой-то из подов находится в неверном состоянии, пытается осуществить его повторное развёртывание (деплой) и перезапуск на узле. Статус самой ноды отправляется на мастер-ноду Kubernetes каждые несколько секунд в диагностических сообщениях (heartbeat messages). Если мастер-нода, исходя из содержания этих сообщений или их пропадания, обнаруживает, что конкретный узел не работает должным образом, процесс Replication Controller, выполняемый на мастер-ноде, пытается перезапустить необходимые поды на другом узле, находящемся в рабочем состоянии.

Kube-proxy[править | править код]

Kube-proxy — это компонент, являющийся комбинацией сетевого прокси-сервера и балансировщика нагрузки. Реализованные в нём операции сетевого уровня используют абстракцию сервиса.[14] Он отвечает за маршрутизацию входящего трафика на конкретные контейнеры, работающие в пределах пода, расположенного на ноде. Маршрутизация обеспечивается на основе IP-адреса и порта входящего запроса.

cAdvisor[править | править код]

cAdvisor — агент системы внутреннего мониторинга Kubernetes, собирающий метрики производительности и информацию об использовании контейнерами, работающими в пределах ноды, таких ресурсов как время работы центрального процессора, оперативной памяти, нагрузку на файловую и сетевую системы.

Kubernetes, разработка и развёртывание программного обеспечения[править | править код]

Kubernetes предоставляет ряд средств, которые облегчают разработку и развёртывание программного обеспечения, работающего под управлением этой системы. Среди них можно назвать:

  • Minicube - специализированную конфигурацию Kubernetes, предназначенную для развёртывания на локальной машине . Minicube применяется для изучения и локальных экспериментов над Kubernetes.[31]
  • Helm и Tiller - официальный менеджер пакетов Kubernetes. Является функциональным эквивалентом apt-get и yum для Kubernetes.[32] Tiller выполняется на стороне сервера, Helm является клиентом Tiller[32].
  • Monocular - веб-интерфейс для управления упакованными в соответствии со стандартами Helm пакетами.

Однако эти инструменты не являются безальтернативными. Например, в качестве прямой замены Helm можно рассматривать разработанную компанией HashiCorp систему обеспечения развёртывания инфраструктуры приложений Terraform.[33] Такое использование стало возможным после того, как HashiCorp реализовала в Terraform режим работы в качестве провайдера Kubernetes.

Противоположный принятому разработчиками Helm и Terraform подход подразумевает перемещение файлов ресурсов Kubernetes в репозиторий, например в git и дальнейшую работу с ними как с разновидностью специфического кода. Такой способ работы с приложениями Kubernetes предлагает проект kubecfg.

Kubernetes и платформы управления облаками и контейнерами[править | править код]

Многие из поставщиков систем управления контейнерами поддержали Kubernetes, реализовав его поддержку в своих продуктах. Часть из них, так же, приняла участие в деятельности CNCF. Rancher Labs включила Kubernetes в дистрибутив своей системы управления контейнерами Rancher container management platform.[34] Компания Pivotal Software использовала Kubernetes в своём продукте Pivotal Container Service (PKS)[35], Red Hat — в составе системы OpenShift,[36][37], являющейся, по сути, расширенной версией Kubernetes. CoreOS включила его в состав коммерческой версии дистрибутива Container Linux Tectonic, а IBM использовала его в IBM Cloud Container Service[38][39] и в IBM Cloud Private product.[40][41][42] Компания Oracle присоединилась к Cloud Native Computing Foundation в сентябре 2017 и включила Kubernetes в состав Oracle Cloud и Oracle Linux.[43]

В настоящее время большинство широкоиспользуемых облачных платформ и сервисов контейнеризации в том или ином виде используют Kubernetes, постепенно становящийся стандартом де-факто. Kubernetes можно рассматривать как PaaS (Platform as a service), предоставляющую более высокий уровень абстракции чем традиционные платформы управления облаками[44].

Docker[править | править код]

Наряду со встроенным в сам Docker инструментом оркестрации Docker Swarm, Kubernetes входит в число наиболее часто используемых для оркестрации контейнеризированных при помощи Docker приложений.[45]

По сравнению с Docker Swarm, Kubernetes функционально богаче,[46] но обладает более высоким порогом вхождения в технологию.[47]

При переходе от Docker Swarm к Kubernetes необходимо использовать приложение Kompose для конвертации созданных в Docker Compose файлов описаний оркестрации в формат, поддерживаемый Kubernetes.[48]

OpenShift[править | править код]

OpenShift - зонтичный бренд, под которым компания Red Hat распространяет специализированный дистрибутив Kubernetes OpenShift Origin, а так же предоставляет активно использующие Kubernetes сервисы.

OpenStack[править | править код]

Сообщество OpenStack вскоре после публичного выхода первых версий Kubernetes предприняло активные усилия для интеграции двух проектов. В частности уже 19 мая 2015 года, до официального релиза версии 1.0, Kubernetes был включён в поддерживавшийся в то время каталог приложений Community OpenStack[49]. Представители сообщества OpenStack публично заявили, что, имея ввиду частичное перекрытие функциональности обоих проектов, они не хотели бы дублирования усилий, а предпочли бы идти по пути интеграции обоих технических решений.[50]

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

  • Stackanetes - инструмент, который позволяет осуществить развертывание и эксплуатацию стандартных сервисов OpenStack под управлением Kubernetes;
  • Kuryr - проект, позволяющий интегрировать контейнеры Kubernetes в сеть OpenStack Neutron;[51]

и ряд других, в частности, несколько различных вариантов интеграции Kubernetes в систему оркестрации OpenStack Heat.

VMWare[править | править код]

Kubernetes обеспечивает работу подов с использованием Pivotal Container Service компании VMWare.[52]

Облачные сервисы[править | править код]

AWS EC2[править | править код]

Microsoft Azure[править | править код]

Google Cloud Platform[править | править код]

Mail.Ru Cloud Solutions (MCS)[править | править код]

Сервисы OpenShift[править | править код]

Ссылки[править | править код]

Примечания[править | править код]

  1. Release 1.11.2 — 2018.
  2. 1 2 What is Kubernetes (K8s)?. Dialogic Glossary of Telecom Terms. Архивировано 11 октября 2017 года.
  3. kubernetes/kubernetes (англ.). GitHub. Архивировано 21 апреля 2017 года.
  4. What is Kubernetes?. Kubernetes. Архивировано 1 апреля 2017 года.
  5. Расширение Kubevirt обеспечивает для возможность запуска подов не на основе Docker, а на основе любых виртуальных машин, поддерживаемых libvirt.
  6. Раздел Case Studies на официальном сайте Kubernetes
  7. Google Made Its Secret Blueprint Public to Boost Its Cloud (англ.). Архивировано 1 июля 2016 года.
  8. Google Open Sources Its Secret Weapon in Cloud Computing. Wired. Проверено 24 сентября 2015. Архивировано 10 сентября 2015 года.
  9. (April 21–24, 2015) «Large-scale cluster management at Google with Borg». Proceedings of the European Conference on Computer Systems (EuroSys).
  10. Borg, Omega, and Kubernetes - ACM Queue. queue.acm.org. Архивировано 9 июля 2016 года.
  11. Early Stage Startup Heptio Aims to Make Kubernetes Friendly.
  12. As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation. TechCrunch. Проверено 24 сентября 2015. Архивировано 23 сентября 2015 года.
  13. Cloud Native Computing Foundation. Архивировано 3 июля 2017 года.
  14. 1 2 3 4 5 6 7 8 An Introduction to Kubernetes. DigitalOcean. Проверено 24 сентября 2015. Архивировано 1 октября 2015 года.
  15. 1 2 Langemak, Jon Kubernetes 101 – Networking. Das Blinken Lichten (11 февраля 2015). Проверено 2 ноября 2015. Архивировано 25 октября 2015 года.
  16. Strachan, James Kubernetes for Developers. Medium (21 мая 2015). Проверено 2 ноября 2015. Архивировано 7 сентября 2015 года.
  17. Surana, Ramit. Containerizing Docker on Kubernetes, LinkedIn (16 сентября 2015). Проверено 2 ноября 2015.
  18. 1 2 Основы Kubernetes (рус.). Проверено 17 февраля 2018.
  19. Langemak, Jon Kubernetes 101 – External Access Into The Cluster. Das Blinken Lichten (15 февраля 2015). Проверено 2 ноября 2015. Архивировано 26 октября 2015 года.
  20. 1 2 Overview of a Replication Controller. Documentation. CoreOS. Проверено 2 ноября 2015. Архивировано 22 сентября 2015 года.
  21. Intro: Docker and Kubernetes training - Day 2. Red Hat (20 октября 2015). Проверено 2 ноября 2015. Архивировано 29 октября 2015 года.
  22. Sanders, Jake Kubernetes: Exciting Experimental Features. Livewyer (2 октября 2015). Проверено 2 ноября 2015. Архивировано 20 октября 2015 года.
  23. Introducing Operators: Putting Operational Knowledge into Software. На сайте CoreOs
  24. Операторы для Kubernetes: как запускать stateful-приложения (рус.). Проверено 25 апреля 2018.
  25. 1 2 Kubernetes Infrastructure. OpenShift Community Documentation. OpenShift. Проверено 24 сентября 2015. Архивировано 6 июля 2015 года.
  26. 1 2 Marhubi, Kamal Kubernetes from the ground up: API server. kamalmarhubi.com (26 сентября 2015). Архивировано 29 октября 2015 года.
  27. Как на самом деле работает планировщик Kubernetes? (рус.). Проверено 14 февраля 2018.
  28. The Three Pillars of Kubernetes Container Orchestration - Rancher Labs. rancher.com (18 May 2017). Проверено 22 мая 2017. Архивировано 24 июня 2017 года.
  29. Overview of kubectl (англ.). Kubernetes. Проверено 17 февраля 2018.
  30. Marhubi, Kamal What [.. is a Kubelet?]. kamalmarhubi.com (27 августа 2015). Архивировано 13 ноября 2015 года.
  31. Начало работы в Kubernetes с помощью Minikube (рус.). Проверено 23 февраля 2018.
  32. 1 2 Using Helm to deploy to Kubernetes (англ.). daemonza.github.io. Проверено 23 февраля 2018.
  33. Harshal Shah. Terraform vs. Helm for Kubernetes // DZone. — 2017. — 2 ноября.
  34. Deploy and Manage Kubernetes Clusters | Rancher Labs (англ.), Rancher Labs. Архивировано 16 апреля 2017 года.
  35. Software, Pivotal Pivotal Container Service (PKS) (EN). pivotal.io (17 января 2017).
  36. OpenShift v3 Platform Combines Docker, Kubernetes. blog.openshift.com. Проверено 14 августа 2014. Архивировано 6 июля 2015 года.
  37. Why Red Hat Chose Kubernetes for OpenShift. blog.openshift.com. Проверено 7 ноября 2016. Архивировано 21 февраля 2017 года.
  38. IBM Launches Bluemix Container Service with Kubernetes to Fuel Highly Secure and Rapid Development of Cognitive Apps (англ.). ibm.com.
  39. IBM chases Google, Microsoft with Kubernetes in the cloud (англ.). infoworld.com.
  40. IBM Announces IBM Cloud Private (англ.). ibm.com. Архивировано 1 ноября 2017 года.
  41. IBM Cloud Private brings cloud native computing to your data center (англ.). techcrunch.com. Архивировано 3 ноября 2017 года.
  42. IBM Cloud Private launches with bet open architecture wins hybrid cloud scrum (англ.). zdnet.com. Архивировано 3 ноября 2017 года.
  43. Oracle Joins Cloud Native Computing Foundation as Platinum Member - Cloud Native Computing Foundation (англ.), Cloud Native Computing Foundation (13 сентября 2017).
  44. Зачем нужен Kubernetes и почему он больше, чем PaaS? (рус.). Проверено 17 февраля 2018.
  45. Это не означает, что Docker Swarm и Kubernetes единственные системы оркестрации для Docker. Наряду с ними для оркестрации Docker может применяться Nomad компании Hashicorp и ряд других, менее известных приложений.
  46. Kubernetes vs Docker Swarm - Container Management | Platform9 (англ.), Platform9. Проверено 23 февраля 2018.
  47. Сравнение: Docker swarm, Kubernetes, Rancher и D2C (рус.). Проверено 23 февраля 2018.
  48. Translate a Docker Compose File to Kubernetes Resources (англ.). Kubernetes. Проверено 23 февраля 2018.
  49. Kubernetes on OpenStack. blog.kubernetes.io. Проверено 22 февраля 2018.
  50. The future of OpenStack and Kubernetes - OpenStack Superuser (англ.), OpenStack Superuser (15 декабря 2016). Проверено 22 февраля 2018.
  51. Тестирование в Openshift: Интеграция с Openstack (рус.). Проверено 22 февраля 2018.
  52. VMware Dispatch: новый фреймворк для работы с serverless-приложениями (рус.). Проверено 25 февраля 2018.