K8s для начинающих

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

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

Kubernetes (K8s) — что это простыми словами?

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

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

Источник: Shutterstock. Kubernetes - один из самых популярных инструментов для оркестрации контеунеров

Что такое контейнеры и чем они полезны

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

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

Контейнеры стали популярными благодаря следующим преимуществам:

  1. Изоляция приложений. Контейнеры изолируют приложения и их зависимости. Это предотвращает конфликты между приложениями, работающими на одном сервере.
  2. Портативность. Контейнеры можно запускать в различных средах разработки без изменения конфигурации. Приложения в контейнерах можно переносить между различными ОС и облачными платформами.
  3. Масштабируемость. Контейнеры можно легко создавать или удалять, чтобы поддерживать оптимальную производительность приложений.
  4. Автоматизация. Процесс создания, развертывания и управления контейнерами может быть легко автоматизирован и включать механизмы самовосстановления и откатов.
  5. Экономия ресурсов. Контейнеры более легковесные, чем виртуальные машины. Благодаря этому можно запускать больше приложений на меньшем количестве серверов и снижать затраты на инфраструктуру.

Компоненты и архитектура Kubernetes

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

Концепции

CSI (Container Storage Interface) — интерфейс для интеграции систем хранения данных с Kubernetes. Он позволяет подключать сторонние системы хранения данных через API.

Реализации CSI:

  • ceph, 
  • openebs, 
  • linstor.

CNI (Container Network Interface) — интерфейс для сетевой конфигурации контейнеров, который используется для управления сетью и взаимодействия между подами. 

Реализации CNI: 

  • flannel, 
  • calico, 
  • cilium.

CRI (Container Runtime Interface) — интерфейс для взаимодействия Kubernetes с различными средами выполнения контейнеров.

Реализации CRI:

  • containerd, 
  • CRI-O.

Кластеры и типы узлов

Кластеры — совокупность узлов (серверов), которые работают вместе для выполнения контейнеризованных приложений. Кластеры состоят из двух типов узлов: control plane и worker node. 

  1. Control Plane (Master node) — главный узел, который выполняет задачи по управлению и администрированию K8s-кластеров. Он включает в себя:
  • kube-apiserver — обеспечивает взаимодействие с Kubernetes через REST API или gRPC;
  • etcd — распределенное хранилище данных, нативно поддерживаемое Kubernetes. Хранит все данные о кластере в виде ключ-значение;
  • kube-controller-manager — следит за состоянием кластера и управляет различными контроллерами;
  • kube-scheduler — определяет, на каких нодах будут запущены контейнеры;
  • Kubelet — агент, работающий на каждом узле и следящий за состоянием подов (pods);
  • Container Runtime — среда для запуска контейнеров. K8s поддерживает различные среды выполнения контейнеров, например, Containerd или CRI-O.
  1. Worker nodes — это рабочие узлы, которые включают в себя:
  • Kubelet;
  • Kube-proxy — сетевой прокси-сервер, который позволяет конфигурировать сетевые правила на узлах;
  • Container Runtime.

Типы приложений по функциональному назначению

Приложения в Kubernetes запускаются внутри подов (pods) — наборов работающих контейнеров в кластере. Каждый под имеет свой жизненный цикл. К примеру, если на узле с запущенными подами произойдет сбой, все поды выйдут из строя. Такой сбой будет считаться необратимым: для восстановления нужно будет создать новые поды, даже если позже узел заработает. Чтобы облегчить управление и не контролировать каждый под вручную, в K8s были добавлены контроллеры.

Контроллеры — компоненты, которые следят за состоянием кластера или какого-либо ресурса в Kubernetes и выполняют различные действия для поддержания желаемого состояния. 

Основные контроллеры:

  1. Deployment — управляет развертыванием и обновлением подов. Он обеспечивает декларативное управление состоянием приложений, позволяет легко масштабировать приложения и управлять стратегиями обновления.
  2. ReplicaSet — гарантирует, что запущено определенное количество идентичных подов. Он используется для обеспечения стабильной работы приложения, автоматически заменяя поды, которые перестали работать или были удалены.
  3. StatefulSet — используется для управления приложениями с отслеживанием состояния. StatefulSet управляет порядком развертывания, масштабирования и обновления подов.
  4. DaemonSet — гарантирует, что на всех или некоторых узлах запускается экземпляр пода. Часто используется для развертывания системных демонов, инструментов мониторинга и логирования.

Типы ресурсов

  1. Pods — наименьшая и наиболее простая единица развертывания в Kubernetes, состоящая из одного или нескольких контейнеров.
  2. Services — ресурс, который подключает набор подов к абстрактному имени сервиса и IP-адресу. 
  3. Ingress — ресурс, который управляет внешним доступом к сервисам в кластере, обычно через HTTP/HTTPS. Ingress определяет правила маршрутизации и может обеспечивать балансировку нагрузки, SSL-терминацию и виртуальный хостинг на основе имени.
  4. ConfigMaps — используется для хранения неконфиденциальных данных конфигурации в виде пар ключ-значение. ConfigMaps позволяет управлять конфигурацией приложений отдельно от контейнерных образов, что облегчает обновление конфигураций без пересборки образов.
  5. Secrets — используется для хранения конфиденциальной информации, такой как пароли, токены, ключи K8s API. Secrets помогают избежать хранения чувствительных данных в открытом виде в манифестах подов или контейнерных образах.

Преимущества Kubernetes

  1. Автоматическое восстановление. Kubernetes автоматически перезапускает поды, которые перестали работать, перемещает поды на рабочие ноды, убирает и заменяет поды, не прошедшие проверку состояния.
  2. Масштабируемость. K8s позволяет легко масштабировать приложения как вертикально (добавляя больше ресурсов для каждого отдельного контейнера), так и горизонтально (добавляя больше экземпляров подов).
  3. Автоматизация развертывания и управления. Kubernetes предоставляет ряд API и механик работы отдельных ресурсов, которые позволяют построить инструменты для автоматического развертывания, обновления и отката приложений. С их помощью можно интегрировать процессы CI/CD и обеспечить быстрое и надежное обновление приложений без простоев.
  4. Безопасность. Kubernetes обеспечивает изоляцию приложений на уровне контейнеров, а также изоляцию от слоя управления кластером.
  5. Балансировка нагрузки. Kubernetes автоматически распределяет трафик между подами, обеспечивая высокую доступность приложения.
  6. Экономия ресурсов. K8s управляет легковесными контейнерами. Это позволяет эффективно использовать вычислительные ресурсы и снижает затраты на инфраструктуру.
  7. Поддержка микросервисной архитектуры. Kubernetes позволяет управлять множеством небольших, независимо разрабатываемых и развертываемых сервисов. Это дает возможность масштабирования, позволяет стандартизировать подходы, упрощает обновление кода и продуктов в целом, позволяет легко откатывать изменения и многое другое.
Источник: Shutterstock. Kubernetes обладает рядом неоспоримых преимществ среди других решений, среди них: масштабируемость, безопасность и экономия ресурсов

Как установить Kubernetes

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

Kubernetes можно развернуть различными способами: через kubeadm, kOps, kubespray, с помощью cluster API и другие. В этой статье мы развернем кластер через kubeadm.

Kubeadm — инструмент, который используется для создания кластеров K8s. Он выполняет действия, необходимые для быстрого запуска минимально жизнеспособного кластера. Kubeadm также служит «строительным блоком» для более высокоуровневых инструментов, таких как kubespray.

Подготовка кластера Kubernetes с другими инструментами требует времени, ресурсов сервера и опыта. Kubeadm прост в освоении и подходит для случаев, когда необходимо быстро развернуть кластер с минимальными ресурсами.

Установка будет производиться на серверы с операционной системой Ubuntu. В качестве примера мы установим одну master node с именем k8s-master и одну worker node с именем k8s-worker.

Подготовка к установке

  1. На всех нодах откройте файл /etc/hosts в любом текстовом редакторе, например nano:
  1. Удалите строку с IP-адресом вашего сервера. Затем добавьте записи:

Где:

  • IP_MASTER_NODE — IP-адрес мастер-ноды,
  • IP_WORKER_NODE — IP-адрес рабочей ноды.

Чтобы сохранить изменения и закрыть файл, нажмите Ctrl+X, Y, Enter.

  1. Измените имя хоста в master node:
  1. Измените имя хоста в worker node:
  1. Перезайдите на каждый из серверов.

Установка Kubernetes

На всех нодах проделайте следующие шаги:

  1. Введите команды:
  1. Установите необходимые пакеты с помощью команды:
  1. Создайте директорию /etc/apt/keyrings:
  1. Добавьте GPG-ключ репозитория:
  1. Добавьте репозиторий K8s с помощью команды:
  1. Обновите список доступных пакетов с помощью команды:

Обратите внимание: во время выполнения этой команды может возникнуть ошибка 403:

Проблема возникает из-за подключения к серверам по IPv6. Чтобы ее устранить, можно отключить использование IPv6.

Чтобы временно (до перезагрузки) отключить использование IPv6, введите команды:

Чтобы включить IPv6, воспользуйтесь командами:

Чтобы полностью отключить использование IPv6, откройте файл /etc/sysctl.conf:

Добавьте в него параметры:

После сохраните изменения и закройте файл, нажав Ctrl+X, Y, Enter.

  1. Установите необходимые пакеты с помощью команды:
  1. Отключите автоматическое обновление kubelet, kubeadm и kubectl:
  1. Включите kubelet с помощью команды:
  1. Проверьте установленную версию kubeadm:
Вывод команды kubeadm version
  1. Отключите подкачку памяти:

Включение модулей ядра и изменение настроек sysctl

На всех нодах проделайте следующие шаги:

  1. Включите модули overlay и br_netfliter с помощью команд:
  1. Настройте sysctl. Для этого откройте файл kubernetes.conf:
  1. Добавьте в файл следующие параметры:

Чтобы сохранить изменения и закрыть файл, нажмите Ctrl+X, Y, Enter.

  1. Перезапустите sysctl с помощью команды:

Установка Containerd

На всех нодах проделайте следующие шаги:

  1. Включите постоянную загрузку модулей Containerd при помощи команды (обратите внимание: нужно ввести сразу все 4 строки):
  1. Выполните перезагрузку sysctl:
  1. Добавьте GPG-ключ для репозитория с помощью команды:
  1. Добавьте репозиторий Docker при помощи команды:
  1. Обновите список доступных пакетов и установите Сontainerd:
  1. Авторизуйтесь под пользователем root:
  1. Создайте новую директорию для Сontainerd с помощью команды:
  1. Добавьте в директорию конфигурационный файл:
  1. Откройте файл config.toml в любом текстовом редакторе, например nano:
  1. Измените значение параметра SystemdCgroup на true:

После сохраните изменения и закройте файл, нажав Ctrl+X, Y, Enter.

  1. Выйдите из-под root-пользователя:
  1. Выполните перезагрузку Containerd:
  1. Включите автоматический запуск службы Containerd:

Развертывание Kubernetes

  1. Войдите в k8s-master и извлеките образы контейнеров:
  1. Инициализируйте ноды с помощью команды:
  1. После выполнения команды в терминале появится информация о команде kubeadm join. Скопируйте эту команду.
Команда kubeadm join в терминале

Затем введите скопированную команду на k8s-worker. Так вы присоедините ноду к кластеру.

Если вы забыли сохранить команду, для повторного получения откройте ноду k8s-master и введите:

  1. Откройте k8s-master и создайте директорию для кластера при помощи команды:
  1. Скопируйте K8s config-файл в созданную директорию и измените владельца файла с помощью команды:
  1. Разверните сеть подов с помощью команды:
  1. Убедитесь, что вы успешно развернули сеть:
Успешно развернутая сеть подов
  1. В ноде k8s-master присвойте ноде k8s-worker роль worker при помощи команды:
  1. Затем выполните команду:
Список нод

В списке должна появиться master node и одна worker node. 

На этом установка и развертывание K8s завершены. Вы создали самый примитивный кластер с минимально необходимыми настройками. 

Пример использования 

В качестве примера использования Kubernetes мы создадим pod, запустим сервис NodePort и получим доступ к поду через узел кластера. Для этого:

  1. Создайте файл манифеста для пода с именем pod.yaml:
  1. Откройте файл в любом текстовом редакторе, например, nano:
  1. Добавьте в файл следующие строки:

Затем сохраните и закройте файл, нажав Ctrl+X, Y, Enter.

  1. Примените манифест с помощью команды:
  1. Создайте файл манифеста для сервиса NodePort и именем service.yaml:
  1. Откройте файл в любом текстовом редакторе, например nano:
  1. Добавьте в файл следующие строки:

Затем сохраните и закройте файл, нажав Ctrl+X, Y, Enter.

  1. Примените манифест с помощью команды:
  1. Теперь сервис NodePort будет доступен на любом узле кластера по IP-адресу узла и заданному в шаге 7 порту. Например, если в качестве значения nodePort указан порт 30007, а IP-адрес одного из узлов — 192.168.1.100, то pod будет доступен по адресу http://192.168.1.100:30007. Для проверки можно использовать команду curl:

Где <NodeIP> — IP вашей ноды.

Вывод будет примерно следующим:

Вывод команды curl

Внедрение Kubernetes в бизнес

Внедрение Kubernetes может значительно улучшить процессы разработки, развертывания и управления приложениями. Однако процесс внедрения требует тщательного планирования. Чтобы определиться, нужен ли Kubernetes вашему бизнесу:

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

Затем подготовьтесь к миграции:

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

Для перехода на K8s:

  1. Разверните кластер Кубера и мигрируйте первое приложение либо разверните тестовый проект. Выявите проблемы и при необходимости адаптируйте процессы.
  2. Внедрите практику CI/CD, чтобы автоматизировать развертывание приложений в Kubernetes.
  3. Настройте системы мониторинга и логирования для отслеживания состояния кластера и производительности приложений.
  4. Уделите внимание безопасности кластера, настройте ролевое управление доступом и защиту сетевого трафика.
  5. Постепенно продолжайте оптимизировать и масштабировать кластер.

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

Анастасия Мартынова

Кейс Stworka: как создать ERP в облаке для 5000 строительных компаний

А также запустить маркетплейс для строителей и обрабатывать 1,5 млн артикулов ежедневно. Рассказываем, как компания Stworka развернула IT-инфраструктуру в Облаке...
Read More

Системы контроля версий: зачем они нужны и как их использовать

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

Соглашение об уровне обслуживания (SLA)

Поговорим о документе, который может серьезно повлиять на успех проекта, будь то интернет-магазин, SaaS-платформа или любой другой онлайн-сервис. Речь пойдет...
Read More

Что такое S3 (Simple Storage Service)

Если вы только начинаете свой путь в разработке, вам обязательно нужно познакомиться с S3. Это краеугольный камень многих современных приложений...
Read More

Полный обзор NoSQL: особенности и использование

Развитие интернета диктует новые правила в разработке. Традиционные базы данных, которые называются реляционными (RDBMS), не справляются с задачами, которые требуют...
Read More

Как использовать DataSphere. Датасеты в DataSphere

Данные нужны в любой сфере: магазины анализируют продажи, в медцентры — истории болезней, ученые — результаты экспериментов. Чем больше информации,...
Read More

Основные задачи машинного обучения: классификация, регрессия, кластеризация и уменьшение размерности

Machine Learning ― это уже часть нашей повседневной жизни. От рекомендаций фильмов на Кинопоиске до спам-фильтров в почте — за...
Read More

Обзор CLI: командная строка и ее возможности

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

Шардирование в базах данных: обзор концепции

В условиях стремительного роста объемов данных и увеличения нагрузок на информационные системы эффективность их масштабирования становится критически важной. Одним из...
Read More

Графический процессор (GPU): что это, для кого, разновидности

Дизайнерам, проектировщикам и разработчикам требуются мощные вычислительные ресурсы для работы. Обычный процессор (CPU) не справится с такими задачами, как обработка...
Read More