Kubernetes сейчас массово используют в ЦОДах и облачных решениях. Какие заслуги у Кубера, что было до него и почему сейчас он едва ли не стандарт отрасли. А ещё, как понять, что Кубер вам ни к чему.

Привет, Хабр! Я — Андрей Камардин, SRE-инженер одной из крупнейших российских телеком-компаний и ассистент в МАИ, эксперт Skillbox по DevOps. Веду канал «Записки про IT». Для закрытого комьюнити Skillbox Code Experts рассказал про свой опыт с Kubernetes, описал его особенности, преимущества и недостатки.

Пять минут истории или Bare Metal подход

Сначала пятиминутка истории: как мы жили до появления Kubernetes. Когда-то серверные инфраструктуры основывались на концепции Bare Metal — физическом оборудовании, на котором выполнялись приложения. Такая архитектура позволяла чётко контролировать вычислительные ресурсы: количество ядер CPU, объём оперативной памяти и другие параметры можно было определять и наращивать напрямую, делая аппаратные апгрейды. Закон Мура работал на руку: рост производительности позволял постоянно повышать мощность без значительных затрат. При необходимости можно было создать настоящий кластер, объединяя серверы для эффективного распределения нагрузки и улучшенной работы с пользовательскими запросами.

Плюсы Bare Metal:

  1. Прямое выполнение приложений. Приложения запускались непосредственно на сервере, что позволяло чётко понимать, как именно используются ресурсы.

  2. Управляемый рост мощности. Мощность серверов увеличивалась за счёт простых аппаратных апгрейдов, что, с одной, стороны упрощало масштабирование, но с другой существенно его замедляло – процесс закупки и поставки был не быстрым.

  3. Кластеры для высокой нагрузки. Объединение серверов в кластеры позволяло эффективнее распределять нагрузку и обслуживать больше пользователей.

Ограничения и минусы Bare Metal:

  1. Проблемы с безопасностью и сложности в изоляции приложений без использования дополнительных мер, например, виртуализации — одно из ключевых ограничений. Если на одном сервере одновременно запускались, например, Exchange и файловое хранилище, это создавало уязвимость: злоумышленник мог получить доступ к серверу и установить вредоносное ПО (например, rootkit), что ставило под угрозу всю систему.

  2. Невозможность гибкого масштабирования под нагрузку. Серверы в Bare Metal-архитектуре сложно адаптировать к резким изменениям пользовательской активности. Например:

  • Рост нагрузки. Если популярность компании резко увеличивалась, скажем, после выхода рекламной статьи, резкое увеличение запросов могло привести к отказу в обслуживании. Подобный «хабраэффект» становился проблемой, поскольку добавление новых серверов занимало время и требовало значительных затрат.

  • Недостаточная загрузка. Если серверы использовались для внутренней информационной системы небольшой компании, они могли попросту простаивать, не загружаясь по максимуму. Оборудование «грело воздух» и потребляло электричество, не принося реальной пользы.

Таким образом, несмотря на свои преимущества, Bare Metal не мог эффективно справляться с изменениями нагрузки и потребностями растущих компаний, что постепенно привело к появлению новых, более гибких архитектур.

Необходимость изменений: переход к контейнеризации

С развитием технологий и ускорением темпа жизни возникла потребность в новых подходах к управлению ресурсами. Простое использование физических серверов (Bare Metal) и виртуальных машин (VM) уже не отвечало требованиям бизнеса. Так появилась контейнеризация — решение, которое позволило достичь большей гибкости и скорости в предоставлении ресурсов.

Почему контейнеризация, а не виртуальные машины? Хотя виртуальные машины помогли решить некоторые проблемы изоляции и управления ресурсами, они не обеспечивали достаточной гибкости. Контейнеризация, в отличие от виртуальных машин, позволяла:

  1. Гибко управлять ресурсами. Контейнеры позволяют распределять мощности по запросу, что делает их удобными для коммерческого использования.

  2. Сократить расходы на оборудование. В отличие от Bare Metal, контейнеры дают возможность использовать ресурсы более эффективно и гибко, не требуя полного доступа к серверу для каждого клиента.

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

На практике контейнеры позволяют предприятиям эффективно управлять загрузкой ресурсов и обеспечивать мощность «по запросу». Например, если у компании есть крупный клиент, которому периодически требуются большие вычислительные мощности (например, в конце квартала для обработки данных), контейнеры позволяют временно выделить дополнительные ресурсы. После выполнения задачи клиент может отказаться от ресурсов, а освободившиеся мощности будут перенаправлены на другие нужды.

Преимущества контейнеризации для бизнеса:

  1. Гибкость в управлении ресурсами. В отличие от физического оборудования, которое требует значительных затрат на обслуживание, контейнеры позволяют более гибко управлять ресурсами и предоставлять их именно тогда, когда они необходимы. Это особенно важно для облачных платформ, таких как Amazon Web Services, которые автоматизируют предоставление и тарификацию ресурсов.

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

  3. Эффективное перераспределение ресурсов. Контейнеризация позволяет быстро перераспределять ресурсы между клиентами после завершения их задач, что занимает больше времени при использовании Bare Metal. Это позволяет оптимизировать нагрузку и обеспечить более высокую доступность ресурсов.

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

Что такое оркестрация и зачем она нужна?

Оркестрация — это процесс управления последовательностью событий. Например, событие A вызывает событие B, а затем обязательно происходит событие C. В контексте IT-инфраструктуры оркестрация позволяет автоматизировать и упорядочивать такие процессы, обеспечивая чёткий порядок выполнения задач. Современные системы оркестрации, такие как Kubernetes, делают это особенно эффективно, упрощая управление контейнерами и обеспечивая гибкость.

В современных условиях скорость вывода продукта на рынок (time-to-market) становится критически важной. Допустим, компания создала новое приложение для заказа такси. Чтобы закрепить ассоциацию между своим брендом и услугой, нужно запустить его первым, даже если оно ещё не идеально. Здесь на помощь приходит контейнеризация: она позволяет развернуть приложение быстрее, чем на bare metal, и получить необходимую функциональность. А доработки — внести постепенно, обкатывая на части аудитории уже в процессе эксплуатации.

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

Как работает оркестрация в Kubernetes

Система оркестрации Kubernetes, разработанная в Google, стала революцией в управлении контейнерами. Она позволяет автоматизировать инфраструктуру, обеспечивая "инфраструктуру как код" (IaC). Теперь код может не только писать разработчик, но и тестировщики, DevOps-инженеры и даже системные администраторы, поскольку Kubernetes позволяет автоматизировать процесс управления инфраструктурой. Основная фишка Kubernetes,в отличие от других IaC решений  в самоподдержании: то есть, упало — само поднялось, есть перегрузка — отмасштабировалось.

Kubernetes был разработан Google и передан в организацию Cloud Native Computing Foundation. Он объединил лучшие практики управления контейнерами и стал популярным благодаря высокой гибкости и широкому набору функций.

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

Основные функции Kubernetes

Для начала разберём основные термины:

  1. Кластер: основная единица в Kubernetes, представляющая собой набор узлов, объединённых в единое целое.

  2. Поды: отдельные исполняемые юниты в рамках кластера, на которых выполняются приложения. Могут состоять из одного или нескольких контейнеров.

  3. Балансировщик: инструмент, распределяющий трафик между узлами, чтобы поддерживать оптимальную загрузку и отказоустойчивость.

  4. Воркер (Worker Node) — компонент кластера, отдельный рабочий узел.

Kubernetes позволяет предприятиям строить гибкую и отказоустойчивую инфраструктуру. Благодаря оркестрации, автоматизации и IaC (Infrastructure as a Code), компании могут быстрее реагировать на изменения, эффективно распределять ресурсы и обеспечивать стабильную работу приложений. Это значительно упрощает разработку и эксплуатацию современных приложений и делает Kubernetes предпочтительным выбором для многих IT-команд и компаний.

Функции Kubernetes:

Запуск и управление контейнерами. Kubernetes позволяет легко запускать контейнеры и управлять ими, независимо от их количества. Это делается в рамках единого кластера. Контейнеры выполняются на узлах, которые могут быть как bare metal, так и виртуальными машинами.

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

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

Инфраструктура как код (IaC). Kubernetes поддерживает автоматизацию процессов на уровне кода, что облегчает управление и настройку инфраструктуры. Это позволяет разрабатывать сложные системы, которые могут выполнять задачи самостоятельно, без участия человека.

Дополнительные возможности Kubernetes

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

Балансировка нагрузки: эффективное распределение ресурсов

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

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

Автоматическое монтирование систем хранения данных

Kubernetes также поддерживает автоматическое монтирование хранилищ. Это значит, что при развёртывании контейнера, к нему может быть автоматически подключена нужная файловая система, что позволяет приложениям легко работать с данными. В UNIX-парадигме, где "всё есть файл", это особенно удобно: данные можно записывать в файловую систему как единый источник информации. Kubernetes поддерживает монтирование различных хранилищ, что позволяет адаптировать инфраструктуру под потребности приложения.

Поддержка микросервисов и непрерывной доставки (CI/CD)

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

Kubernetes интегрируется с системами непрерывной интеграции и доставки (CI/CD), обеспечивая поддержку постоянного развертывания обновлений. Это особенно важно для бизнеса, который быстро реагирует на изменения. Если приложение "падает", Kubernetes автоматически перезапускает контейнер, минимизируя влияние на пользователей и поддерживая бесперебойную работу сервиса.

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

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

Ограничения Kubernetes по сравнению с виртуальными машинами

Несмотря на широкие возможности Kubernetes, это не полноценная платформа как сервис (PaaS). Она не предоставляет все инструменты для автоматизации и требует дополнительной настройки, например, с помощью скриптов или плейбуков (playbooks) для управления виртуальными машинами (VM). В отличие от контейнеров, на VM каждый компонент приходится настраивать вручную или автоматизировать с помощью дополнительных инструментов.

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

Когда Kubernetes не нужен

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

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

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

3. Приложения с редкими обновлениями. Многие компании используют Kubernetes для быстрой разработки и непрерывного обновления приложений. Но если ваше приложение обновляется редко и не требует постоянного внесения изменений, Kubernetes будет нерациональным выбором. Например, если речь идёт о mainframe-системах или других устоявшихся решениях, где обновления функционала происходят не чаще пары раз в год, Kubernetes не даст значимого выигрыша.

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

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

Почему Kubernetes популярен среди бизнеса?

Kubernetes стал неотъемлемой частью многих IT-инфраструктур благодаря возможности гибкого управления ресурсами и развертывания приложений. Рассмотрим, какие преимущества он предоставляет и в каких случаях становится незаменимым.

1. Гибкость развёртывания микросервисов на лету. Kubernetes позволяет быстро разворачивать микросервисы, что особенно полезно при изменяющихся требованиях к приложениям. Например, если нужно внедрить новый функционал в работу, Kubernetes обеспечивает быстрое развертывание, сохраняя гибкость и устойчивость системы. Это критически важно для компаний, которым требуется оперативно адаптироваться под запросы пользователей.

2. Оптимизация использования ресурсов. Некоторые клиенты нуждаются в больших объемах ресурсов на определенные периоды, например, в начале или в конце квартала. Благодаря Kubernetes ресурсы могут выделяться и освобождаться по мере необходимости, что позволяет максимально эффективно использовать мощности дата-центров. Это решение особенно ценно для компаний с нерегулярной или плавающей нагрузкой.

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

4. Учёт региональных особенностей и оптимизация нагрузки. Различия в часовых поясах и особенностях работы в разных регионах позволяют гибко перераспределять нагрузку на серверы. Kubernetes учитывает эти факторы, управляя загрузкой ресурсов в зависимости от времени суток и региона. Это делает его удобным для компаний с географически распределенной инфраструктурой.

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

6. Гибкая тарификация. Kubernetes позволяет точно рассчитывать использование ресурсов, что делает затраты предсказуемыми и прозрачными.

7. Работа с различным оборудованием. Kubernetes не предъявляет жёстких требований к оборудованию и позволяет работать с разными серверами и хранилищами, упрощая создание унифицированной инфраструктуры.

8. Популярность среди разработчиков. В условиях высокой популярности контейнерных технологий всё больше разработчиков знакомы с Docker и Kubernetes. Это упрощает внедрение новых решений и повышает их доступность на рынке.

Будущее: разработка собственной системы контейнеризации

Рост спроса на локальные решения побуждает нас рассмотреть разработку собственной системы контейнеризации. Подобный опыт уже был у китайских компаний, которые успешно адаптировали open-source решения для внутреннего рынка. Пример из наших краёв — группа компаний Астра, создаёт экосистему продуктов, которая стала хорошим примером.

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

Комментарии (7)


  1. vesper-bot
    07.11.2024 13:09

    TL:DR Kubernetes не нужен, если вы и ваш бизнес - динозавр /s
    Или у вас есть нагрузка на bare metal, который вы сами админите.


    1. oller
      07.11.2024 13:09

      Kubernetes требует большого количества более дорогих спецов нежели старые подходы

      И эти спецы дифицитны в РФ

      Этого нормального спеца вы днём с огнём не слышите. На маленький проект хороший спец не пойдет и будете искать годами девопса с ЗП 300-500т, а вам таких 2 минимум, если хоть какой-то аптайм, ну и это исключая обычных админов.

      Опять же не каждый hr найдет такого devops в принципе

      А так да, модно,молодежно, красиво, в трендах


      1. Fitrager
        07.11.2024 13:09

        Я бы пошел на маленький проект, так как от больших устал. У меня CKA есть.


      1. vesper-bot
        07.11.2024 13:09

        Хмм. Какая модель бизнеса и его софта у вас в голове, что так пишете о зарплатной вилке и вообще всём, что измеряется в цифрах? Соглашусь, что куб "не для всех", особенно если у предприятия условный неделимый монолит на железе с лицензионными ключами, которые некуда или нечем перенести. Или всего софта один интернет-магазин за DDoS-guard'ом, заливка данных в который идет из 1Са раз в день, например. Но если кто-то планирует разработку, находится в процессе или активно занимается декомпозицией своего "монолита", ИМХО сразу ориентироваться на куб будет как минимум хорошей практикой, причем даже если нет своего спеца именно по кубу. Разворачивать и админить собственный куб - да, более серьёзная тема, но вроде бы у того же Яндекса можно достать "куб как службу", плюс пока прод в облаке, можно поставить задачу поднять куб локально без прессинга (скажем, для дев+тест), на нём отточить скиллы управления, и потом мигрировать на него прод из облака. То есть, такого девопса технически и вырастить можно, хотя и маеты много будет.
        задумчиво может попросить 300к зарплаты...


  1. c5213775
    07.11.2024 13:09

    Смешали контейнеры с узлами, это понятия разного уровня. Узлы - это части кластера, как отдельные машины. А уже на них запускаются контейнеры.


    1. darovska_online Автор
      07.11.2024 13:09

      Спасибо, что заметили — исправили оплошность


  1. morgoved
    07.11.2024 13:09

    Пост не несёт ничего... Но лет так 7-8 назад был актуален, кароч.. Это все что нужно знать чему вас научат на Skillbox)))))