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