Kubernetes: Быстрый старт за 1 час
Ключевые тезисы:
- Kubernetes — это оркестратор контейнеров для управления сотнями/тысячами контейнеров в разных средах.
- Решает задачи высокой доступности (HA), масштабируемости и восстановления после сбоев (Disaster Recovery).
- Основная архитектура: Master Node (управление) + Worker Nodes (запуск приложений).
- Конфигурация в Kubernetes декларативна (описываем желаемое состояние в YAML/JSON).
- Для локальной разработки и тестирования используется Minikube (одноузловой кластер).
- Взаимодействие с кластером происходит через kubectl (CLI-инструмент) и API-сервер.
Что такое Kubernetes и зачем он нужен?
Kubernetes — это open-source фреймворк для оркестрации контейнеров, изначально созданный Google. Он управляет контейнеризированными приложениями, состоящими из множества контейнеров, в различных средах: физических/виртуальных машинах, облаке или гибридных развертываниях.
Решаемые проблемы:
- Высокая доступность (High Availability): Приложение работает без простоев и всегда доступно для пользователей.
- Масштабируемость (Scalability): Быстрое масштабирование приложения вверх/вниз в зависимости от нагрузки.
- Восстановление после сбоев (Disaster Recovery): Механизмы резервного копирования и восстановления состояния приложения и данных при сбоях инфраструктуры.
Архитектура Kubernetes
Кластер Kubernetes состоит как минимум из одного Master Node и нескольких Worker Nodes.
Master Node (Узел управления)
Запускает ключевые процессы для управления кластером:
- API Server: Точка входа в кластер. Через него взаимодействуют все клиенты (UI, API, kubectl).
- Controller Manager: Следит за состоянием кластера (например, перезапускает упавшие контейнеры).
- Scheduler: Интеллектуально распределяет контейнеры по Worker Nodes на основе их нагрузки и доступных ресурсов.
- etcd: Key-value хранилище, которое в реальном времени хранит состояние всего кластера (конфигурации, статусы). Резервные копии (снапшоты) etcd используются для восстановления кластера.
Важно: Master Node критически важен. В production-средах обычно развертывают несколько Master Nodes для отказоустойчивости.
Worker Nodes (Рабочие узлы)
Здесь запускаются приложения. На каждом Worker Node работает:
- Kubelet: Процесс Kubernetes, который обеспечивает связь с кластером и выполнение задач на узле.
- Контейнеры приложений (например, Docker).
Виртуальная сеть объединяет все узлы кластера в единую "машину" с суммарными ресурсами.
Основные компоненты Kubernetes (на примере веб-приложения с БД)
1. Pod
- Наименьшая и основная единица в Kubernetes.
- Это абстракция над контейнером, создающая среду выполнения. Позволяет Kubernetes не зависеть от конкретной технологии контейнеров (Docker и др.).
- Обычно в одном Pod запускается один контейнер приложения, но могут быть и вспомогательные ("sidecar") контейнеры.
2. Service
- Постоянный статический IP-адрес и DNS-имя, которые можно привязать к Pod.
- Жизненный цикл Service не связан с Pod. Если Pod умирает и пересоздается с новым IP, Service и его адрес остаются прежними.
- Также выступает в роли внутреннего балансировщика нагрузки (Load Balancer) между репликами Pod.
- Типы:
- Internal (ClusterIP): Для внутреннего доступа внутри кластера (например, для БД).
- External (NodePort/LoadBalancer): Для доступа извне. NodePort открывает порт на самом узле (Node) в диапазоне 30000-32767.
3. Ingress
- Компонент для внешнего доступа по "красивому" URL (например,
https://myapp.com). - Запросы извне сначала попадают на Ingress, который перенаправляет их на соответствующий Service внутри кластера.
4. ConfigMap
- Внешняя конфигурация для приложения (например, URL базы данных).
- Хранит данные в виде пар "ключ-значение" в открытом текстовом формате.
- Изменение ConfigMap не требует пересборки образа приложения.
5. Secret
- Аналогичен ConfigMap, но предназначен для хранения конфиденциальных данных (пароли, ключи, сертификаты).
- Данные хранятся в base64-encoded формате (но это не шифрование!).
- Для безопасности Secrets необходимо шифровать с помощью сторонних инструментов.
6. Volumes (Тома)
- Обеспечивают постоянное хранение данных для Pod.
- Подключают физическое хранилище (локальное на узле или удаленное, например, облачное) к Pod.
- Kubernetes не управляет резервным копированием и репликацией данных в Volume — это ответственность администратора.
7. Deployment & StatefulSet
- Deployment: "Чертеж" (blueprint) для создания и управления Pod. Позволяет декларативно указать желаемое количество реплик (replicas) Pod и легко масштабироваться. Обеспечивает высокую доступность stateless-приложений (веб-серверы, микросервисы).
- StatefulSet: Аналог Deployment для stateful-приложений (базы данных: MongoDB, MySQL и т.д.). Управляет репликацией и синхронизацией доступа к общему хранилищу, чтобы избежать противоречий данных.
На практике базы данных часто размещают вне Kubernetes из-за сложности управления.
Конфигурация и работа с кластером
Конфигурационные файлы
- Все настройки подаются в декларативном виде в формате YAML или JSON через API-сервер.
- Структура файла:
apiVersion&kind(тип ресурса, например, Deployment).metadata(имя, метки).spec(желаемая конфигурация).status(фактическое состояние, заполняется Kubernetes автоматически на основе данных из etcd).
Инструменты для локальной разработки
- Minikube: Инструмент для запуска одноузлового локального кластера Kubernetes. Master и Worker процессы работают на одной машине (виртуальной или в контейнере).
- kubectl: Основной CLI-инструмент для взаимодействия с любым кластером Kubernetes (локальным Minikube или production).
kubectl get <component>— список компонентов (pods, services, deployments).kubectl describe <component> <name>— детальная информация о компоненте.kubectl logs <pod-name>— логи контейнера в Pod.kubectl apply -f <file.yaml>— применить конфигурацию из файла.
Практический пример: Развертывание приложения
Цель: Развернуть веб-приложение (Node.js) с базой данных (MongoDB) в Minikube.
Шаги:
- Установка и запуск Minikube с драйвером Docker.
- Создание конфигурационных файлов YAML:
config.yaml— ConfigMap с URL БД.secret.yaml— Secret с логином и паролем для БД (в base64).mongo.yaml— Deployment и Service для MongoDB. В Deployment указываются environment variables, берущие значения из Secret.webapp.yaml— Deployment и Service типа NodePort для веб-приложения. Environment variables приложения ссылаются на ConfigMap и Secret.
- Применение конфигураций через kubectl в правильном порядке (сначала ConfigMap/Secret, затем зависимости):
kubectl apply -f config.yaml kubectl apply -f secret.yaml kubectl apply -f mongo.yaml kubectl apply -f webapp.yaml - Проверка развертывания:
kubectl get all— статус всех компонентов.kubectl get pods— статус подов.minikube ip— получение IP-адреса кластера.- Доступ к приложению в браузере по адресу:
http://<MINIKUBE_IP>:<NODE_PORT>.
Выводы
- Kubernetes — мощный стандарт для оркестрации контейнеров, решающий ключевые задачи production-сред.
- Основная логика строится вокруг Pod, Service, Deployment/StatefulSet, ConfigMap/Secret и Volume.
- Minikube и kubectl — обязательные инструменты для начала работы и экспериментов.
- Конфигурация ведется декларативно в YAML-файлах, которые удобно хранить вместе с кодом приложения (Infrastructure as Code).
Важно: Master Node критически важен. В production-средах обычно развертывают несколько Master Nodes для отказоустойчивости.