title: “Введение в Kubernetes” —
Введение в Kubernetes
Оглавление
- Подходы к эксплуатации приложений: эволюция и проблемы
- Основные возможности Service Mesh и Istio
- Ключевые концепции Kubernetes
Подходы к эксплуатации приложений — эволюция и проблемы
Этап 1: Традиционная эра (1990-2000)
- Архитектура:
- Одно приложение + библиотеки + ОС + физический сервер (hardware).
- Плюсы:
- Полная изоляция: Одно приложение на одном сервере полностью изолировано от других.
- Минусы:
- Неэффективное использование ресурсов: Серверы часто простаивали.
- Нет динамики: Сложно масштабировать.
- Низкая скорость запуска: Подготовка нового сервера занимала часы или дни.
Этап 2: Эра виртуализации
- Архитектура:
- На одном физическом сервере запускается несколько виртуальных машин (VM). Каждая VM имеет свою гостевую ОС и приложение.
- Плюсы:
- Высокая изоляция сохраняется.
- Появилась динамика: Можно создавать и перемещать образы VM.
- Более эффективное использование оборудования.
- Минусы:
- Низкая скорость запуска: Запуск целой ОС все еще занимает минуты.
- Каждая VM несет накладные расходы на полноценную гостевую ОС.
- Статус: Активно используется и сейчас.
Этап 3: Эра контейнеризации
- Архитектура:
- Приложения и их зависимости упаковываются в легковесные, изолированные контейнеры.
- Все контейнеры работают на одном ядре ОС хоста, используя общую среду выполнения (container runtime).
- Изоляция достигается за счет механизмов ядра Linux:
- Namespaces: Изоляция процессов, сети, пользователей и т.д.
- Cgroups: Ограничение и управление ресурсами (CPU, память, ввод/вывод).
- Плюсы:
- Высокая изоляция компонентов.
- Высокая динамика конфигураций.
- Очень высокая скорость запуска (секунды).
Проблемы управления сложными приложениями
- Современное приложение — это не один монолит, а множество взаимосвязанных компонентов:
- frontend, backend, базы данных, кэши, брокеры сообщений, индексаторы, фоновые обработчики и т.д.
- Развертывание на одной машине:
- Проблемы:
- Отсутствие изоляции (конфликт портов, библиотек).
- Отказоустойчивость стремится к нулю.
- Масштабирование только горизонтальное (добавление новых таких же машин).
- Проблемы:
- Развертывание на разных VM:
- Проблемы:
- Масштабирование дорогое.
- Отказоустойчивость сложна в настройке.
- Огромная сложность развертывания (деплоя) и управления конфигурацией сети.
- Проблемы:
- Необходимость: Требуется инструмент, который берет на себя всю сложность управления жизненным циклом распределенного приложения. Таким инструментом является Kubernetes.
Основные возможности Service Mesh и Istio
Ключевые возможности Istio
- Connect (Соединение):
- Управление трафиком, включая маршрутизацию, балансировку нагрузки, отказоустойчивость.
- Secure (Безопасность):
- Обеспечение взаимного TLS-шифрования (mTLS) между сервисами.
- Управление аутентификацией и авторизацией.
- Observe (Наблюдаемость):
- Автоматический сбор метрик, логов и трассировок для всего трафика.
- Control (Контроль):
- Применение политик (например, ограничение частоты запросов — rate limiting).
Ключевые объекты Istio
- Gateway: Управляет входящим и исходящим трафиком на границе Service Mesh.
- VirtualService: Определяет правила маршрутизации трафика к сервисам внутри сети.
- DestinationRule: Определяет политики, применяемые к трафику после маршрутизации (например, настройки балансировки нагрузки, версии TLS и политики обнаружения выбросов).
Ключевые концепции Kubernetes
Labels & Selectors (Метки и селекторы)
- Метки: Пары “ключ-значение”, присваиваемые объектам Kubernetes (например, подам).
- Селекторы: Используются для выбора объектов с определенными метками. Основной механизм группировки в Kubernetes.
- Equality-based (на основе равенства): Выбор по точному совпадению ключа и значения (например,
app=nginx). - Set-based (на основе множеств): Выбор по принадлежности значения к набору (например,
env in (production, development)).
- Equality-based (на основе равенства): Выбор по точному совпадению ключа и значения (например,
Storage (Хранилище)
- Volume: Хранилище, привязанное к жизненному циклу пода.
- PersistentVolume (PV): “Кусок” хранилища в кластере, может быть статически или динамически выделен.
- PersistentVolumeClaim (PVC): Запрос пода на использование PV.
- StorageClass: Позволяет администраторам определять “классы” хранилищ, которые они предлагают.
- При создании PVC с указанием StorageClass хранилище может быть выделено автоматически (динамическое выделение).
Networking (Сеть)
- Типы Service:
- ClusterIP: Сервис доступен только внутри кластера по внутреннему IP-адресу (тип по умолчанию).
- NodePort: Сервис доступен извне через статический порт на IP-адресе каждого узла кластера.
- LoadBalancer: Создаёт внешний балансировщик нагрузки у облачного провайдера и направляет трафик на сервис через NodePort.
- ExternalName: Создаёт CNAME-запись в DNS кластера, перенаправляя запросы на внешнее имя (например,
my.database.example.com).
Deployment Strategies (Стратегии развертывания)
- Rolling Update:
- Постепенное обновление подов, один за другим, без простоя.
- Старые поды удаляются только после того, как новые становятся готовы.
- Recreate:
- Старая версия приложения полностью останавливается, затем запускается новая.
- Приводит к простою.
- Blue/Green (Сине-зеленое развертывание):
- Две идентичные среды: “синяя” (старая версия) и “зеленая” (новая версия).
- Трафик переключается с синей на зеленую.
- Быстрый откат (switchback) — достаточно вернуть трафик на синюю среду.
- Canary (Канареечное развертывание):
- Новая версия выкатывается на небольшую часть пользователей.
- Если все в порядке — постепенно распространяется на всех.
- Позволяет протестировать новую версию в реальных условиях с минимальным риском.
- A/B Testing:
- Развертывание нескольких версий приложения одновременно для разных сегментов пользователей.
- Сравнение их эффективности по определенным метрикам.
Secrets Management (Управление секретами)
- Секреты (пароли, API-ключи, токены) не рекомендуется хранить в виде простого текста в манифестах или внутри образов.
- Рекомендуемые подходы:
- Kubernetes Secrets:
- Встроенный механизм.
- Данные хранятся в etcd в кодировке Base64 (не считается шифрованием!).
- Для безопасности нужно включить шифрование в состоянии покоя (Encryption at Rest) — чтобы секреты в etcd были зашифрованы.
- Sealed Secrets (Bitnami):
- Позволяет безопасно хранить зашифрованные секреты в Git-репозиториях.
- Секрет шифруется асимметричным ключом; может быть расшифрован только контроллером в кластере.
- HashiCorp Vault:
- Внешнее, централизованное хранилище секретов.
- Приложения в Kubernetes аутентифицируются в Vault и динамически получают нужные им секреты во время работы.
- Считается одним из самых безопасных и гибких решений.
- Kubernetes Secrets:
Фундаментальные концепции (повторяются):
- Изоляция и автоматизация как фундамент: Каждый этап эволюции (традиционные серверы, виртуализация, контейнеры) решает проблемы предыдущих за счёт повышения изоляции и автоматизации развертывания.
- Kubernetes — инструмент управления сложными распределёнными приложениями: Позволяет автоматизировать масштабирование, самовосстановление, деплой и сетевые политики.
- Сервисная архитектура требует новых подходов: Для обеспечения отказоустойчивости, наблюдаемости и безопасности распределённых систем нужны сервисные mesh-решения вроде Istio.
- Безопасность и управление секретами обязательны: Kubernetes предоставляет базовые инструменты, но для максимальной безопасности используются специализированные решения вроде Sealed Secrets и HashiCorp Vault.
- Гибкость хранилищ, сетей и стратегий деплоя: Kubernetes поддерживает разные типы storage & network, а также много вариантов деплой-стратегий (rolling, blue/green, canary, A/B).