Содержание статьи
Задумывались ли вы, почему Kubernetes так популярен? Рассказываем, что такое Kubernetes и как с его помощью масштабировать быстрорастущие приложения.
Что такое Кубернетес?

С Kubernetes вы можете развертывать облачные приложения где угодно и управлять ими без особых сложностей. Kubernetes (также известный как K8s) — это программное обеспечение с открытым исходным кодом для развертывания, масштабирования и управления контейнерными приложениями. В качестве оркестратора Kubernetes выполняет работу по планированию контейнеров в кластере и управляет рабочими нагрузками, чтобы гарантировать, что они выполняются так, как вы задумали. Kubernetes с самого начала создавался с идеей совместной разработки программного обеспечения и эксплуатации. Поэтому операционные задачи и то, как они выполняются, — неотъемлемые компоненты архитектуры и дизайна Kubernetes.
Почти всё в Kubernetes использует декларативные конструкции, которые описывают, как составляются приложения, как они взаимодействуют и как ими управляют. Такая схема помогает повысить работоспособность и переносимость современных программных систем. Поэтому разработчикам, использующим Kubernetes, легко внедрять рабочие процессы GitOps в свои конвейеры разработки — а это увеличивает скорость и надежность развертывания функций.
Инфраструктуры и микросервисы на основе контейнеров открывают новые возможности для развертывания программного обеспечения: появляется потенциал для компаний, которые хотят создавать масштабируемые, гибкие и распределенные приложения. Недавно ведущие разработчики мировых компаний и вовсе начали стандартизировать Kubernetes как единую целевую архитектуру, создавая возможности для согласования методов DevOps с конкретной целью развертывания.
Преимущества: зачем использовать Kubernetes?

Будучи первым проектом Cloud Native Cloud Foundation (CNCF), Kubernetes является самым быстрорастущим проектом в истории программного обеспечения с открытым исходным кодом. K8 стал популярным по следующим основным причинам:
- Портативность
Kubernetes предлагает мобильность и более быстрое и простое развертывание. Это означает, что компании могут воспользоваться преимуществами нескольких облачных провайдеров, если это необходимо, и могут быстро расти без необходимости перепроектировать свою инфраструктуру.
- Масштабируемость
Возможность Kubernetes запускать контейнеры в одной или нескольких общедоступных облачных средах, на виртуальных машинах или на «голом железе» означает, что его можно развернуть практически в любом месте. А поскольку Kubernetes коренным образом изменил способ разработки и развертывания, команды тоже могут масштабироваться намного быстрее, чем в прошлом.
- Высокая доступность
Kubernetes обеспечивает высокую доступность как на уровне приложений, так и на уровне инфраструктуры. Добавление надежного уровня хранения в Kubernetes гарантирует высокую доступность рабочих нагрузок с отслеживанием состояния. А еще главные компоненты кластера могут быть настроены на многоузловую репликацию (multi-master), что также обеспечивает более высокую доступность.
- Открытый исходный код
Поскольку Kubernetes является открытым исходным кодом, можно воспользоваться обширной экосистемой других инструментов с открытым исходным кодом, разработанных специально для работы с Kubernetes без привязки к закрытой/проприетарной системе.
- Доказано и испытано в бою
Огромная экосистема разработчиков и инструментов с 5 608 репозиториями GitHub и их количество означает, что без помощи и консультаций вас не оставят.
- Лидер рынка
Kubernetes был разработан, используется и поддерживается Google. Во-первых, это повод больше доверять продукту. Во-вторых, это позволяет разработчикам Kubernetes регулярно исправлять ошибки и выпускать новые функции.
Архитектура Kubernetes 101

Архитектура Kubernetes делает его мощным. Kubernetes имеет базовую клиентскую и серверную архитектуру, но это далеко не все. Kubernetes может выполнять последовательные обновления, он адаптируется к дополнительным рабочим нагрузкам за счет автоматического масштабирования узлов, если это необходимо, а еще может самовосстанавливаться в случае сбоя модуля. Эти встроенные способности дают разработчикам и операционным группам огромное преимущество, заключающееся в том, что приложения практически не будут простаивать.
Мастер Кубернетес
Мастер Kubernetes — это основной блок управления кластером. Мастер отвечает за управление и планирование рабочих нагрузок в дополнение к сети и связи во всем кластере.
Вот компоненты, которые работают на мастере:
- Etcd Storage – хранилище данных типа «ключ-значение» с открытым исходным кодом, к которому могут получить доступ все узлы в кластере. Он хранит конфигурационные данные о состоянии кластера.
- Kube-API-Server – сервер API управляет запросами от рабочих узлов, получает REST-запросы на изменения и служит интерфейсом для управления кластером.
- Kube-scheduler — планирует модули на узлах на основе использования ресурсов, а также решает, где развертывать службы.
- Kube-controller-manager — запускает в фоновом режиме несколько отдельных процессов контроллера, чтобы регулировать общее состояние кластера и выполнять рутинные задачи. Когда происходит изменение службы, контроллер распознает это изменение и инициирует обновление, чтобы привести кластер в желаемое состояние.
Рабочие узлы
Эти узлы выполняют рабочие нагрузки в соответствии с расписанием, предоставленным мастером. Взаимодействие между главным и рабочим узлами называется плоскостью управления.
- Kubelet гарантирует, что все контейнеры в узле работают и находятся в работоспособном состоянии. Если узел выходит из строя, контроллер репликации наблюдает за этим изменением и запускает модули на другом исправном модуле. В двоичный файл kubelet встроен «cAdvisor», который автоматически обнаруживает все контейнеры и собирает статистику использования ЦП, памяти, файловой системы и сети. Еще kubelet предоставляет статистику использования компьютера путем анализа «корневого» контейнера.
- Kube Proxy — действует как сетевой прокси и балансировщик нагрузки. Еще он перенаправляет запрос нужным модулям в изолированных сетях в кластере.
- Поды это основной строительный блок в Kubernetes. Он представляет рабочие нагрузки, которые развертываются. Поды обычно представляют собой наборы связанных контейнеров, но под может также иметь только один контейнер. Модуль совместно использует сеть/хранилище и спецификацию того, как запускать контейнеры.
- Контейнеры — это самый низкий уровень микросервиса. Они размещаются внутри модулей и требуют внешних IP-адресов для просмотра любых внешних процессов.
Где запустить Kubernetes?

Каков первый шаг после того, как вы решили запускать свои приложения в Kubernetes? Где вы будете запускать кластер и как вы собираетесь его запускать?
Варианты использования Kubernetes полностью зависят от ваших конкретных требований. Вот о чем следует задуматься:
- Бюджет
Возможно, вам придется взглянуть на бюджет не только с точки зрения денег, но и с точки зрения времени. Сколько времени вы можете потратить на настройку кластера и, что более важно, на его обслуживание?
- Соображения безопасности
В компании могут быть особые требования безопасности, которые не позволят работать в общедоступном облаке. Это, очевидно, серьезно ограничит количество вариантов для запуска вашего кластера.
- Гибридные решения
У вас есть существующая инфраструктура? У вашей компании уже есть серверы, на которых должна работать часть вашей инфраструктуры?
- А как насчет ваших данных?
Есть ли у вас строгие правила, определяющие, где должны храниться ваши данные, например, в определенной стране?
При принятии решения о том, где запустить свой кластер, необходимо учитывать все эти факторы. Конечно, использование облачного провайдера это самый удобный способ. По сути, вы позволяете кому-то другому управлять вашими кластерами, а еще можете пользоваться преимуществами различных доступных сервисов. Это позволяет вам сосредоточиться на реальном продукте и создавать ценность для бизнеса вместо энергоемкого управления инфраструктурой.
Поставщики общедоступных облаков Kubernetes, локальные решения в сравнении с PaaS или частным облаком
У всех основных облачных провайдеров есть либо управляемые решения Kubernetes, либо возможность создать собственный кластер с нуля. Вот краткий обзор:
- AWS против EKS
Запуск Kubernetes на Amazon дает вам широкий выбор сред выполнения и сервисов, которыми вы можете воспользоваться. Вы можете самостоятельно установить и запустить Kubernetes на AWS. Ручная самостоятельная установка обеспечит вам максимальную гибкость с точки зрения доступа к сервисам AWS.
Но если вы не хотите самостоятельно устанавливать и настраивать Kubernetes, вы можете использовать их управляемую службу Kubernetes. При использовании управляемого сервиса плоскость управления управляется и обслуживается Amazon; вам гарантирован высокодоступный кластер и доступ к самым популярным сервисам, таким как CloudWatch и RDS.
- GCP, GKE и локальный Kubernetes
Очевидная причина запуска Kubernetes на GCP заключается в том, что Google является создателем Kubernetes. Запуск вашего кластера на их платформе может дать вам преимущество: в отличие от ваших конкурентов вы сможете быстрее воспользоваться преимуществами любых новых функций. Но все же GCP скорее закрытая система. Это может быть преимуществом, если вам нужен автоматизированный кластер Kubernetes и вам не хочется беспокоиться о ручной подготовке серверов.
- Интегрированные службы Google с GKE.
GKE также интегрируется со всеми другими инструментами Google и поставляется со встроенными функциями ведения журналов, управления журналами и мониторинга как на уровне хоста, так и на уровне контейнера. Он может обеспечить автоматические:
— масштабирование;
— управление оборудованием;
— обновление версий.
В целом GKE предоставляет вам готовый к работе кластер с более «аккумуляторным» подходом, чем если бы вы строили все с нуля.
- Локальная версия
Если вам нужно хранить свои данные и серверы внутри компании, вам нужно будет самостоятельно установить и обновить Kubernetes на серверах без операционной системы. Конечно, в этом есть свои плюсы и минусы. Преимущество в том, что вы контролируете свои данные и серверы. Минусы — это сложно настроить, а для обслуживания инфраструктуры потребуется много сотрудников.
- PaaS и частные облачные решения
Существует также огромное количество решений PaaS и вариантов частного облака, которые предлагают что-то среднее между полностью заблокированным решением и полной свободой выбора необходимых инструментов. Дальше зависит от вашего бюджета и желания применять инструменты OSS. Возможно, один из следующих вариантов — ваше оптимальное решение.
Некоторые из этих вариантов включают в себя:
- Tectonic
- IBM private cloud
- Kubermatic
- Platform9
- OpenShift
- Rancher Container Manager
CICD Pipelines
Еще один важный шаг на пути к Kubernetes — создание конвейеров непрерывной интеграции и непрерывной доставки (CICD). Чтобы повысить скорость работы вашей команды и воспользоваться другими преимуществами автоматизации, вам необходимо тщательно продумать, как вы будете осуществлять переход и какие инструменты при этом вы хотите использовать.
Зачем автоматизировать конвейер?

- Сократите время выхода на рынок с недель и месяцев до дней или часов.
Благодаря автоматизированному конвейеру команды разработчиков повышают как скорость выпуска релизов, так и качество кода. Новые функции и исправления, добавляемые постепенно небольшими порциями, могут привести к уменьшению багов в продукте.
- Усилите команду разработчиков.
Поскольку все этапы конвейера доставки доступны для изучения, улучшения и проверки любому члену команды, создается чувство ответственности за сборку. А это способствует тесной командной работе и приносит пользу всей компании.
- Снизите риски и затраты на разработку программного обеспечения.
Автоматизация побуждает разработчиков проверять изменения кода поэтапно, прежде чем двигаться дальше: опять-таки меньше багов.
- Сократите время работы.
Конвейер CD обеспечивает быструю петлю обратной связи, начиная с разработки и заканчивая вашими клиентами. Этот итерационный цикл не только помогает вам создать правильный продукт, но и позволяет разработчикам быстрее улучшать продукт и закрывать спринты раньше.
Одна из сложностей при создании пайплайна — удачно склеить инструменты, которые вы хотели бы использовать (как с открытым исходным кодом, так и с закрытым исходным кодом). При разработке конвейеров развертывания возникают следующие сложности с установлением:
- Сквозной безопасности по всему конвейеру;
- Возможности отката с полностью воспроизводимым журналом аудита;
- Встроенных возможностей наблюдения и оповещения.
Нужно обратить внимание и на то, какое среднее время развертывания и восстановления.
Лучшие практики разработки приложений в Kubernetes

Поскольку Kubernetes настолько гибок, есть много разных способов выполнить одну и ту же задачу. При разработке приложений в Kubernetes ваша команда должна управлять следующими областями:
Архитектура приложения
- Используйте диаграммы Helm для упаковки своих приложений;
- Помните, что нижестоящие зависимости в основном ненадежны;
- Не делайте микросервисы слишком маленькими;
- Используйте пространства имен для разделения кластера;
- Включите управление доступом на основе ролей в своем кластере для вашей команды разработчиков.
Сервисы
- Не используйте тип LoadBalancer, когда порт узла Kubernetes может быть «достаточно хорошим»;
- Используйте статические IP-адреса и сопоставляйте внешние службы с внутренними.
Строительные контейнеры
Есть несколько здравых советов по созданию контейнеров, которые следует учитывать при разработке приложений.
- Не доверяйте произвольным базовым изображениям;
- Храните базовые изображения в формате, который весит мало;
- Используйте шаблон построителя для статических языков.
Внутренности контейнера
Рекомендации для файлов, которые вы помещаете в контейнеры, такие:
- Используйте пользователя без полномочий root;
- Создайте файловую систему только для чтения;
- Один процесс на один контейнер;
- Не перезапускайте в случае сбоя;
- Записывайте все в stdout и stderr.
Мониторинг и наблюдаемость
Мониторинг часто оставляют напоследок. Но это так себе идея: о мониторинге ваша команда разработчиков должна подумать еще на этапе проектирования приложения.
Мониторинг лежит в основе наблюдаемости. Облачные собственные системы — это распределенные системы с десятками компонентов на многих серверах в разных регионах. При такой большой сложности вам нужно заранее подумать о том, как все контролировать.
Если какой-то контейнер выходит из строя на одном из ваших серверов, нужно ли об этом беспокоиться? Без контекста разобраться будет сложно. Здесь и пригодятся инструменты мониторинга.
Наша рекомендация — Prometheus. Это облачный инструмент мониторинга с открытым исходным кодом, который имеет историю и обеспечивает хорошую интеграцию с Kubernetes. У сервера Prometheus есть внутренняя база данных, в которой хранятся метрики, полученные от ваших сервисов. Как только ваш код инструментирован, он подключается к сервису обнаружения Kubernetes, чтобы проанализировать все запущенные процессы. Поэтому лично вам не нужно будет модерировать Prometheus: программа сделает все сама.
Будущее Kubernetes
По данным CNCF, Kubernetes в настоящее время является вторым по величине проектом с открытым исходным кодом в мире после Linux. С момента появления Kubernetes можно с уверенностью сказать, что почти все другие оркестраторы либо не имеют значения, либо отошли на второй план по сравнению с Kubernetes. Как правило, каждый крупный поставщик общедоступных облачных сервисов имеет управляемый сервис Kubernetes или находится в процессе его разработки.
Решили использовать Kubernetes, но не знаете, справятся ли ваши разработчики? Хотите разобраться во всех деталях и быть уверенными, что использование Kubernetes приведет вашу компанию к успеху?
Наймите разработчиков с нами — напишите в HEAAD.