Если вы занимаетесь разработкой программного обеспечения, вы, вероятно, слышали о Kubernetes. Этот мощный инструмент оркестрации контейнеров быстро завоевал популярность с момента его запуска в 2014 году и теперь широко используется в различных отраслях. Но что такое Kubernetes и почему это важно? Я написал эту статью, чтобы узнать ответы на эти вопросы и понять, почему Kubernetes является таким важным инструментом для разработки и развертывания современных приложений.

Что такое Кубернетес?

Согласно документации Kubernetes, Kubernetes — это переносимая расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и службами, которая облегчает как декларативную настройку, так и автоматизацию. Он имеет большую, быстрорастущую экосистему. Услуги, поддержка и инструменты Kubernetes широко доступны.

Сначала это определение не помогло мне понять, что это такое и почему оно полезно или когда мы должны его использовать.

Чтобы понять, почему разработчики и организации используют Kubernetes, необходимо дать больше контекста и объяснить, как разработчики и организации развертывали приложения до появления контейнеров.

Я немного объясню, как все работает, когда разработчики развертывают традиционно, используя виртуальные машины и контейнеры.

Традиционное развертывание

Когда мы создаем приложение, скажем, приложение Django или Rails, или любое приложение, использующее Python, Java, Go, Rust и т. д. И мы запускаем его, мы запускаем приложение поверх ОС, а ОС поверх оборудование.

У этого способа есть свои проблемы: если на нашем компьютере запущено много приложений, одно из них может использовать больше ресурсов, чем другие, что снижает производительность других приложений. Конечно, если вы используете одно приложение, вероятно, проблем нет. Но если вы являетесь частью организации, которая запускает множество приложений для обслуживания большого количества клиентов, заказчиков, пользователей и т. д., это будет проблемой. И использование машины для каждого приложения дорого.

Виртуальные машины

Чтобы решить эту проблему, организации начинают использовать виртуальные машины (ВМ). Виртуальная машина находится поверх ОС, и на каждой виртуальной машине работает ОС. Итак, у нас есть приложение, работающее внутри виртуальной машины, изолированное от других приложений, работающих на других виртуальных машинах, таким образом, мы можем контролировать ресурсы, потребляемые приложением. Кроме того, у нас может быть несколько виртуальных машин, работающих на одном физическом сервере.

Примером виртуальных машин является виртуальная машина Java и подсистема Windows Linux или WSL, которые позволяют пользователям Windows использовать дистрибутив Linux внутри Windows.

Контейнеры

Затем организации начали использовать контейнеры. Контейнеры похожи на виртуальные машины, считаются легкими, они могут совместно использовать операционную систему (ОС) между приложениями. Как и у виртуальной машины, у контейнера есть собственная файловая система, доля процессора, памяти, пространства процесса и многое другое.

Они переносимы между облаками и дистрибутивами ОС. Таким образом, мы можем разработать приложение в системе Mac OS или Windows и запустить его или развернуть на сервере Linux. Упрощая, это процесс, когда мы хотим развернуть приложение в облачной службе: мы контейнеризируем приложение, а затем развертываем его в облачной службе.

Зачем нам нужен Kubernetes и что он может

В производственной среде у нас есть много приложений, работающих в контейнерах. Но что произойдет, если контейнер выйдет из строя? Мы должны запустить еще один контейнер. Но вместо того, чтобы запускать контейнер вручную, будет удобно иметь систему, которая сделает это за нас. Это то, что делает Kubernetes, он заботится о масштабировании и аварийном переключении для наших приложений.

Согласно официальной документации, Kubernetes предоставляет нам:

  • Обнаружение сервисов и балансировка нагрузки. Kubernetes может предоставить контейнер, используя DNS-имя или IP-адрес. Если трафик к контейнеру высок, Kubernetes может
  • Балансируйте нагрузку и распределяйте сетевой трафик, чтобы развертывание было стабильным.
  • Оркестровка хранилища. Kubernetes позволяет автоматически монтировать систему хранения по вашему выбору, например, локальные хранилища, общедоступные облачные сервисы и т. д.
  • Автоматические развертывания и откаты. Вы можете описать желаемое состояние развернутых контейнеров с помощью Kubernetes, и оно может изменить фактическое состояние на желаемое с контролируемой скоростью. Например, вы можете автоматизировать Kubernetes для создания новых контейнеров для вашего развертывания, удаления существующих контейнеров и переноса всех их ресурсов в новый контейнер.
  • Автоматическая упаковка контейнеров. Вы предоставляете Kubernetes кластер узлов, которые он может использовать для выполнения контейнерных задач. Вы сообщаете Kubernetes, сколько ЦП и памяти (ОЗУ) требуется каждому контейнеру. Kubernetes может размещать контейнеры на ваших узлах, чтобы максимально эффективно использовать ваши ресурсы.
  • Самоисцеление. Kubernetes перезапускает контейнеры, которые выходят из строя, заменяет контейнеры, уничтожает контейнеры, которые не реагируют на вашу пользовательскую проверку работоспособности, и не сообщает о них клиентам, пока они не будут готовы к работе.
  • Управление секретами и конфигурациями. Kubernetes позволяет хранить и управлять конфиденциальной информацией, такой как пароли, токены OAuth и ключи SSH. Вы можете развертывать и обновлять секреты и конфигурацию приложений, не перестраивая образы контейнеров и не раскрывая секреты в конфигурации стека.

Чем не является Kubernetes

Kubernetes — это не традиционное комплексное системное решение PaaS (платформа как услуга). Поскольку Kubernetes работает на уровне контейнера, а не на уровне оборудования, он предоставляет некоторые общеприменимые функции, характерные для предложений PaaS, такие как развертывание, масштабирование и балансировка нагрузки. И позвольте пользователям интегрировать свои решения для ведения журналов, мониторинга и оповещения, например, с помощью Prometheus, Grafana, OpenTelemetry и т. д.

Однако, как говорится в документации, эти решения по умолчанию являются необязательными и подключаемыми. Что дает пользователям гибкость для создания своих платформ.

В документации упоминаются функции, которых нет в Kubernetes:

  • Не ограничивает типы поддерживаемых приложений. Kubernetes стремится поддерживать чрезвычайно разнообразные рабочие нагрузки, включая рабочие нагрузки без сохранения состояния, с отслеживанием состояния и обработку данных. Если приложение может работать в контейнере, оно должно отлично работать в Kubernetes.
  • Не развертывает исходный код и не создает ваше приложение. Рабочие процессы непрерывной интеграции, доставки и развертывания (CI/CD) определяются культурой и предпочтениями организации, а также техническими требованиями.
  • Не предоставляет службы уровня приложений, такие как промежуточное ПО (например, шины сообщений), платформы обработки данных (например, Spark), базы данных (например, MySQL), кэши или кластерные системы хранения (например, Ceph). как встроенные службы. Такие компоненты могут работать в Kubernetes и/или могут быть доступны приложениям, работающим в Kubernetes, через переносимые механизмы, такие как Open Service Broker.
  • Не требует решений для регистрации, мониторинга или оповещения. Он предоставляет некоторые интеграции в качестве доказательства концепции и механизмов для сбора и экспорта метрик. Не предоставляет и не предписывает язык/систему конфигурации (например, Jsonnet). Он предоставляет декларативный API, на который могут быть нацелены произвольные формы декларативных спецификаций.
  • Не предоставляет и не принимает какие-либо всеобъемлющие системы настройки, обслуживания, управления или самовосстановления машины.
  • Кроме того, Kubernetes — это не просто система оркестровки. Это устраняет необходимость в оркестровке. Техническое определение оркестровки — это выполнение определенного рабочего процесса: сначала выполните A, затем B, затем C. В отличие от этого, Kubernetes включает в себя набор независимых компонуемых процессов управления, которые непрерывно приводят текущее состояние к предоставленному желаемому состоянию. Неважно, как вы добираетесь из точки А в точку С. Централизованное управление также не требуется. В результате получается более простая в использовании система, более мощная, надежная, отказоустойчивая и расширяемая.

Проекты с открытым исходным кодом для интеграции с Kubernetes

Как упоминалось ранее, есть функции, которые Kubernetes не включает, но мы можем добавить их, используя другие проекты. Обычно мы находим множество проектов для интеграции с Kubernetes на веб-странице Cloud Native Computing Foundation (CNCF).

Вот список проектов, которые мы можем интегрировать с Kubernetes (этот список не является исчерпывающим):

  • Argo — нативные инструменты Kubernetes для запуска рабочих процессов, управления кластерами и правильного выполнения GitOps.
  • Прометей — Система мониторинга и база данных временных рядов.
  • Jaeger — Распределенная платформа трассировки.
  • Linkerd — сверхлегкая, ориентированная на безопасность сервисная сетка для Kubernetes.
  • Emissary-ingress — собственный API-шлюз Kubernetes с открытым исходным кодом + балансировщик нагрузки уровня 7 + Kubernetes Ingress, построенный на Envoy Proxy.
  • Cert-Manager — автоматическая подготовка сертификатов TLS и управление ими в Kubernetes.
  • Contour — Contour — это входной контроллер Kubernetes, использующий прокси-сервер Envoy.
  • KubeEdge — среда вычислений Kubernetes Native Edge.
  • Kyverno — управление нативной политикой Kubernetes.
  • KubeVirt — API виртуализации Kubernetes и среда выполнения для определения и управления виртуальными машинами.
  • KubeVela — современная платформа доставки приложений, которая делает развертывание и эксплуатацию приложений в современных гибридных мультиоблачных средах проще, быстрее и надежнее.
  • Open Kruise — Автоматизированное управление масштабными приложениями на Kubernetes.
  • Litmus — Платформа Chaos Engineering с открытым исходным кодом, которая позволяет командам выявлять слабые места и потенциальные сбои в инфраструктурах, вызывая тесты хаоса контролируемым образом.
  • Keda — KEDA — это компонент автомасштабирования, управляемый событиями, на основе Kubernetes. Он обеспечивает масштабирование на основе событий для любого контейнера, работающего в Kubernetes.
  • Keptn — Keptn — это плоскость управления на основе событий для непрерывной доставки и автоматизированных операций для облачных приложений.
  • Flux — открытое и расширяемое решение для непрерывной доставки для Kubernetes. Работает на GitOps Toolkit.
  • CoreDNS — CoreDNS — это DNS-сервер, который связывает плагины.

Как я уже говорил, это не исчерпывающий список. Но если вы хотите узнать о других проектах, вы можете проверить этот список от CNCF. Там перечислены не все проекты, совместимые с Kubernetes, а только те, которые были основаны CNCF.

Заключение

До написания этой статьи я ничего не знал о Kubernetes, кроме того, что это инструмент для управления контейнерами. Но мне было сложно представить его важность и насколько он полезен без контекста. Вероятно, люди, которые писали документацию по Kubernetes, знают это и упоминают, что разработчики традиционно развертывают свои приложения, используя виртуальные машины и контейнеры. Без этой информации сложно оценить, что Kubernetes делает для нас.

Кроме того, удивительно, как контейнеры и Kubernetes развивают свою экосистему. Мне показалось любопытным, что многие проекты разрабатываются только для использования в Kubernetes или совместимы с ним. Я думаю, что благодаря его гибкости и решению позволить пользователям выбирать, какие проекты интегрировать с ним.

Ресурсы

Первоначально опубликовано на https://carlosmv.hashnode.dev.