Архитектура Kubernetes
Чтобы понять, как Kubernetes может предоставить эти возможности, полезно понять, как он спроектирован и организован на высоком уровне. Kubernetes можно визуализировать как систему, построенную по уровням, причем каждый более высокий уровень абстрагируется от сложности, обнаруженной на более низких уровнях.
В своей основе Kubernetes объединяет отдельные физические или виртуальные машины в кластер, используя общую сеть для связи между каждым сервером. Этот кластер представляет собой физическую платформу, на которой настроены все компоненты, возможности и рабочие нагрузки Kubernetes.
Каждой машине в кластере отводится роль в экосистеме Kubernetes. Один сервер (или небольшая группа в высокодоступных развертываниях) функционирует как главный сервер. Этот сервер действует как шлюз и мозг для кластера, предоставляя API для пользователей и клиентов, проверяя работоспособность других серверов, решая, как лучше всего разделить и назначать работу (известное как «планирование»), и организуя взаимодействие между другими компонентами. Главный сервер действует как основная точка контакта с кластером и отвечает за большую часть централизованной логики, которую предоставляет Kubernetes.
Остальные машины в кластере обозначаются как узлы : серверы, отвечающие за прием и выполнение рабочих нагрузок с использованием локальных и внешних ресурсов. Чтобы помочь с изоляцией, управлением и гибкостью, Kubernetes запускает приложения и службы в контейнерах , поэтому каждый узел должен быть оснащен средой выполнения контейнера (например, Docker или rkt). Узел получает рабочие инструкции от главного сервера и соответственно создает или уничтожает контейнеры, корректируя сетевые правила для маршрутизации и пересылки трафика соответствующим образом.
Как упоминалось выше, сами приложения и службы запускаются в кластере внутри контейнеров. Базовые компоненты обеспечивают соответствие желаемого состояния приложений фактическому состоянию кластера. Пользователи взаимодействуют с кластером, связываясь с главным сервером API напрямую или с клиентами и библиотеками. Чтобы запустить приложение или службу, отправляется декларативный план в формате JSON или YAML, определяющий, что создавать и как им управлять. Затем главный сервер берет план и выясняет, как запустить его в инфраструктуре, исследуя требования и текущее состояние системы. Эта группа определяемых пользователем приложений, работающих в соответствии с указанным планом, представляет собой последний уровень Kubernetes.
Компоненты главного сервера
Как мы описали выше, главный сервер действует как основная плоскость управления для кластеров Kubernetes. Он служит основным контактным лицом для администраторов и пользователей, а также предоставляет множество общекластерных систем для относительно простых рабочих узлов. В целом компоненты на главном сервере работают вместе, чтобы принимать запросы пользователей, определять наилучшие способы планирования контейнеров рабочих нагрузок, аутентифицировать клиентов и узлы, настраивать сеть в масштабе кластера, а также управлять масштабированием и обязанностями по проверке работоспособности.
Эти компоненты могут быть установлены на одном компьютере или распределены по нескольким серверам. В этом разделе мы рассмотрим каждый из отдельных компонентов, связанных с главными серверами.
etcd
Один из основных компонентов, необходимых Kubernetes для работы, - это глобально доступное хранилище конфигурации. Etcd проект , разработанный командой в CoreOS, легкий, распределенное хранилище ключ-значение , которое может быть сконфигурировано для пролета по нескольким узлам.
Kubernetes использует etcdдля хранения данных конфигурации, к которым может получить доступ каждый из узлов кластера. Это можно использовать для обнаружения служб и может помочь компонентам настроить или перенастроить себя в соответствии с актуальной информацией. Это также помогает поддерживать состояние кластера с помощью таких функций, как выбор лидера и распределенная блокировка. Предоставляя простой HTTP / JSON API, интерфейс для установки или получения значений становится очень простым.
Как и большинство других компонентов в плоскости управления, etcdего можно настроить на одном главном сервере или, в производственных сценариях, распределить между несколькими машинами. Единственное требование - чтобы он был доступен по сети для каждой машины Kubernetes.
кубе-аписервер
Одна из самых важных мастер-служб - это сервер API. Это основная точка управления всем кластером, поскольку она позволяет пользователю настраивать рабочие нагрузки Kubernetes и организационные подразделения. Он также отвечает за etcdсогласование сведений о магазине и сервисе развернутых контейнеров. Он действует как мост между различными компонентами для поддержания работоспособности кластера и распространения информации и команд.
Сервер API реализует интерфейс RESTful, что означает, что множество различных инструментов и библиотек могут легко взаимодействовать с ним. Клиент под названием kubectl доступен как метод по умолчанию для взаимодействия с кластером Kubernetes с локального компьютера.
Кубе-контроллер-менеджер
Диспетчер диспетчеров - это служба общего назначения, на которую возложено множество обязанностей. В первую очередь, он управляет различными контроллерами, которые регулируют состояние кластера, управляют жизненными циклами рабочих нагрузок и выполняют рутинные задачи. Например, контроллер репликации гарантирует, что количество реплик (идентичных копий), определенных для модуля, соответствует количеству, развернутому в данный момент в кластере. Подробности этих операций записываются etcd, где диспетчер контроллеров отслеживает изменения через сервер API.
Когда замечается изменение, контроллер считывает новую информацию и реализует процедуру, которая выполняет желаемое состояние. Это может включать в себя масштабирование приложения вверх или вниз, настройку конечных точек и т. Д.
кубе-планировщик
Процесс, который фактически назначает рабочие нагрузки определенным узлам в кластере, - это планировщик. Эта служба считывает операционные требования рабочей нагрузки, анализирует текущую среду инфраструктуры и размещает работу на приемлемом узле или узлах.
Планировщик отвечает за отслеживание доступной мощности на каждом хосте, чтобы гарантировать, что рабочие нагрузки не запланированы сверх доступных ресурсов. Планировщик должен знать общую емкость, а также ресурсы, уже выделенные для существующих рабочих нагрузок на каждом сервере.
облачный диспетчер-диспетчер
Kubernetes может быть развернут во многих различных средах и может взаимодействовать с различными поставщиками инфраструктуры, чтобы понимать и управлять состоянием ресурсов в кластере. Хотя Kubernetes работает с общими представлениями ресурсов, такими как подключаемое хранилище и балансировщики нагрузки, ему нужен способ сопоставить их с реальными ресурсами, предоставляемыми неоднородными облачными провайдерами.
Менеджеры облачных контроллеров выступают в качестве связующего звена, которое позволяет Kubernetes взаимодействовать с поставщиками с различными возможностями, функциями и API, сохраняя при этом относительно общие конструкции внутри. Это позволяет Kubernetes обновлять информацию о своем состоянии в соответствии с информацией, полученной от поставщика облачных услуг, настраивать облачные ресурсы по мере необходимости в системе, а также создавать и использовать дополнительные облачные сервисы для удовлетворения рабочих требований, представленных кластеру.
Компоненты сервера узла
В Kubernetes серверы, выполняющие работу за счет запуска контейнеров, называются узлами . У узловых серверов есть несколько требований, которые необходимы для связи с главными компонентами, настройки сети контейнеров и выполнения назначенных им фактических рабочих нагрузок.
Среда выполнения контейнера
Первый компонент, который должен иметь каждый узел, - это среда выполнения контейнера. Обычно это требование удовлетворяется путем установки и запуска Docker , но также доступны альтернативы, такие как rkt и runc .
Среда выполнения контейнера отвечает за запуск и управление контейнерами, приложениями, инкапсулированными в относительно изолированную, но легкую операционную среду. Каждая единица работы в кластере на своем базовом уровне реализована как один или несколько контейнеров, которые необходимо развернуть. Среда выполнения контейнера на каждом узле - это компонент, который в конечном итоге запускает контейнеры, определенные в рабочих нагрузках, отправленных в кластер.
кубелет (kubelet)
Основной точкой контакта для каждого узла с группой кластера является небольшая служба под названием kubelet . Эта служба отвечает за передачу информации в службы уровня управления и из них, а также за взаимодействие с etcdхранилищем для чтения деталей конфигурации или записи новых значений.
В kubeletсервисе обменивается данные с мастером - компонентами для аутентификации в кластер и прием команд и работу. Работа поступает в виде манифеста, который определяет рабочую нагрузку и рабочие параметры. Затем kubeletпроцесс берет на себя ответственность за поддержание рабочего состояния на сервере узла. Он управляет средой выполнения контейнера для запуска или уничтожения контейнеров по мере необходимости.
Кубе-прокси
Для управления подсетями отдельных хостов и предоставления услуг другим компонентам на каждом сервере узла запускается небольшая прокси-служба, называемая kube-proxy . Этот процесс перенаправляет запросы в правильные контейнеры, может выполнять примитивную балансировку нагрузки и, как правило, отвечает за предсказуемость и доступность сетевой среды, но при необходимости изолированную.
Объекты и рабочие нагрузки Kubernetes
В то время как контейнеры являются основным механизмом, используемым для развертывания приложений, Kubernetes использует дополнительные уровни абстракции над интерфейсом контейнера для обеспечения функций масштабирования, отказоустойчивости и управления жизненным циклом. Вместо непосредственного управления контейнерами пользователи определяют экземпляры, состоящие из различных примитивов, предоставляемых объектной моделью Kubernetes, и взаимодействуют с ними. Ниже мы рассмотрим различные типы объектов, которые можно использовать для определения этих рабочих нагрузок.
Pods
Podsк является самым основным блок , который Kubernetes занимается. Сами контейнеры хостам не назначаются. Вместо этого один или несколько тесно связанных контейнеров инкапсулируются в объект, называемый контейнером.
Pod обычно представляет собой один или несколько контейнеров, которыми следует управлять как одним приложением. Поды состоят из контейнеров, которые работают вместе, имеют общий жизненный цикл и всегда должны планироваться на одном узле. Они полностью управляются как единое целое и совместно используют свою среду, тома и IP-пространство. Несмотря на их контейнерную реализацию, вы обычно должны думать о модулях как о едином монолитном приложении, чтобы лучше понять, как кластер будет управлять ресурсами и расписанием модуля.
Обычно поды состоят из основного контейнера, который удовлетворяет общему назначению рабочей нагрузки, и, необязательно, некоторых вспомогательных контейнеров, которые облегчают выполнение тесно связанных задач. Это программы, которые выигрывают от запуска и управления в своих собственных контейнерах, но тесно привязаны к основному приложению. Например, в модуле может быть один контейнер, в котором запущен основной сервер приложений, и вспомогательный контейнер, загружающий файлы в общую файловую систему при обнаружении изменений во внешнем репозитории. Горизонтальное масштабирование на уровне модуля обычно не рекомендуется, потому что есть другие объекты более высокого уровня, более подходящие для этой задачи.
Как правило, пользователи не должны управлять модулями самостоятельно, поскольку они не предоставляют некоторых функций, которые обычно требуются в приложениях (например, сложного управления жизненным циклом и масштабирования). Вместо этого пользователям предлагается работать с объектами более высокого уровня, которые используют модули или шаблоны модулей в качестве базовых компонентов, но реализуют дополнительные функции.
Комментариев нет:
Отправить комментарий