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

Все дело в контейнеризации!

С появлением технологии контейнеризации, которая позволяет упаковывать приложения в изолированные «ящики», отличающиеся высокой переносимостью и небольшим размером, один за другим стали появляться новые инструменты для удобной и эффективной работы с ними. Docker и Kubernetes стали наиболее востребованными среди вышедших на рынок продуктов. При этом Kubernetes — это оркестратор контейнеров. Он «прожёвывает» либо Docker, либо OCI-образы и запускает их с помощью containerd или CRI-O. Далее мы подробно изучим, как и с помощью чего работает контейнеризация, а также разберемся в этом загадочном, на первый взгляд, термине оркестрация и узнаем, что он означает в контексте работы с Kubernetes.

Предыстория: всё началось с виртуальных машин

До появления Docker и подобных ему технологий, программисты горели желанием поделить «железо» на несколько независимых компьютеров, каждый из которых выполнял бы свою задачу. Так появились виртуальные машины.

Посмотрим на определение, которое выдает нам Microsoft:

Виртуальная машина (часто сокращается до ВМ) мало чем отличается от физических компьютеров — ноутбука, смартфона или сервера. У нее есть ЦП, память, диски для хранения файлов и возможность подключения к Интернету. Компоненты вашего компьютера (аппаратная часть) материальны и осязаемы, тогда как виртуальные машины часто рассматриваются как виртуальные или программно-определяемые компьютеры в физических серверах, существующие только в виде кода.

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

А у каждого компьютера есть что? Правильно — своя операционная система: Windows, MacOS, Linux (Ubuntu,Centos) и т. д.

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

Однако у этой технологии развертки есть значительный недостаток: для использования своего приложения необходимо хранить в памяти не только собственные данные, но и целую операционную систему, которая занимает много места и довольно долго запускается. Поэтому появилась необходимость в чем-то более легковесном и быстром, и тут в дело вступили контейнеры.

Новый виток изолирования: контейнеры

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

Что такое Docker?

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

Как устроен Docker?

Docker-контейнер ложится поверх основной операционной системы компьютера и делит с ним ресурсы, но обладает своим изолированным пространством имен и мощностями.

Как устроен Docker
Как устроен Docker

Он пользуется встроенными технологиями Linux, среди которых: 

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

  • Namespaces изолируют такие системные ресурсы, как процессы, сети, идентификаторы пользователей и файловую систему, позволяя контейнерам работать независимо друг от друга.

  • Union File System (UnionFS) Docker использует многослойную файловую систему (OverlayFS, AUFS или btrfs), которая позволяет создавать легковесные и изменяемые образы контейнеров. Это дает возможность эффективно управлять слоями файловой системы, повторно используя неизменяемые слои между различными контейнерами и образами.

Но нас, как конечных пользователей, больше интересует, какие инструменты предоставляет Docker. А вот и они:

  • Docker engine (иначе containerd) — для того чтобы иметь возможность развертывать контейнеры и взаимодействовать с ними, необходимо установить Docker Engine. Существует несколько способов сделать это: например, для macOS достаточно просто загрузить приложение Docker. Так как Docker использует механизмы ядра Linux, то Docker Desktop for Mac и Docker Desktop for Windows запускают виртуальную машину с Linux на борту, где уже запускаются контейнеры.

  • Docker image — далее, для работы с нашими контейнерами, необходимо разработать или скачать шаблон для их создания. По сути, каждый контейнер — это уникальная программа, и мы можем создавать несколько копий одного и того же приложения, и все они будут строиться на основе некоторого шаблона, который и называется Docker image (образ).

  • Контейнеры Docker (Docker Containers) — исполняемые экземпляры образов Docker, обособленные от хостовой системы и друг от друга. Они обеспечивают изолированную среду выполнения приложений.

  • Docker Hub — официальный репозиторий Docker для хранения и обмена образами (шаблонами Docker-контейнеров). Это ресурс похожий на Github, на котором компании и частные разработчики делятся между собой написанными шаблонами для развертки определенных приложений в контейнерах. В качестве примера вы можете легко скачать образ nginx, mysql и даже мини linux-компьютера и на основе него быстро развернуть свои приложения.

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

И после этого создайте nginx-контейнер. Или же изучите документацию Docker и станьте мастером контейнеризации! 

Кстати, недавно Docker попытался уйти из России и ограничил доступ к Docker Hub (хранилищу образов), но проблема уже устранена — Docker Hub снова заработал в России.  Если он еще раз примет решение уйти, вот как можно решить этот вопрос на VPS (при этом важно учитывать, что подобные неофициальные сервисы могут быть потенциально опасны, поэтому решение об их использовании должно быть обоснованным и взвешенным):

Откроем файл, выполнив команду sudo nano/etc/docker/daemon.json. Если у вас появился пустой редактор, значит, файла у вас не было, и после сохранения он появится. Затем добавим в JSON-ключ со списком. Если файла раньше не было, просто вставьте следующий JSON:

{
  "registry-mirrors": [
        "https://mirror.gcr.io",
        "https://daocloud.io",
        "https://c.163.com",
        "https://registry.docker-cn.com"
  ]
}

Если файл конфигурации был, то добавьте новый блок.
Сохраняем файл сочетанием клавиш CTRL+S и закрываем CTRL+X.

После этого перезапускаем службу Docker, выполнив следующую команду: sudo systemctl restart docker.

Kubernetes

Следующим этапом развития контейнеризации стали приложения, которые оркестрируют контейнеры. То есть приложения, которые автоматизируют запуск, поддержку стабильной и безопасной работы и так далее. Одним из первых и популярных инструментов для оркестрации стал Docker compose, из которого вырос Docker Swarm. Компания сделала этот инструмент платным, что вызвало бурное негодование в opensource-сообществе и способствовало популяризации Kubernetes.

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

Инструменты Kubernetes

Теперь давайте разберемся, как устроен такой мощный инструмент изнутри.

Архитектура
Архитектура

Минимальный примитив в k8s — это Pod, и кубер работает только с pod-ами, внутрь pod-а он не лезет. Pod — это некая «капсула», которая может содержать в себе один или несколько контейнеров. В дальнейшем, для упрощения, во всех примерах мы будем рассматривать один контейнер в поде. Но бывают случаи, когда некоторые контейнеры работают в группе, чтобы решить какую-то одну примитивную задачу, и тогда их помещают в один Pod. Например часто используют контейнер redis (для хранения кеша) и контейнер основного приложения в одном Pod.

Далее Pod нужно разместить на каком-то Node (физическом сервере) и тут в Kubernetes вводится два новых понятия: рабочие ноды (Worker nodes) или ноды менеджеры (Manager nodes или Master nodes). 

Worker nodes отвечают за размещение на себе подов (Pod). В то время как Менеджеры (Manager nodes) управляют размещением контейнеров и другими процессами, с этим связанными. Чаще всего один менеджер отвечает за три и более воркеров.

Kubernetes
Kubernetes

Далее при более подробном изучении Kubernetes у вас появится множество вопросов по его архитектуре. 

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

Рекомендуем ознакомиться с инструментами, которые позволяют развернуть мини-версию Kubernetes локально для экспериментов и обучения:

  • Minikube — инструмент для запуска одноузлового кластера Kubernetes на виртуальной машине в персональном компьютере.

  • Kind — инструмент для запуска локальных K8s-кластеров, который использует в качестве узлов Docker-контейнеры.

  • K3s — облегчённая версия Kubernetes, специально созданная для использования в средах с ограниченными ресурсами.

Итоги

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

Поделитесь своими прогнозами: как вы думаете, какое будущее ждет контейнеризацию и оркестрацию в ближайшие 5-10 лет?

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


  1. firehacker
    05.07.2024 15:24

    Непонятно только, почему этим так называемым разработчикам приложений так «зашла» идея заворачивать приложения в изолированных ящиках.

    Может потому, что они настолько криворукие разработчики, что не могут написать приложения, которые бы не мешали работе друг-друга?

    В 2000-х была популярна шутка про начинающих разработчиков, которые пишут приложения, которые нигде больше не запускаются, кроме как на компе своего создателя. Такое ощущение, что весь тот докер про это.

    Если же всё дело в изоляции, то чем системные механизмы изоляции не устраивают? И если все-таки не устраивают, с какого перепугу проблему изоляции прикладных программ решает другая прикладная программа, а не решается это на уровне ОС?


    1. aka352
      05.07.2024 15:24
      +1

      Видимо вы не разрабатывали под Linux. Попробуйте и скоро сами изобретëте свой докер)


      1. firehacker
        05.07.2024 15:24

        Ошибаетесь. Разрабатывал, хоть и не так много, как под Windows.

        Ну опишите открытым текстом, что вашим приложениям мешает жить на линукс-машины без завёртывания в контейнер?

        И, каким бы ни был ответ, почему вместо допиливнаия линукса (что было бы идеологически верным) лепят нашлёпку поверх недопиленного линукса и ещё и радуются этому?

        И как тогда по вашему существовал мир до создания докера? Как кромешный ад и ужас? Это мне напоминает «ощущение» у неофитов, что 100 лет назад мир в принципе был чёрно-белым.


        1. trueMoRoZ
          05.07.2024 15:24

          Ну одни решили написать "костыль" в виде докера. Вы же можете допилить линукс - весь мир ждёт.


    1. ddruganov
      05.07.2024 15:24

      "write once, run anywhere" слышали? Эта фраза еще даже постарше нулевых будет)


      1. firehacker
        05.07.2024 15:24

        Этот лозунг больше бы подошёл Джаве, а не системе контейнеризации.

        А у оно не run anywhere, а работает на линуксе в контейнере. И что мешает ему работать точно так же на линуксе без контейнера?


    1. ma1uta
      05.07.2024 15:24
      +2

      Очень сложно писать приложения, которые бы не мешали работе друг друга. Особенно сложные приложения. Особенно когда много приложений. Одному приложению нужно glibc одной версии, другому приложению нужно glibc другой версии, а третьему нужно, чтобы системная библиотека была musl и так далее. А у приложения может быть несколько десятков библиотек. И надо как-то потом все эти библиотеки обновить. И ещё так, чтобы другие приложения не зацепить. И при этом иметь возможно всё откатить если что-то не так пойдёт.

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

      А потом ещё начинаются различные хотелки, например, сетевой трафик не постоянный, а может сезонно увеличиваться, а затем уменьшаться. И хотелось бы оперативно горизонтально масштабировать приложение, и когда не надо, то отключать лишние экземпляры. И надо как-то следить за всеми проектами (допустим, в компании их около 100 штук), собирать метрики, собирать логи куда-нибудь. Дальше больше, наша реальность суровая и в ней может происходить всё что угодно. И в ней происходит что угодно, приложение может упасть, сломаться, жёсткий диск посыпаться, плата сгореть. Хотелось бы как-то восстановить работоспособность. Желательно быстро и с минимальными потерями.

      И уже появляется оркестрация.

      Контейнеры и всякие куберы (контейнеры ещё появились в 2005 году в Solaris) - всего лишь инструмент для решения определённых проблем. Решают ли они все проблемы и являются ли панацеей от всего? Нет. Где-то они не нужны и лишние, а где-то решают свои задачи. Хорошо ли они решают проблемы? Где-то да, где-то нет.