Развертывание контейнерного приложения для среднего IT-специалиста — технически несложная задача. При использовании Docker все выглядит довольно просто. Создается Dockerfile, содержащий последовательность команд, необходимых для загрузки и установки зависимостей приложения, а также формирования правильной конфигурации окружения в рамках самой операционной системы.
Запуск, управление и остановка контейнеров — еще более тривиальная задача. Несколько консольных команд и несколько runtime-демонов — вот и все!
Проблемы возникают при масштабировании инфраструктуры сервиса. Когда приложение становится сложнее и объемнее, разговоры о конфигурации контейнеров сменяются на разговоры об их управлении и оркестровке.
Приложение (или готовый продукт/сервис) по мере роста сложности становится все более децентрализованным. Вчерашние компоненты в рамках одной кодовой базы превращаются в микросервисы — отдельные процессы, выполняющие свою узкоспециализированную функцию и иногда физически размещенные у разных облачных провайдеров.
По сути, приложение становится тем, что в теории систем называют «системой с нередуцированной сложностью». Теперь это отдельные инкапсулированные друг от друга сущности-контейнеры.
Возникают вопросы об их правильной связи, синхронизации и коммуникации. Вопросы об отношении одних контейнеров с другими. А как мы знаем, когда растет сложность — нужно абстрагироваться. Иначе твой IT-продукт превратиться в трудно поддерживаемую кодовую лапшу с тяжким и болезненным «легаси».
На помощь приходят системы оркестрации.
Kubernetes — это платформа с открытым исходным кодом, которая автоматизирует операции с контейнерами в Linux. Оркестрация исключает множество ручных манипуляций, важных для развертывания и масштабирования контейнерных приложений.
Вы можете объединить группы разных хостов с запущенными контейнерами в единую систему и благодаря Kubernetes вы в ней не запутаетесь.
Независимо от того, работает ли ваше приложение на базе одного компьютера или полноценного центра обработки данных, каждый компонент программного обеспечения выполняет свою специальную функцию
Первый вариант приведет к абсолютному хаосу. Второй вариант добавит порядка и структуры — это и есть оркестрация Kubernetes.
Иными словами, Kubernetes обеспечивает дополнительный уровень координации, объединяющий отдельные контейнеры в единое целое.
Разумеется, Kubernetes, будучи довольно гибким, стал своего рода стандартом оркестрации. Можно сказать, этот инструмент — монополист в области управления контейнерами. Причем настолько, что Kubernetes часто считают синонимом слова «оркестрация». И наоборот, соответственно.
При этом Kubernetes некогда был разработан командой из Google, но потом был передан «под крыло» Cloud Native Computing Foundation (CNCF). После этого инструмент оброс огромным сообществом.
Разумеется, больше всего в развитие проекта вложились Google и Red Hat — последние построили на его основе PaaS-платформу Red Hat OpenShift.
Кстати, многие считают, что Kubernetes (и сервисы на его базе) конкурируют с Docker, являясь его антагонистом. Однако это не так.
Docker и Kubernetes — инструменты, расположенные на разных уровнях абстракций. Первый — контейнеризатор, управляющий контейнерами. Второй — оркестратор, «отдающий команды» контейнеризатору.
Ведь «kubernetes» — греческое слово, означающее «капитан». Капитан управляет, распределяет, защищает.
Поэтому, стоит сразу проговорить нюансы, касающиеся отношения Kubernetes и Docker:
Самое основное преимущество и причина использовать Kubernetes — автоматизация ручного труда.
Как крупные компании, так и небольшие проекты используют Kubernetes (и сервисы на его основе) для экономии человеко-часов (а значит и денег) на управлении экосистемами.
Kubernetes автоматически «понимает», как использовать ресурсы наилучшим образом — здесь не нужна человеческая аналитика и постоянный контроль.
Оркестрация снижает время простоя серверов, а также требует меньше поддержки в случае сбоя узла — правильно описанная логика исключает восстановление работы вручную.
К тому же, управление жизненным циклом контейнеров представляет собой цикличные однообразные действия. Их глупо повторять вручную. Эту задачу нужно доверить системе.
Все это вкупе исключает и менее явные издержки — неумелое и неэффективное администрирование, формирующее слоеный пирог проблем и ошибок, который рано или поздно рухнет.
Вертикальная гибкость (впрочем, как и горизонтальная) — важная особенность Kubernetes. В зависимости от фактических потребностей приложения могут корректировать задействование ресурсов (количество контейнеров и микросервисов) в конкретный момент времени — по сути, мгновенно.
Вы можете увеличивать как количество доступных контейнеров Kubernetes, так и пропускную способность уже работающих — за счет настройки процессора и оперативной памяти. Например, за счет использования специального компонента Cluster Autoscaler.
За счет высокого абстрагирования возможна интеграция контейнеров и их ресурсов от различных поставщиков облачных услуг. Все это упрощает разработку, тестирование и развертывание — все то, что так важно в CI/CD-подходах.
Автоматизация и горизонтальная централизация, присущая контейнерам Kubernetes, упрощает и улучшает применяемые принципы DevOps, тем самым сокращая временные интервалы между выпусками и развертываниями.
Это особенно актуально в приложениях, основанных на микросервисной архитектуре, когда отдельные функциональные блоки взаимодействуют друг с другом через определенное API.
Благодаря оркестрации команды разработчиков могут быть меньше и, соответственно, дешевле.
Инструмент находится под руководством сообщества. Это значит, что существует огромное количество производных сервисов и платформ — например, таких как Red Hat OpenShift.
К тому же благодаря этому такие общедоступные облака, как IBM, AWS, Google Cloud и Microsoft Azure, обеспечивают гораздо лучшую поддержку.
Kubernetes построен на клиент-серверной архитектуре. Да, установка с несколькими главными серверами (для повышения доступности) возможна, но так или иначе всегда используется один главный сервер — управляющий узел.
Главный сервер включает в себя некоторые основные компоненты. Например, Kube-apiserver, хранилище etcd, диспетчер-контроллер Kube, диспетчер облачных контроллеров, планировщик Kube и DNS-сервер.
В частности, это CLI-интерфейс командной строки kubectl
, который является входной точкой для выполнения команд управления приложением.
То есть используется стандартный синтаксис по схеме: kubectl [команда] [тип] [имя] [флаги]
.
Однако прежде чем начинать разработку в Kubernetes, имеет смысл разобраться с его базовыми сущностями:
Так как Kubernetes является довольно гибким и универсальным инструментом, есть множество способов его использовать. Однако, в этой статье мы рассмотрим только самые основные.
Kubernetes идеально справляется с управлением множеством контейнеров.
Контейнерные приложения, работающие в Kubernetes, легко развертывать и управлять ими благодаря среде выполнения контейнера Kubernetes Containerd
. Эта среда выполнения контейнера с открытым исходным кодом была разработана Google для использования в Kubernetes и других облачных платформах. Его также можно использовать как отдельный инструмент для запуска и развертывания контейнеров локально или на ваших собственных серверах.
Kubernetes может использоваться не только для разработки отдельных приложений (т.е. как обычный оркестратор), но и для создания полноценных облачных платформ.
Например, более простой оркестратор Docker Swarm не обладает такой гибкостью и масштабируемостью, выполняя более узкие задачи по управлению контейнерами.
У Kubernetes есть целый пул инструментов для мониторинга, логирования и сбора метрик всей экосистемы.
Все это необходимо для анализа состояния кластеров и устранения возможных проблем. Поэтому мониторинг — один из самых популярных вариантов использования Kubernetes.
Некоторые из популярных решений мониторинга, разработанные специально под Kubernetes:
Kubernetes позволяет настраивать сетевые политики, которым будут следовать приложения и их кластеры. По сути, это набор правил, определяющий паттерны взаимодействия модулей как друг с другом, так и с внешними сервисами.
Управление сетевой политикой — важный компонент безопасности Kubernetes. Важно убедиться в том, что приватные ресурсы закрыты от внешних сред, а публичные доступны для пользователя приложения, являясь частью открытого интерфейса.
Таким образом предотвращается компрометация сервиса злоумышленниками, а также снижается вероятность наличия различных сетевых бэкдоров или открытых портов прослушивания.
Альтернативой самостоятельного развертывания и поддержки Kubernetes на своих машинах может выступить «аутсорсинг» на заранее готовой инфраструктуре облачного провайдера. По сути это полноценный PaaS, но в контексте Kubernetes такие платформы называют KaaS.
Преимуществ много:
По сути KaaS снижает порог входа для небольших команд. Требуется меньше времени, меньше сотрудников и меньше экспертности.
Тем не менее, уникальные требования к продукты, исходящие от более крупного (и сложного) рыночного игрока могут не «вместиться» в предложение среднего KaaS-провайдера. Экосистема начнет «упираться» в границы. При этом крупные компании довольно щепетильно относятся к контролю и конфиденциальности — размещать инфраструктуру на собственных физических серверах для них нередко в приоритете.
Установка оркестратора представляет собой развертывание кластера Kubernetes. От начала до конца этот процесс можно поделить на несколько шагов:
apt-transport-https
, ca-certificates
, curl
.У нас есть небольшая инструкция о том, как развертывать Kubernetes-кластеры. А на официальном сайте Kubernetes есть материалы о том, как начать использовать оркестратор, а также туториалы по базовым возможностям.
Очевидно, что Kubernetes останется ведущей системой оркестрации контейнеров. И скорее всего его популярность будет только расти — все больше предприятий и небольших команд (в том числе и начинающие разработчики) будут использовать возможности Kubernetes.
Использование Kubernetes дает множество преимуществ:
Эти достоинства и их итоговый результат ведут к повышению удовлетворенности пользователей и IT-отделов в крупных компаниях. С другой стороны, один из недостатков Kubernetes — порог входа для менее опытных разработчиков несколько выше.
Все это особенно актуально при внедрении DevOps и конвейера непрерывной интеграции и развертывания (CI/CD). Управление жизненным циклом контейнеров с помощью Kubernetes наряду с DevOps-подходами помогает согласовать и понятно структурировать разработку программного обеспечения.