Оружие DevOps: Kubernetes

Kubernetes – система управления кластером из Docker (или Rocket) контейнеров, то есть формально это таки система оркестровки (оркестратор). Тем не менее, поскольку возможности продукта выходят далеко за рамки этого определения, поэтому многие считают Kubernetes фреймворком для кластеризации контейнеров. Основанная на службах etcd и systemd, Kubernetes родилась в недрах корпорации Google и написана на языке Go. Изначально проект был задуман в то время, когда основными инструментами виртуализации были исключительно гипервизоры, со всеми вытекающими радостями, вроде загрузки одной виртуальной машины в течении десятков секунд.
Возможности масштабирования Kubernetes на самом деле впечатляют – система может работать с физическими серверами (и обычными ПК), контейнерами виртуализации ОС и облачными сервисами (виртуальными машинами), поддерживает множество файловых систем (вернее, объединяет их в единый виртуальный каталог для всех рабочих контейнеров одного pod-а), а также множество других вкусностей.
Какие задачи актуальны для действительно большого (а хотя бы и небольшого!) кластера контейнеров?
- своевременный запуск контейнеров на каждом из хостов кластера
- мониторить текущее состояние каждого из них
- управлять размещением и репликацией контейнеров
- производить балансировку всех хостов
Схематически, Kubernetes включает в себя главный сервер (master server) с интерфейсом командной строки, и несколько подчиненных серверов, именующихся нодами или миньонами (nodes/minions).
Главный сервер
Master server управляет всем кластером с помощью Kubernetes API (консольный интерфейс, конфигурирование выполняется службой kubecfg) и содержит соответствующие компоненты. Ответственность мастера – обработка событий внутри облака, таких как запуск нового pod-a.
Формально главный сервер может выполняться вместе с собственно рабочей нодой, однако на практике пользовательские компоненты на нем деактивируются, оставляя управляющие kube-scheduler, kube-apiserver, etcd, kube-controller-manager и некоторые дополнения (DNS, kube-ui, cluster-monitoring и fluentd-elasticsearch).
Узел (нода)
Физически узел Kubernetes представляет собой хост, на котором работает сервис Kubelet – как собственно “железный” сервер, так и виртуальная машина.
На одном хосте совместно трудятся один или несколько pod-ов, обслуживающихся следующими сервисами:
- kubelet – собственно основной сервис ноды. Эта служба мониторит и обслуживает все контейнеры данного узла – управляет распределением памяти, подгружает настройки pod-а, запускает и мониторит состояние Docker-ов.
- kube-proxy – обрабатывает соединения и сетевые правила хоста
- docker – ну, собственно, очевидно
- rkt – то, что вместо docker-а
- monit – служба поддержки демонов kubelet и docker
Текущий статус каждого миньона описывается параметрами:
- внешний и внутренний IP-адреса и имя хоста (вместе составляют адрес)
- фаза ноды – выполнение, ожидание либо узел уничтожен
- состояние (подвиды базового Ready) – True (готовность к pod-у), False (сбои, pod не запустится), либо Unknown (нет информации о ноде)
- мощность – сведения об оперативной памяти, процессоре и максимальном количестве pod
- общие данные – номер ревизии ядра, системы Kubernetes, docker-а, а также ОС
Pod-ы
Pod – логическая сущность, объединяющая несколько контейнеров одного узла (например, контейнеры веб-сервера и БД). Физически все контейнеры Pod-а имеют общие ресурсы – каталоги данных, пространство сетевых имен и IP-адрес. Все эти ресурсы доступны на протяжении существования самого Pod-а.
Kubernetes берет на себя вопрос бесперебойной работы всех контейнеров в рамках каждого Pod-а – если один из них умирает, система запускает его вновь.
Так же точно контролируется количество необходимых реплик – если в настройках указано 5 копий, то контроллер репликации будет следить, чтобы их было запущено именно такое количество, до-запуская необходимые или останавливая лишние.
Контроллер репликаций
Помимо сказанного выше, контроллер репликаций следит также за количеством работающих Pod-ов.
Нужно сказать, что Kubernetes не решает вопрос балансировки трафика и нагрузки – для этой цели параллельно используются такие инструменты, как Nginx и HAproxy.
Решили ознакомиться со всеми тонкостями устройства и настройки Kubernetes?
Мы ждем вас на курсе “L3-DevOps”!