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).
Другие термины в теме «DevOps и облака»
Не хватает деталей?
Напишите, что уточнить по теме «kubernetes» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).