Если вы работаете в мире разработки программного обеспечения, вы наверняка слышали о Kubernetes. Но что это такое и почему он стал стандартом де-факто для управления контейнеризированными приложениями? Это руководство проведёт вас от основ к ключевым концепциям с практическими примерами и диаграммами.
До Kubernetes: немного истории
Чтобы понять, почему Kubernetes настолько революционен, сделаем шаг назад.
- Традиционное развёртывание: изначально приложения запускались на физических серверах. Этот подход был дорогим, сложно масштабируемым и подверженным конфликтам ресурсов.
- Виртуализированное развёртывание: затем появились виртуальные машины (ВМ). ВМ позволяли запускать несколько изолированных приложений на одном оборудовании, улучшая использование ресурсов и безопасность. Однако каждая ВМ запускает полноценную операционную систему, потребляя много ресурсов.
- Контейнерное развёртывание: контейнеры (например, Docker) — следующий этап эволюции. Они используют общую операционную систему хоста, но запускают изолированные процессы. Они лёгкие, быстро запускаются и переносимы.
Контейнеры решили проблему переносимости, но создали другую: как управлять сотнями (или тысячами) контейнеров в продакшн-среде? Как гарантировать, что они всегда работают, могут взаимодействовать друг с другом и масштабироваться в зависимости от нагрузки?
Здесь на сцену выходит Kubernetes.
Что такое Kubernetes?
Kubernetes (часто сокращают до K8s) — это платформа с открытым исходным кодом для оркестрации контейнеров. Простыми словами, она автоматизирует развёртывание, масштабирование и управление контейнеризированными приложениями. Создан Google и теперь поддерживается Cloud Native Computing Foundation (CNCF), Kubernetes стал основным инструментом для всех, кто работает с микросервисами в масштабе.
Архитектура кластера Kubernetes
Среда Kubernetes называется кластером. Кластер состоит из набора машин, называемых нодами (nodes), которые запускают наши приложения. Архитектура разделена на две основные части: Control Plane и Worker Nodes.
Control Plane
Control Plane — это «мозг» кластера. Он принимает глобальные решения (такие как планирование) и обнаруживает события кластера и реагирует на них. Его основные компоненты:
- API Server (
kube-apiserver): шлюз кластера. Он предоставляет API Kubernetes, который используется пользователями (черезkubectl), компонентами кластера и внешними инструментами для взаимодействия. - etcd: согласованная и высокодоступная база данных «ключ-значение». Хранит все данные кластера, представляя желаемое и текущее состояние системы.
- Scheduler (
kube-scheduler): назначает вновь созданные Pods на доступные Worker Nodes с учётом требований к ресурсам, политик и других ограничений. - Controller Manager (
kube-controller-manager): запускает контроллеры — циклы управления, которые отслеживают состояние кластера и работают над приведением его к желаемому состоянию. Например,Node Controllerуправляет нодами, аReplication Controllerобеспечивает работу нужного количества Pods.
Worker Node
Worker Nodes — это машины (физические или виртуальные), на которых фактически работают приложения. Каждая нода управляется Control Plane и содержит следующие компоненты:
- Kubelet: агент, работающий на каждой ноде. Обеспечивает запуск и работоспособность контейнеров, описанных в Pods.
- Kube-proxy: сетевой прокси, управляющий сетевыми правилами на нодах. Позволяет выполнять сетевое взаимодействие с Pods из сессий внутри или снаружи кластера.
- Container Runtime: программное обеспечение, отвечающее за запуск контейнеров. Docker наиболее известен, но Kubernetes также поддерживает другие среды выполнения, такие как
containerdиCRI-O.
Основные объекты Kubernetes
В Kubernetes всё представлено объектами. Эти объекты — «записи намерений»: создав объект, Kubernetes постоянно работает над тем, чтобы он существовал и соответствовал желаемому состоянию.
Вот наиболее важные:
Pod
Pod — наименьшая единица выполнения в Kubernetes. Он представляет один или несколько контейнеров, которые работают вместе на одной ноде, разделяя ресурсы, такие как сеть и хранилище.
Обычно в Pod запускается только один контейнер, но в продвинутых сценариях (например, «sidecar containers» для логирования или мониторинга) их может быть больше.
Вы почти никогда не создаёте Pods напрямую. Используются абстракции более высокого уровня, такие как Deployments.
Deployment
Deployment — объект, который вы будете использовать чаще всего. Он описывает желаемое состояние для группы идентичных Pods. Контроллер Deployment отвечает за:
- Создание и управление ReplicaSet (другой объект, обеспечивающий запуск определённого количества реплик Pod).
- Масштабирование количества Pods вверх или вниз.
- Управление обновлениями приложения контролируемым образом (например, Rolling Update) без простоя.
Пример YAML-файла для Deployment, запускающего 3 реплики сервера NGINX:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Service
Pods в Kubernetes эфемерны: они могут создаваться и уничтожаться в любой момент. У каждого Pod есть собственный IP-адрес, но он нестабилен. Как же надёжно предоставить доступ к приложению?
С помощью Service. Service — это абстракция, определяющая логический набор Pods и политику доступа к ним. Он предоставляет стабильную точку доступа (виртуальный IP-адрес и DNS-имя) для группы Pods.
Service использует selector на основе labels для поиска Pods, к которым нужно направлять трафик.
Как создать Service для нашего NGINX Deployment:
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP # Default - exposes the service only within the cluster
Существуют различные типы Services:
ClusterIP: предоставляет доступ к сервису по внутреннему IP кластера (по умолчанию).NodePort: предоставляет доступ к сервису через статический порт на каждой Worker Node.LoadBalancer: создаёт внешний балансировщик нагрузки в облачном провайдере (например, AWS, GCP) и назначает публичный IP сервису.
Ingress
Service типа LoadBalancer удобен, но создание его для каждого сервиса может быть дорогим. Для предоставления нескольких HTTP/HTTPS-сервисов внешнему миру используется Ingress.
Ingress действует как «интеллектуальный маршрутизатор» для внешнего трафика. Он позволяет определять правила маршрутизации на основе хоста (например, api.mysite.com) или пути (например, mysite.com/api).
Пример Ingress:
# example-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: mysite.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: /ui pathType: Prefix backend: service: name: ui-service port: number: 3000
Другие полезные объекты
- Namespace: позволяет создавать «виртуальные кластеры» внутри физического кластера. Полезно для изоляции сред (например,
development,staging,production) или команд. - ConfigMap и Secret: для управления конфигурационными данными и секретами (паролями или API-ключами), отделёнными от образа контейнера.
- StatefulSet: аналогичен Deployment, но предназначен для приложений с сохранением состояния (например, баз данных), требующих стабильных сетевых идентификаторов и постоянного хранилища.
- PersistentVolume (PV) и PersistentVolumeClaim (PVC): для управления постоянным хранилищем в кластере.
Заключение
Kubernetes — невероятно мощный инструмент, но его кривая обучения может быть крутой. Это руководство лишь затронуло поверхность, но мы надеемся, что оно дало вам прочное понимание базовых концепций.
Что делать дальше?
- Экспериментируйте локально: установите Minikube или Kind для создания кластера Kubernetes на вашем компьютере.
- Используйте
kubectl: освойте командуkubectl— ваш основной инструмент взаимодействия с кластером. Попробуйте создать NGINX Deployment и Service из этой статьи. - Изучите официальные туториалы: документация Kubernetes — отличный ресурс с множеством примеров.
Оркестрация контейнеров — фундаментальный навык в мире cloud-native, и владение Kubernetes откроет перед вами мир возможностей. Удачи!