kubernetes

Kubernetes (K8s) — открытая платформа для автоматизации развёртывания, масштабирования и управления контейнеризованными приложениями. Разработан в Google на основе внутренней системы Borg и передан в CNCF (Cloud Native Computing Foundation) в 2014 году. Kubernetes решает задачи, которые возникают при работе с десятками и сотнями контейнеров: распределение нагрузки, автоматическое восстановление после сбоев, rolling-обновления и горизонтальное масштабирование.

Архитектура Kubernetes: Control Plane и Worker Nodes

Кластер Kubernetes состоит из двух типов узлов:

Control Plane (управляющий слой) — мозг кластера, отвечающий за принятие решений:

  • kube-apiserver — единственная точка входа для всех операций. Все компоненты взаимодействуют через REST API.
  • etcd — распределённое key-value хранилище, содержащее всё состояние кластера.
  • kube-scheduler — выбирает, на каком узле запустить Pod, учитывая ресурсы и ограничения.
  • kube-controller-manager — контроллеры, поддерживающие желаемое состояние: ReplicaSet Controller, Deployment Controller, Node Controller и другие.

Worker Nodes (рабочие узлы) — машины, на которых работают приложения:

  • kubelet — агент на каждом узле, получает спецификации Pod-ов и обеспечивает их запуск.
  • kube-proxy — управляет сетевыми правилами на узле для Service-абстракций.
  • Container Runtime — containerd или CRI-O для запуска контейнеров.

Основные объекты Kubernetes

  • Pod — минимальная единица развёртывания. Содержит один или несколько контейнеров, разделяющих сеть и хранилище. Pod эфемерен: при сбое пересоздаётся на другом узле.
  • Deployment — описывает желаемое состояние набора Pod-ов: какой образ, сколько реплик, стратегия обновления (RollingUpdate, Recreate). Автоматически создаёт ReplicaSet.
  • Service — стабильный сетевой адрес для группы Pod-ов. Типы: ClusterIP (внутри кластера), NodePort (через порт узла), LoadBalancer (внешний балансировщик в облаке).
  • Ingress — маршрутизация HTTP/HTTPS-трафика к сервисам по именам хостов и путям. Требует Ingress Controller (nginx, traefik, HAProxy).
  • ConfigMap / Secret — хранение конфигурации и секретов отдельно от образов.
  • PersistentVolume / PersistentVolumeClaim — персистентное хранилище для stateful-приложений.
  • StatefulSet — для stateful-приложений (БД, Kafka): гарантирует стабильные имена Pod-ов и порядок запуска.
  • HorizontalPodAutoscaler — автоматическое масштабирование числа реплик на основе CPU, памяти или кастомных метрик.

Декларативная модель управления

Kubernetes работает по принципу reconciliation loop: пользователь описывает желаемое состояние (desired state) в YAML-манифестах, контроллеры непрерывно сравнивают его с реальным состоянием (current state) и принимают действия для их выравнивания. Если Pod упал — контроллер создаст новый. Если нода вышла из строя — Pod-ы переедут на другие узлы. Это делает систему самовосстанавливающейся (self-healing).

Networking: Service Discovery и DNS

Каждый Pod получает уникальный IP-адрес внутри кластера. Service абстрагирует набор Pod-ов за стабильным виртуальным IP (ClusterIP) и DNS-именем. Встроенный CoreDNS разрешает имена сервисов: my-service.my-namespace.svc.cluster.local. kube-proxy настраивает правила iptables/IPVS для балансировки запросов между Pod-ами Service.

GitOps и деплой в Kubernetes

GitOps — практика, при которой Git-репозиторий является единственным источником правды о состоянии кластера. Инструменты Flux и Argo CD отслеживают изменения в репозитории и автоматически применяют их к кластеру. Helm — менеджер пакетов для Kubernetes: Chart — шаблонизированный набор манифестов для развёртывания приложений. Kustomize позволяет накладывать патчи на базовые манифесты без шаблонизации.

Мониторинг и наблюдаемость

Стандартный стек мониторинга: Prometheus (сбор метрик из kube-state-metrics, node-exporter, приложений) + Grafana (визуализация). Логи агрегируются через Fluentd/Fluent Bit в Elasticsearch или Loki. Трассировка запросов — Jaeger или Tempo. Kubernetes предоставляет встроенные метрики через Metrics Server, необходимый для HPA.

Управляемые Kubernetes в облаке

Облачные провайдеры предоставляют управляемые Kubernetes-кластеры, где Control Plane обслуживается провайдером: EKS (AWS), GKE (Google Cloud), AKS (Azure). Это избавляет от операционной сложности управления etcd и Control Plane. Для локального развёртывания используют minikube, kind (Kubernetes in Docker) или k3s (лёгкий дистрибутив для edge и IoT).

Частые вопросы

  • Чем Kubernetes отличается от Docker Compose?

    Docker Compose предназначен для разработки и запуска нескольких контейнеров на одном хосте. Kubernetes — production-grade оркестратор для нескольких хостов: автоматическое восстановление, горизонтальное масштабирование, rolling updates, service discovery, управление секретами, RBAC, мониторинг. Порог входа Kubernetes значительно выше, но он необходим при масштабировании за пределы одного сервера.

  • Что такое Pod и почему он эфемерен?

    Pod — минимальная единица развёртывания в Kubernetes, содержащая один или несколько контейнеров. Pod эфемерен по дизайну: при сбое или пересоздании он получает новый IP-адрес и имя. Для стабильного сетевого адреса используется Service. Для stateful-данных — PersistentVolume. StatefulSet даёт предсказуемые имена Pod-ов для БД и очередей.

  • Как Kubernetes масштабирует приложения автоматически?

    HorizontalPodAutoscaler (HPA) отслеживает метрики (CPU, память, кастомные) и увеличивает или уменьшает число реплик Deployment. VerticalPodAutoscaler (VPA) автоматически подбирает запросы ресурсов для Pod-ов. Cluster Autoscaler добавляет или удаляет узлы кластера в зависимости от потребностей Pod-ов — интегрируется с облачными провайдерами (AWS, GCP, Azure).

Не хватает деталей?

Напишите, что уточнить по теме «kubernetes» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться