text:
# Kubernetes
Kubernetes (K8s) — открытое программное обеспечение для оркестровки контейнеризированных приложений — автоматизации их развёртывания, масштабирования и координации в условиях кластера. Поддерживает основные технологии контейнеризации, включая Docker, rkt, также возможна поддержка технологий аппаратной виртуализации.
Оригинальная версия была разработана компанией Google для внутренних нужд, впоследствии система передана под управление Cloud Native Computing Foundation. Используются рядом крупных организаций и интернет-проектов, в частности, инфраструктура фонда Wikimedia Foundation перенесена с самостоятельно разработанного программного обеспечения для организации кластеров на Kubernetes.
Слово «Kubernetes» происходит от др.-греч. κυβερνήτης — кормчий, рулевой. Часто также используется нумероним «k8s»: в слове «kubernetes» восемь букв между «k» и «s», по аналогии с нумеронимом «i18n» — сокращённой версией от «internationalization».

## История
Основные разработчики первых версий внутренней системы Google — программисты Джо Беда (Joe Beda), Брендан Бёрнс (Brendan Burns) и Крэйг Маклаки (Craig McLuckie), в дальнейшем к проекту присоединились их коллеги Брайан Грант (Brian Grant) и Тим Хокин (Tim Hockin). Основной язык программирования системы — Go. На разработку и внутреннюю идеологию Kubernetes серьёзно повлиял другой продукт Google, оставшийся внутренней разработкой — система управления кластерами Google Borg, над которым ранее работал ряд ключевых разработчиков Kubernetes.
Оригинальное наименование проекта — Project Seven (отсылка к героине сериала Star Trek, возвращённой в индивидуальное и дружественное к людям состояние из статуса члена нечеловеческого роевого кибернетического разума Коллектива Боргов); семь ручек на штурвале логотипа проекта — аллюзия на этот художественный образ.
В середине 2014 года опубликованы исходные коды проекта. 21 июля 2015 года выпущена версия 1.0; после чего Google в партнёрстве с Linux Foundation организовал специальный фонд Cloud Native Computing Foundation (CNCF), которому корпорация передала Kubernetes в качестве начального технологического вклада.
19 декабря 2016 года был представлен Container Runtime Interface (CRI), который заменил Docker в качестве движка для управления контейнерами, обеспечивая тем самым поддержку не только Docker, но и других совместимых средств контейнеризации.

## Концепции
Как и многие другие сложные продукты, Kubernetes в рамках своей экосистемы вводит ряд специфических понятий и концепций.
Узел (node) — это отдельная физическая или виртуальная машина, на которой развёрнуты и выполняются контейнеры приложений. Каждый узел в кластере содержит сервисы для запуска приложений в контейнерах (например Docker), а также компоненты, предназначенные для централизованного управления узлом.
Под (pod, с англ. — «стручок, кокон», также модуль) — базовая единица для запуска и управления приложениями: один или несколько контейнеров, которым гарантирован запуск на одном узле, обеспечивается разделение ресурсов и межпроцессное взаимодействие и предоставляется уникальный в пределах кластера IP-адрес. Последнее позволяет приложениям, развёрнутым на поде, использовать фиксированные и предопределённые номера портов без риска конфликта. Поды могут напрямую управляться с использованием API Kubernetes или управление ими может быть передано контроллеру.
Том (volume) — общий ресурс хранения для совместного использования из контейнеров, развёрнутых в пределах одного пода.
Все объекты управления (узлы, поды, контейнеры) в Kubernetes помечаются метками (label), селекторы меток (label selector) — это запросы, которые позволяют получить ссылку на объекты, соответствующие какой-то из меток. Метки и селекторы — это главный механизм Kubernetes, который позволяет выбрать, какой из объектов следует использовать для запрашиваемой операции.
Сервисом в Kubernetes называют совокупность логически связанных наборов подов и политик доступа к ним. Например, сервис может соответствовать одному из уровней программного обеспечения, разработанного в соответствии с принципами многоуровневой архитектуры программного обеспечения. Набор подов, соответствующий сервису, получается в результате выполнения селектора соответствующей метки.
Kubernetes обеспечивает функции обнаружения сервисов и маршрутизации по запросу. В частности, система умеет переназначать необходимые для обращения к сервису IP-адрес и доменное имя сервиса различным подам, входящим в его состав. При этом обеспечивается балансировка нагрузки в стиле Round robin DNS между подами, чьи метки соответствуют сервису, а также корректная работа в том случае, если один из узлов кластера вышел из строя и размещённые на нём поды автоматически были перемещены на другие узлы. По умолчанию сервис доступен внутри управляемого Kubernetes кластера — например, поды бэкенда группируются для обеспечения балансировки нагрузки и в таком виде предоставляются фронтенду. Также кластер может быть настроен и для предоставления доступа к входящим в его состав подам извне как к единому фронтенду.
Контроллер (controller) — это процесс, который управляет состоянием кластера, пытаясь привести его от фактического состояния к желаемому; он делает это, оперируя набором подов, определяемых с помощью селекторов меток и являющихся частью определения контроллера. Выполнение контроллеров обеспечивается компонентом Kubernetes Controller Manager. Один из типов контроллеров, самый известный — это контроллер репликации (Replication Controller), который обеспечивает масштабирование, запуская указанное количество копий пода в кластере. Он также обеспечивает запуск новых экземпляров пода в том случае, если узел, на котором работает управляемый этим контроллером под, выходит из строя. Другие контроллеры, входящие в основную систему Kubernetes, включают в себя «DaemonSet Controller», который обеспечивает запуск пода на каждой машине (или подмножеством машин), и «Job Controller» для запуска подов, которые выполняются до завершения, например, как часть пакетного задания.
Операторы (operators) — специализированный вид программного обеспечения Kubernetes, предназначенный для включения в кластер сервисов, сохраняющих своё состояние между выполнениями (stateful), таких как СУБД, системы мониторинга или кэширования. Назначение операторов — предоставить возможность управления stateful-приложениями в кластере Kubernetes прозрачным способом и скрыть подробности их настроек от основного процесса управления кластером Kubernetes.

## Архитектура и компоненты
Система реализует архитектуру «ведущий — ведомый»: выделяется подсистема управления кластером, а часть компонентов управляют индивидуальными, ведомыми узлами (называемых собственно узлами Kubernetes).

### Подсистема управления
Подсистема управления обеспечивает коммуникацию и распределение нагрузки внутри кластера; компоненты подсистемы могут выполняться на одном или на нескольких параллельно работающих ведущих узлах, совместно обеспечивающих режим высокой доступности.
Etcd — компонент подсистемы управления, отвечающий за согласованное хранение конфигурационных данных кластера, в некотором смысле — распределённый эквивалент каталога /etc Unix-систем. Реализован как легковесная распределённая NoSQL-СУБД класса «ключ — значение»; создан в рамках проекта CoreOS.
Сервер API — ключевой компонент подсистемы управления, предоставляющий API в стиле REST (с использованием коммуникации в формате JSON поверх HTTP-транспорта), и используемый для организации внешнего и внутреннего доступа к функциям Kubernetes. Сервер API обновляет состояние объектов, хранящееся в etcd, позволяя своим клиентам управлять распределением контейнеров и нагрузки между узлами управляемой системы.
Планировщик (scheduler) — компонент подсистемы управления, который выбирает, на каком узле должен выполняться конкретный под, опираясь на критерии доступности ресурсов. Планировщик отслеживает использование ресурсов на каждом из узлов, обеспечивая распределение нагрузки так, чтобы она не превышала доступный объём ресурсов. Для этой цели планировщик должен обладать информацией о доступных на каждом из узлов ресурсах, требованиях к ним со стороны управляемых подов, а также различных дополнительных пользовательских ограничениях и политиках, таких как QoS, требования аффинитета и антиаффинитета (affinity — anti-affinity — связки или развязки объектов управления друг с другом), локализации данных. Иными словами, роль планировщика — находить и предоставлять ресурсы в зависимости от запросов, возникающих в связи с загрузкой.
Менеджер контроллеров (controller manager) — процесс, выполняющий основные контроллеры Kubernetes, такие как DaemonSet Controller и Replication Controller. Контроллеры взаимодействуют с сервером API Kubernetes, создавая, обновляя и удаляя управляемые ими ресурсы (поды, точки входа в сервисы и другие).
Kubectl — интерфейс командной строки, наряду с API обеспечивающий управление ресурсами, подконтрольными Kubernetes.

### Компоненты узлов
Процедура работы Kubernetes состоит в том, что ресурсы узлов динамически распределяются между выполняемыми на них подами. Каждый узел в кластере содержит ряд типовых компонентов.
Сервис для запуска контейнеров обеспечивает функции выполнения контейнеров соответствующего вида (в зависимости от типа используемого контейнерного движка). С точки зрения программной среды Kubernetes, контейнеры инкапсулируются в подах, при этом сами контейнеры являются наиболее низкоуровневыми программными компонентами, с которыми взаимодействует программное обеспечение Kubernetes. Они, в свою очередь, содержат выполняемые приложения, библиотеки и иные необходимые для работы этих приложений ресурсы. Для внешнего мира контейнеры доступны через назначаемый каждому из подов IP-адрес.
Kubelet отвечает за статус выполнения подов на узле — отслеживает, корректно ли выполняется каждый из контейнеров, находясь в рабочем состоянии. Kubelet обеспечивает запуск, остановку и управление контейнерами приложений, организованными в поды. Функционально Kubelet можно рассматривать как аналог supervisord. Если обнаруживается, что какой-то из подов находится в неверном состоянии, компонент пытается осуществить его повторное развёртывание и перезапуск на узле. Статус самого узла отправляется на подсистему управления каждые несколько секунд в форме диагностических сообщений (heartbeat message). Если мастер-узел, исходя из содержания этих сообщений или их отсутствия, обнаруживает, что конкретный узел не работает должным образом, процесс подсистемы управления Replication Controller пытается перезапустить необходимые поды на другом узле, находящемся в рабочем состоянии.
Kube-proxy — компонент, являющийся комбинацией сетевого прокси-сервера и балансировщика нагрузки. Реализованные в нём операции сетевого уровня используют абстракцию сервиса. Он отвечает за маршрутизацию входящего трафика на конкретные контейнеры, работающие в пределах пода, расположенного на узле. Маршрутизация обеспечивается на основе IP-адреса и порта входящего запроса.
cAdvisor — агент системы внутреннего мониторинга Kubernetes, собирающий метрики производительности и информацию об использовании контейнерами, работающими в пределах узла, таких ресурсов как время работы центрального процессора, оперативной памяти, нагрузку на файловую и сетевую системы.

## Разработка и развёртывание
Kubernetes предоставляет ряд средств для интеграции процессов разработки и развёртывания программного обеспечения, работающего под управлением этой системы. Среди наиболее часто используемых в этих целях инструментов:
- Helm[англ.] — официальный менеджер пакетов Kubernetes, функциональный эквивалент apt-get и yum[24];
- Minikube — специализированная конфигурация Kubernetes, предназначенная для развёртывания на локальной машине, например, компьютере разработчика, применяется для изучения и локальных экспериментов над Kubernetes;
- Skaffold — утилита от Google для локальной разработки в Kubernetes;
- ArgoCD — утилита для декларативного CI/CD, основанного на GitOps-подходе;
- Kustomize — утилита для настройки yaml-манифестов, свободных от шаблонов.

Для многих из подобных инструментов существуют альтернативы, например, вместо ArgoCD иногда используется Flux и werf.

## Распространение и конкуренция
Многие из поставщиков систем управления контейнерами реализовали поддержку Kubernetes в своих продуктах, ряд из них приняли участие в деятельности CNCF. В частности, Rancher Labs включила Kubernetes в дистрибутив своей системы управления контейнерами Rancher container management platform, Pivotal Software использовала Kubernetes в продукте Pivotal Container Service (PKS), Red Hat — в составе PaaS-системы OpenShift (являющейся, по сути, расширенной версией Kubernetes, часто даже называемой «дистрибутивом Kubernetes»), CoreOS включила систему в состав коммерческой версии дистрибутива Container Linux Tectonic, а IBM использовала его в IBM Cloud Container Service и в продукте IBM Cloud Private. Корпорация Oracle присоединилась к Cloud Native Computing Foundation в сентябре 2017 и включила Kubernetes в состав Oracle Cloud и Oracle Linux.
Считается, что к концу 2010-х годов Kubernetes стал стандартом де-факто для использования в облачных системах и сервисах по модели PaaS, предусматривающих контейнеризацию приложений, в частности, является основой контейнеризационных сервисов ряда крупнейших публично-облачных провайдеров — Amazon (AWS Elastic Container Service), Microsoft (Microsoft Azure Containers), Google (Google Cloud Platform Kubernetes Engine). С 2019 года компанией Rancher Labs развивается дистрибутив k3s — облегчённый вариант Kubernetes, нацеленный на развёртывание в средах с ограниченными вычислительными ресурсами.
При этом развиваются и альтернативные продукты для оркестровки контейнеризированных приложений — Docker Swarm от фирмы-разработчика Docker и Nomad от компании HashiCorp. По сравнению с Docker Swarm, Kubernetes функционально богаче, но обладает более высоким порогом вхождения в технологию. При переходе от Docker Swarm к Kubernetes необходимо использовать приложение Kompose для конвертации созданных в Docker Compose файлов описаний оркестровки в формат, поддерживаемый Kubernetes.

title: Kubernetes

wikitext:
{{Карточка программы}}
'''Kubernetes''' (''K8s''<ref name=whatis>{{Cite web|url=http://edit.dialogic.com/glossary/kubernetes/ |title=What is Kubernetes (K8s)? |website=Dialogic Glossary of Telecom Terms |access-date=2017-10-10 |archive-url=https://web.archive.org/web/20171011073148/http://edit.dialogic.com/glossary/kubernetes |archive-date=2017-10-11 }}</ref>) — [[открытое программное обеспечение]] для [[Оркестровка (ИТ)|оркестровки]] контейнеризированных приложений — автоматизации их развёртывания, масштабирования и координации в условиях [[Кластер (группа компьютеров)|кластера]]. Поддерживает основные технологии [[Контейнеризация|контейнеризации]], включая [[Docker]], rkt, также возможна поддержка технологий [[Аппаратная виртуализация|аппаратной виртуализации]]<ref name=libvirt>Расширение Kubevirt обеспечивает возможность запуска подов не на основе Container Runtime Interface, а на основе любых виртуальных машин, поддерживаемых [[libvirt]].</ref>.

Оригинальная версия была разработана компанией [[Google (компания)|Google]] для внутренних нужд, впоследствии система передана под управление [[Cloud Native Computing Foundation]]. Используются рядом крупных организаций и интернет-проектов, в частности, инфраструктура фонда [[Wikimedia Foundation]] перенесена с самостоятельно разработанного программного обеспечения для организации кластеров на Kubernetes.

Слово «Kubernetes» происходит от {{lang-grc|κυβερνήτης}} — кормчий, рулевой<ref name=whatis/>. Часто также используется [[нумероним]] «k8s»: в слове «kubernetes» восемь букв между «k» и «s», по аналогии с нумеронимом «i18n» — сокращённой версией от «internationalization».

== История ==
[[Файл:Kubernetes talk at Google Cloud Summit.jpg|thumb|Доклад «Google Container Engine» на Google Cloud Summit]]
Основные разработчики первых версий внутренней системы Google — программисты Джо Беда ({{lang-en2|Joe Beda}}), Брендан Бёрнс ({{lang-en2|Brendan Burns}}) и Крэйг Маклаки ({{lang-en2|Craig McLuckie}}<ref>{{Cite web|url=https://www.wired.com/2015/06/google-kubernetes-says-future-cloud-computing/ |title=Google Made Its Secret Blueprint Public to Boost Its Cloud |language=en |access-date=2016-06-27 |archive-url=https://web.archive.org/web/20160701040235/http://www.wired.com/2015/06/google-kubernetes-says-future-cloud-computing/ |archive-date=2016-07-01 }}</ref>), в дальнейшем к проекту присоединились их коллеги Брайан Грант ({{lang-en2|Brian Grant}}) и Тим Хокин ({{lang-en2|Tim Hockin}}). Основной язык программирования системы — [[Go (язык программирования)|Go]]. На разработку и внутреннюю идеологию Kubernetes серьёзно повлиял другой продукт Google, оставшийся внутренней разработкой — система управления кластерами Google Borg<ref>{{статья |заглавие=Large-scale cluster management at Google with Borg |издание=Proceedings of the European Conference on Computer Systems (EuroSys) |ссылка=https://research.google.com/pubs/pub43438.html |archive-url=https://web.archive.org/web/20170727090712/https://research.google.com/pubs/pub43438.html |archive-date=2017-07-27 |язык=und |автор=Abhishek Verma; Luis Pedrosa; Madhukar R. Korupolu; David Oppenheimer; Eric Tune; John Wilkes |число=21 |месяц=4 |год=2015}}</ref><ref>{{Cite web|url=http://queue.acm.org/detail.cfm?id=2898444 |title=Borg, Omega, and Kubernetes - ACM Queue |website=queue.acm.org |access-date=2016-06-27 |archive-url=https://web.archive.org/web/20160709023750/http://queue.acm.org/detail.cfm?id=2898444 |archive-date=2016-07-09 }}</ref>, над которым ранее работал ряд ключевых разработчиков Kubernetes.

Оригинальное наименование проекта — ''Project Seven'' (отсылка к [[Семь-из-девяти|героине]] сериала [[Star Trek]], возвращённой в индивидуальное и дружественное к людям состояние из статуса члена нечеловеческого роевого кибернетического разума [[Борг (Звёздный путь)|Коллектива Боргов]])<ref>{{Cite news|url=http://www.eweek.com/cloud/early-stage-startup-heptio-aims-to-make-kubernetes-friendly.html|title=Early Stage Startup Heptio Aims to Make Kubernetes Friendly|access-date=2016-12-06|url-status=dead}}</ref>; семь ручек на штурвале логотипа проекта — аллюзия на этот художественный образ.

В середине 2014 года опубликованы исходные коды проекта<ref>{{cite web|title=Google Open Sources Its Secret Weapon in Cloud Computing |url=https://www.wired.com/2014/06/google-kubernetes/ |website=Wired |access-date=2015-09-24 |archive-url=https://web.archive.org/web/20150910171929/http://www.wired.com/2014/06/google-kubernetes |archive-date=2015-09-10 }}</ref>. 21 июля 2015 года выпущена версия 1.0<ref>{{cite web|title=As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation |url=https://techcrunch.com/2015/07/21/as-kubernetes-hits-1-0-google-donates-technology-to-newly-formed-cloud-native-computing-foundation-with-ibm-intel-twitter-and-others/ |website=TechCrunch |access-date=2015-09-24 |archive-url=https://web.archive.org/web/20150923060338/http://techcrunch.com/2015/07/21/as-kubernetes-hits-1-0-google-donates-technology-to-newly-formed-cloud-native-computing-foundation-with-ibm-intel-twitter-and-others/ |archive-date=2015-09-23 }}</ref>; после чего Google в партнёрстве с [[Linux Foundation]] организовал специальный фонд [[Linux Foundation#Cloud Native Computing Foundation|Cloud Native Computing Foundation]] (CNCF), которому корпорация передала Kubernetes в качестве начального технологического вклада.

19 декабря 2016 года был представлен Container Runtime Interface (CRI), который заменил Docker в качестве движка для управления<ref>{{Cite web |url=https://kubernetes.io/docs/concepts/architecture/cri/ |title=Container Runtime Interface (CRI) {{!}} Kubernetes<!-- Заголовок добавлен ботом --> |access-date=2022-09-19 |archive-date=2022-09-20 |archive-url=https://web.archive.org/web/20220920172847/https://kubernetes.io/docs/concepts/architecture/cri/ |url-status=live }}</ref> [[Контейнеризация|контейнерами]], обеспечивая тем самым поддержку не только Docker, но и других совместимых средств контейнеризации.

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

Узел ({{lang-en2|node}}) — это отдельная физическая или [[Виртуальная машина|виртуальная]] машина, на которой развёрнуты и выполняются контейнеры приложений. Каждый узел в кластере содержит сервисы для запуска приложений в контейнерах (например [[Docker]]), а также компоненты, предназначенные для централизованного управления узлом.

Под ({{lang-en2|pod}}, {{tr-en|стручок, кокон}}, также ''модуль'') — базовая единица для запуска и управления приложениями: один или несколько контейнеров, которым гарантирован запуск на одном узле, обеспечивается разделение ресурсов<ref name="do-intro">{{cite web|title=An Introduction to Kubernetes |url=https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes |website=DigitalOcean |access-date=2015-09-24 |archive-url=https://web.archive.org/web/20151001183617/https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes |archive-date=2015-10-01 }}</ref> и [[межпроцессное взаимодействие]] и предоставляется уникальный в пределах кластера IP-адрес<ref name="kubernetes-101-networking">{{cite web |url=http://www.dasblinkenlichten.com/kubernetes-101-networking/ |title=Kubernetes 101 – Networking |last=Langemak |first=Jon |work=Das Blinken Lichten |date=2015-02-11 |access-date=2015-11-02 |archive-url=https://web.archive.org/web/20151025035709/http://www.dasblinkenlichten.com/kubernetes-101-networking/ |archive-date=2015-10-25 }}</ref>. Последнее позволяет приложениям, развёрнутым на поде, использовать фиксированные и предопределённые номера портов без риска конфликта. Поды могут напрямую управляться с использованием [[API]] Kubernetes или управление ими может быть передано контроллеру<ref name="do-intro"/>.

Том ({{lang-en2|volume}}) — общий ресурс хранения для совместного использования из контейнеров, развёрнутых в пределах одного пода.

Все объекты управления (узлы, поды, контейнеры) в Kubernetes помечаются метками ({{lang-en2|label}}), селекторы меток ({{lang-en2|label selector}}) — это запросы, которые позволяют получить ссылку на объекты, соответствующие какой-то из меток<ref name="do-intro" />. Метки и селекторы — это главный механизм Kubernetes, который позволяет выбрать, какой из объектов следует использовать для запрашиваемой операции.

Сервисом в Kubernetes называют совокупность логически связанных наборов подов и [[Мандатное управление доступом|политик доступа]] к ним. Например, сервис может соответствовать одному из уровней программного обеспечения, разработанного в соответствии с принципами многоуровневой архитектуры программного обеспечения. Набор подов, соответствующий сервису, получается в результате выполнения селектора соответствующей метки<ref name="do-intro" />.

Kubernetes обеспечивает функции [[Обнаружение сервисов|обнаружения сервисов]] и маршрутизации по запросу. В частности, система умеет переназначать необходимые для обращения к сервису IP-адрес и доменное имя сервиса различным подам, входящим в его состав. При этом обеспечивается [[балансировка нагрузки]] в стиле [[Round robin DNS]] между подами, чьи метки соответствуют сервису, а также корректная работа в том случае, если один из узлов кластера вышел из строя и размещённые на нём поды автоматически были перемещены на другие узлы<ref name="kubernetes-101-networking" />. По умолчанию сервис доступен внутри управляемого Kubernetes кластера — например, поды бэкенда группируются для обеспечения балансировки нагрузки и в таком виде предоставляются фронтенду. Также кластер может быть настроен и для предоставления доступа к входящим в его состав подам извне как к единому фронтенду<ref name="kubernetes-101-external-access">{{cite web |url=http://www.dasblinkenlichten.com/kubernetes-101-external-access-into-the-cluster/ |title=Kubernetes 101 – External Access Into The Cluster |last=Langemak |first=Jon |work=Das Blinken Lichten |date=2015-02-15 |access-date=2015-11-02 |archive-url=https://web.archive.org/web/20151026035212/http://www.dasblinkenlichten.com/kubernetes-101-external-access-into-the-cluster/ |archive-date=2015-10-26 }}</ref>.

Контроллер ({{lang-en2|controller}}) — это [[Процесс (информатика)|процесс]], который управляет состоянием кластера, пытаясь привести его от фактического состояния к желаемому<ref name="coreos-replication-controller">{{cite web |url=https://coreos.com/kubernetes/docs/latest/replication-controller.html |title=Overview of a Replication Controller |work=Documentation |publisher=[[CoreOS]] |access-date=2015-11-02 |archive-url=https://web.archive.org/web/20150922010433/https://coreos.com/kubernetes/docs/latest/replication-controller.html |archive-date=2015-09-22 }}</ref>; он делает это, оперируя набором подов, определяемых с помощью селекторов меток и являющихся частью определения контроллера<ref name="redhat-docker-and-kubernetes-training-labels-examples">{{cite web |url=http://christianposta.com/slides/docker/generated/day2.html#/label-examples |title=Intro: Docker and Kubernetes training - Day 2 |publisher=[[Red Hat]] |date=2015-10-20 |access-date=2015-11-02 |archive-url=https://web.archive.org/web/20151029210659/http://christianposta.com/slides/docker/generated/day2.html#/label-examples |archive-date=2015-10-29 }}</ref>. Выполнение контроллеров обеспечивается компонентом Kubernetes Controller Manager. Один из типов контроллеров, самый известный — это контроллер репликации ({{lang-en2|Replication Controller}}), который обеспечивает масштабирование, запуская указанное количество копий пода в кластере. Он также обеспечивает запуск новых экземпляров пода в том случае, если узел, на котором работает управляемый этим контроллером под, выходит из строя<ref name="coreos-replication-controller"/>. Другие контроллеры, входящие в основную систему Kubernetes, включают в себя «DaemonSet Controller», который обеспечивает запуск пода на каждой машине (или подмножеством машин), и «Job Controller» для запуска подов, которые выполняются до завершения, например, как часть пакетного задания.

Операторы ({{lang-en2|operators}}) — специализированный вид программного обеспечения Kubernetes, предназначенный для включения в кластер сервисов, сохраняющих своё состояние между выполнениями ({{lang-en2|stateful}}), таких как СУБД, системы мониторинга или кэширования<ref>[https://coreos.com/blog/introducing-operators.html Introducing Operators: Putting Operational Knowledge into Software] {{Wayback|url=https://coreos.com/blog/introducing-operators.html |date=20191125171801 }} // CoreOS</ref>. Назначение операторов — предоставить возможность управления stateful-приложениями в кластере Kubernetes прозрачным способом и скрыть подробности их настроек от основного процесса управления кластером Kubernetes.

== Архитектура и компоненты ==
[[Файл:kubernetes.png|600px|thumb|Архитектура Kubernetes]]
Система реализует архитектуру «[[ведущий — ведомый]]»: выделяется подсистема управления кластером, а часть компонентов управляют индивидуальными, ведомыми узлами (называемых собственно узлами Kubernetes)<ref name="do-intro" /><ref name=":0">{{cite web|title=Kubernetes Infrastructure |url=https://docs.openshift.org/latest/architecture/infrastructure_components/kubernetes_infrastructure.html |website=OpenShift Community Documentation |publisher=OpenShift |access-date=2015-09-24 |archive-url=https://web.archive.org/web/20150706121423/https://docs.openshift.org/latest/architecture/infrastructure_components/kubernetes_infrastructure.html |archive-date=2015-07-06 }}</ref>.

=== Подсистема управления ===
Подсистема управления обеспечивает коммуникацию и распределение нагрузки внутри кластера; компоненты подсистемы могут выполняться на одном или на нескольких параллельно работающих ведущих узлах, совместно обеспечивающих режим [[Высокая доступность|высокой доступности]]<ref name=":0"/>.

[[Container Linux|Etcd]] — компонент подсистемы управления, отвечающий за согласованное хранение конфигурационных данных кластера, в некотором смысле — распределённый эквивалент каталога [[/etc]] Unix-систем. Реализован как легковесная распределённая [[NoSQL]]-СУБД класса «ключ — значение»; создан в рамках проекта [[CoreOS]].

Сервер API — ключевой компонент подсистемы управления, предоставляющий API в стиле [[REST]] (с использованием коммуникации в формате [[JSON]] поверх [[Hypertext Transfer Protocol|HTTP]]-транспорта), и используемый для организации внешнего и внутреннего доступа к функциям Kubernetes<ref name="do-intro" />. Сервер API обновляет состояние объектов, хранящееся в etcd, позволяя своим клиентам управлять распределением контейнеров и нагрузки между узлами управляемой системы.

Планировщик ({{lang-en2|scheduler}}) — компонент подсистемы управления, который выбирает, на каком узле должен выполняться конкретный под, опираясь на критерии доступности ресурсов. Планировщик отслеживает использование ресурсов на каждом из узлов, обеспечивая распределение нагрузки так, чтобы она не превышала доступный объём ресурсов. Для этой цели планировщик должен обладать информацией о доступных на каждом из узлов ресурсах, требованиях к ним со стороны управляемых подов, а также различных дополнительных пользовательских ограничениях и политиках, таких как [[QoS]], требования [[аффинитет]]а и антиаффинитета ({{lang-en2|affinity — anti-affinity}} — связки или развязки объектов управления друг с другом), {{iw|локальность данных|локализации данных|en|data locality}}. Иными словами, роль планировщика — находить и предоставлять ресурсы в зависимости от запросов, возникающих в связи с загрузкой<ref>{{cite web|url=http://rancher.com/three-pillars-kubernetes-container-orchestration/ |title=The Three Pillars of Kubernetes Container Orchestration - Rancher Labs |date=2017-05-18 |website=rancher.com |access-date=2017-05-22 |archive-url=https://web.archive.org/web/20170624022635/http://rancher.com/three-pillars-kubernetes-container-orchestration/ |archive-date=2017-06-24 }}</ref>.

Менеджер контроллеров ({{lang-en2|controller manager}}) — процесс, выполняющий основные контроллеры Kubernetes, такие как DaemonSet Controller и Replication Controller. Контроллеры взаимодействуют с сервером API Kubernetes, создавая, обновляя и удаляя управляемые ими ресурсы (поды, точки входа в сервисы и другие).

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

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

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

Kubelet отвечает за статус выполнения подов на узле — отслеживает, корректно ли выполняется каждый из контейнеров, находясь в рабочем состоянии. Kubelet обеспечивает запуск, остановку и управление контейнерами приложений, организованными в поды. Функционально Kubelet можно рассматривать как аналог [[supervisord]]<ref name="do-intro" /><ref>{{Cite web|url=http://kamalmarhubi.com/blog/2015/08/27/what-even-is-a-kubelet/ |title=What [..] is a Kubelet? |last=Marhubi |first=Kamal |date=2015-08-27 |website= |publisher=kamalmarhubi.com |access-date=2015-11-02 |archive-url=https://web.archive.org/web/20151113064016/http://kamalmarhubi.com/blog/2015/08/27/what-even-is-a-kubelet/ |archive-date=2015-11-13 }}</ref>. Если обнаруживается, что какой-то из подов находится в неверном состоянии, компонент пытается осуществить его повторное [[Развёртывание программного обеспечения|развёртывание]] и перезапуск на узле. Статус самого узла отправляется на подсистему управления каждые несколько секунд в форме диагностических сообщений ({{lang-en2|heartbeat message}}). Если мастер-узел, исходя из содержания этих сообщений или их отсутствия, обнаруживает, что конкретный узел не работает должным образом, процесс подсистемы управления Replication Controller пытается перезапустить необходимые поды на другом узле, находящемся в рабочем состоянии.

Kube-proxy — компонент, являющийся комбинацией [[прокси-сервер|сетевого прокси-сервера]] и [[балансировщик нагрузки|балансировщика нагрузки]]. Реализованные в нём операции сетевого уровня используют абстракцию сервиса<ref name="do-intro" />. Он отвечает за маршрутизацию входящего трафика на конкретные контейнеры, работающие в пределах пода, расположенного на узле. Маршрутизация обеспечивается на основе IP-адреса и порта входящего запроса.

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

== Разработка и развёртывание ==
Kubernetes предоставляет ряд средств для интеграции процессов [[Разработка программного обеспечения|разработки]] и [[Развёртывание программного обеспечения|развёртывания]] программного обеспечения, работающего под управлением этой системы. Среди наиболее часто используемых в этих целях инструментов:
* {{iw|Helm|||Helm (package manager)}} — официальный менеджер пакетов Kubernetes, функциональный эквивалент [[apt-get]] и [[yum]]<ref name=":2">{{Cite web|lang=en|url=https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/|title=Using Helm to deploy to Kubernetes|publisher=daemonza.github.io|access-date=2018-02-23|archive-date=2019-05-23|archive-url=https://web.archive.org/web/20190523094612/https://daemonza.github.io/2017/02/20/using-helm-to-deploy-to-kubernetes/|url-status=dead}}</ref>;
* Minikube — специализированная конфигурация Kubernetes, предназначенная для развёртывания на локальной машине, например, компьютере разработчика, применяется для изучения и локальных экспериментов над Kubernetes;
* Skaffold — утилита от Google для локальной разработки в Kubernetes;
* ArgoCD — утилита для [[декларативный|декларативного]] [[CI/CD]], основанного на [[DevOps#GitOps|GitOps]]-подходе;
* Kustomize — утилита для настройки [[yaml]]-манифестов, свободных от шаблонов.

Для многих из подобных инструментов существуют альтернативы, например, вместо ArgoCD иногда используется Flux и werf.

== Распространение и конкуренция ==
Многие из поставщиков систем управления контейнерами реализовали поддержку Kubernetes в своих продуктах, ряд из них приняли участие в деятельности [[The Linux Foundation#Cloud Native Computing Foundation|CNCF]]. В частности, {{iw|Rancher Labs}} включила Kubernetes в дистрибутив своей системы управления контейнерами Rancher container management platform<ref>{{Cite news|url=http://rancher.com/kubernetes/|title=Deploy and Manage Kubernetes Clusters {{!}} Rancher Labs|work=Rancher Labs|access-date=2017-04-15|language=en|url-status=live|archive-url=https://web.archive.org/web/20170416125621/http://rancher.com/kubernetes/|archive-date=2017-04-16|df=}}</ref>, {{iw|Pivotal Software}} использовала Kubernetes в продукте Pivotal Container Service (PKS)<ref>{{Cite web|url=https://pivotal.io/platform/pivotal-container-service|title=Pivotal Container Service (PKS)|last=Software|first=Pivotal|date=2017-01-17|website=pivotal.io|language=en|access-date=2018-02-14|archive-date=2018-02-15|archive-url=https://web.archive.org/web/20180215023857/https://pivotal.io/platform/pivotal-container-service|url-status=live}}</ref>, [[Red Hat]] — в составе PaaS-системы [[Openshift|OpenShift]]<ref>{{cite web|title=OpenShift v3 Platform Combines Docker, Kubernetes |url=https://blog.openshift.com/openshift-v3-platform-combines-docker-kubernetes-atomic-and-more/ |website=blog.openshift.com |access-date=2014-08-14 |archive-url=https://web.archive.org/web/20150706080038/https://blog.openshift.com/openshift-v3-platform-combines-docker-kubernetes-atomic-and-more/ |archive-date=2015-07-06 }}</ref><ref>{{cite web|title=Why Red Hat Chose Kubernetes for OpenShift |url=https://blog.openshift.com/red-hat-chose-kubernetes-openshift/ |website=blog.openshift.com |access-date=2016-11-07 |archive-url=https://web.archive.org/web/20170221010202/https://blog.openshift.com/red-hat-chose-kubernetes-openshift/ |archive-date=2017-02-21 }}</ref> (являющейся, по сути, расширенной версией Kubernetes, часто даже называемой «дистрибутивом Kubernetes»), [[CoreOS]] включила систему в состав коммерческой версии дистрибутива Container Linux Tectonic, а [[IBM]] использовала его в IBM Cloud Container Service<ref>{{cite web|title=IBM Launches Bluemix Container Service with Kubernetes to Fuel Highly Secure and Rapid Development of Cognitive Apps|url=http://www-03.ibm.com/press/us/en/pressrelease/51843.wss|website=ibm.com|access-date=2017-11-21|language=en|archive-date=2017-08-24|archive-url=https://web.archive.org/web/20170824031757/https://www-03.ibm.com/press/us/en/pressrelease/51843.wss|url-status=live}}</ref><ref>{{cite web|title=IBM chases Google, Microsoft with Kubernetes in the cloud|url=https://www.infoworld.com/article/3182807/cloud-computing/ibm-chases-google-microsoft-with-kubernetes-in-the-cloud.html|website=infoworld.com|access-date=2017-11-21|language=en|archive-date=2017-12-01|archive-url=https://web.archive.org/web/20171201042834/https://www.infoworld.com/article/3182807/cloud-computing/ibm-chases-google-microsoft-with-kubernetes-in-the-cloud.html|url-status=live}}</ref> и в продукте IBM Cloud Private<ref>{{cite web|title=IBM Announces IBM Cloud Private |url=https://www.ibm.com/cloud-computing/products/ibm-cloud-private/ |website=ibm.com |access-date=2017-11-01 |language=en |archive-url=https://web.archive.org/web/20171101200256/https://www.ibm.com/cloud-computing/products/ibm-cloud-private/ |archive-date=2017-11-01 }}</ref><ref>{{cite web|title=IBM Cloud Private brings cloud native computing to your data center |url=https://techcrunch.com/2017/10/31/ibm-cloud-private-brings-cloud-native-computing-to-your-data-center/?ncid=rss |website=techcrunch.com |access-date=2017-11-02 |language=en |archive-url=https://web.archive.org/web/20171103083902/https://techcrunch.com/2017/10/31/ibm-cloud-private-brings-cloud-native-computing-to-your-data-center/?ncid=rss |archive-date=2017-11-03 }}</ref><ref>{{cite web|title=IBM Cloud Private launches with bet open architecture wins hybrid cloud scrum |url=http://www.zdnet.com/article/ibm-cloud-private-launches-with-bet-open-architecture-wins-hybrid-cloud-scrum/ |website=zdnet.com |access-date=2017-11-02 |language=en |archive-url=https://web.archive.org/web/20171103040503/http://www.zdnet.com/article/ibm-cloud-private-launches-with-bet-open-architecture-wins-hybrid-cloud-scrum/ |archive-date=2017-11-03 }}</ref>. Корпорация [[Oracle]] присоединилась к Cloud Native Computing Foundation в сентябре 2017 и включила Kubernetes в состав [[Oracle Cloud]] и [[Oracle Linux]]<ref>{{Cite news|url=https://www.cncf.io/announcement/2017/09/13/oracle-joins-cloud-native-computing-foundation-platinum-member/|title=Oracle Joins Cloud Native Computing Foundation as Platinum Member - Cloud Native Computing Foundation|date=2017-09-13|work=Cloud Native Computing Foundation|language=en|archive-date=2017-12-01|archive-url=https://web.archive.org/web/20171201031045/https://www.cncf.io/announcement/2017/09/13/oracle-joins-cloud-native-computing-foundation-platinum-member/|access-date=2018-02-16}}</ref>.

Считается, что к концу 2010-х годов Kubernetes стал стандартом де-факто для использования в облачных системах и сервисах по модели [[PaaS]], предусматривающих контейнеризацию приложений, в частности, является основой контейнеризационных сервисов ряда крупнейших [[Публичное облако|публично-облачных]] провайдеров — [[Amazon]] ([[Amazon Web Services|AWS]] Elastic Container Service), [[Microsoft]] ([[Microsoft Azure]] Containers), Google ([[Google Cloud Platform]] Kubernetes Engine). С 2019 года компанией {{iw|Rancher Labs}} развивается дистрибутив [[k3s]] — облегчённый вариант Kubernetes, нацеленный на развёртывание в средах с ограниченными вычислительными ресурсами.

При этом развиваются и альтернативные продукты для [[Оркестровка (ИТ)|оркестровки]] контейнеризированных приложений — {{iw|Docker Swarm}} от фирмы-разработчика [[Docker]] и [[Nomad (система оркестровки)|Nomad]] от компании {{iw|HashiCorp}}. По сравнению с Docker Swarm, Kubernetes функционально богаче, но обладает более высоким порогом вхождения в технологию. При переходе от Docker Swarm к Kubernetes необходимо использовать приложение Kompose для конвертации созданных в Docker Compose файлов описаний оркестровки в формат, поддерживаемый Kubernetes.

== Примечания ==
{{примечания}}

== Литература ==
* {{книга
|автор = Лукша М.
|заглавие = Kubernetes в действии
|оригинал = Kubernetes in Action
|издательство = [[ДМК Пресс]]
|место = М.
|год = 2018
|страниц = 672
|isbn = 978-5-97060-657-5
}}

== Ссылки ==
* {{github|kubernetes|kubernetes}}
* [http://kubernetesbyexample.com/ Kubernetes By Example] руководство по Kubernetes, разработанное командой OpenShift.
* [https://hub.kubeapps.com/ Хаб Kubeapps] — каталог файлов конфигурации приложений, подготовленных для их запуска в Kubernetes.

{{внешние ссылки}}
{{Свободное и открытое программное обеспечение Google}}

[[Категория:Программы для контейнеризации]]
[[Категория:Программное обеспечение для Linux]]
[[Категория:Конфигурационное управление]]
[[Категория:Свободное программное обеспечение, написанное на Go]]
[[Категория:Программное обеспечение с лицензией Apache]]

title: Kubernetes

Тип: свободное и открытое программное обеспечение, сертификация и container orchestrator

Разработчики: Google и Cloud Native Computing Foundation

Написана на: Go[…]

Операционные системы: Linux, Windows и macOS

Лицензия: Apache License 2.0

Сайт: kubernetes.io (англ.)