title: “Введение в Kubernetes” —

Введение в Kubernetes

Оглавление

  1. Подходы к эксплуатации приложений: эволюция и проблемы
  2. Основные возможности Service Mesh и Istio
  3. Ключевые концепции 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)).

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 — инструмент управления сложными распределёнными приложениями: Позволяет автоматизировать масштабирование, самовосстановление, деплой и сетевые политики.
  • Сервисная архитектура требует новых подходов: Для обеспечения отказоустойчивости, наблюдаемости и безопасности распределённых систем нужны сервисные mesh-решения вроде Istio.
  • Безопасность и управление секретами обязательны: Kubernetes предоставляет базовые инструменты, но для максимальной безопасности используются специализированные решения вроде Sealed Secrets и HashiCorp Vault.
  • Гибкость хранилищ, сетей и стратегий деплоя: Kubernetes поддерживает разные типы storage & network, а также много вариантов деплой-стратегий (rolling, blue/green, canary, A/B).