Kubernetes
Введение
Kubernetes (от др.-греч. κυβερνήτης — «кормчий», «рулевой», часто также используется нумероним K8s) — открытое программное обеспечение
для оркестровки контейнеризированных приложений — автоматизации их развёртывания, масштабирования и координации в условиях кластера.
Поддерживает основные технологии контейнеризации, включая
Docker
, rkt, также возможна поддержка технологий аппаратной виртуализации.
Оригинальная версия была разработана компанией Google для внутренних нужд, впоследствии система передана под управление Cloud Native Computing Foundation.
Используются рядом крупных организаций и интернет-проектов, в частности, инфраструктура фонда Wikimedia Foundation перенесена с самостоятельно разработанного программного обеспечения для организации кластеров на Kubernetes.
Написан на языке
Go
.
Концепции
Под (pod)
pod, с англ.«стручок, кокон», также модуль — базовая единица для запуска и управления приложениями: один или несколько контейнеров, которым
гарантирован запуск на одном узле, обеспечивается разделение ресурсов и межпроцессное взаимодействие и предоставляется уникальный в пределах кластера
IP-адрес
.
Последнее позволяет приложениям, развёрнутым на поде, использовать фиксированные и предопределённые номера портов без риска конфликта.
Поды могут напрямую управляться с использованием API Kubernetes или управление ими может быть передано контроллеру.
Узел (node)
Отдельная физическая или виртуальная машина, на которой развёрнуты и выполняются контейнеры приложений.
Каждый узел в кластере содержит сервисы для запуска приложений в контейнерах
(например Docker, а также компоненты, предназначенные для
централизованного управления узлом.
Узел состоит из следующих компонент:
Kubelet
Container Runtime (CRI - Container Runtime Interface. Например Docker, containerd, CRI-O, katacontainers, gVisor)
Kube-proxy
Один или несколько подов.
Некоторые облачные провайдеры предоставляют K8s без нодов. Так называемый nodeless K8s. Работать там можно напрямую с подами, а всё более низкоуровневое спрятано «под капот»
Том (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-адрес.
1. Kubelet
Kubelet - это главный Kubernetes agent. На каждом узле работает по kubelet.
Отвечает за статус выполнения подов на узле — отслеживает, корректно ли выполняется каждый из контейнеров, находясь в рабочем состоянии.
Kubelet обеспечивает запуск, остановку и управление контейнерами приложений, организованными в поды. После установки kubelet на узел - он регистрируется в кластере и следит за API сервером чтобы получать задания
Функционально Kubelet можно рассматривать как аналог supervisord.
Если обнаруживается, что какой-то из подов находится в неверном состоянии, компонент пытается осуществить его повторное развёртывание и перезапуск на узле.
Статус самого узла отправляется на подсистему управления каждые несколько секунд в форме диагностических сообщений (heartbeat message).
Если мастер-узел, исходя из содержания этих сообщений или их отсутствия, обнаруживает, что конкретный узел не работает должным образом, процесс подсистемы управления Replication Controller пытается перезапустить необходимые поды на другом узле, находящемся в рабочем состоянии.
2. Container runtime
Container Runtime (CRI - Container Runtime Interface. Например Docker, containerd, CRI-O, katacontainers, gVisor)
3. Kube-proxy
Компонент, являющийся комбинацией сетевого прокси-сервера и балансировщика нагрузки.
Реализованные в нём операции сетевого уровня используют абстракцию сервиса.
Он отвечает за маршрутизацию входящего трафика на конкретные контейнеры, работающие в пределах пода, расположенного на узле.
Маршрутизация обеспечивается на основе IP-адреса и порта входящего запроса.
4. cAdvisor
Агент системы внутреннего мониторинга Kubernetes, собирающий метрики производительности и информацию об использовании контейнерами, работающими в пределах узла, таких ресурсов как время работы центрального процессора, оперативной памяти, нагрузку на файловую и сетевую системы.
5. Поды
В узле может быть несколько подов. Каждый под может содержать в себе несколько контейнеров.
Разработка и развёртывание
Kubernetes предоставляет ряд средств для интеграции процессов разработки и развёртывания программного обеспечения, работающего под управлением этой системы.
Среди наиболее часто используемых в этих целях инструментов:
-
Helm — официальный менеджер пакетов Kubernetes, функциональный эквивалент apt-get и yum;
-
Minikube — специализированная конфигурация Kubernetes, предназначенная для развёртывания на локальной машине, например, компьютере разработчика, применяется для изучения и локальных экспериментов над Kubernetes;
-
Skaffold — утилита от Google для локальной разработки в Kubernetes.
Для каждого из подобных инструментов существуют альтернативы, например, вместо Helm иногда используется Terraform.
Некоторое распространение получил и противоположный принятому разработчиками Helm подход, когда файлы ресурсов размещаются в репозитории системы управления версиями и работа с ними ведётся только через неё (обычно Git, такой способ работы предлагает проект kubecfg).
Категорию методологий, предусматривающую ведение конфигураций инфраструктуры Kubernetes в Git в духе «инфраструктура как код» обозначают «GitOps» (реализуют проекты ArgoCD, Flux, werf).
Документация
Deployment: https://kubernetes.io/docs/concepts/workloads/controllers/deployment
Pods: https://kubernetes.io/docs/concepts/workloads/pods/
Service: https://kubernetes.io/docs/concepts/services-networking/service/
Ingress: https://kubernetes.io/docs/concepts/services-networking/ingress/
Ingress Controller: https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
Volumes and Claims: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Secrets: https://kubernetes.io/docs/concepts/configuration/secret/
ConfigMaps: https://kubernetes.io/docs/concepts/configuration/configmap/
Kubernetes | |
Установка в Linux | |
Make |