Skip to content

Основы Docker: Kubernetes

Kubernetes (часто сокращенно K8s) — это портативная, расширяемая платформа с открытым исходным кодом для управления контейнеризованными рабочими нагрузками и сервисами. Kubernetes автоматизирует развертывание, масштабирование и управление контейнерами. Изначально разработанный в Google на основе их многолетнего опыта эксплуатации крупномасштабных контейнерных систем (Borg), Kubernetes теперь поддерживается Cloud Native Computing Foundation (CNCF).

Основные понятия Kubernetes

  • Кластер (Cluster): Набор узлов (физических или виртуальных машин), объединенных в единую систему для запуска контейнеризованных приложений.
  • Узел (Node): Рабочая машина в Kubernetes, где запускаются контейнеры. Каждый узел управляется мастером.
  • Мастер (Master Node): Узел (или набор узлов), который контролирует и управляет кластером. Компоненты мастера включают API-сервер, etcd (хранилище конфигурации), планировщик (scheduler), контроллеры (controllers) и менеджер облачных контроллеров (cloud controller manager).
  • Pod: Наименьшая развертываемая единица в Kubernetes. Pod представляет собой группу из одного или нескольких контейнеров (обычно совместно расположенных и тесно связанных), разделяющих общее хранилище, сетевые ресурсы и конфигурацию.
  • Deployment: Объект Kubernetes, который обеспечивает декларативное обновление приложений. Deployment позволяет описывать желаемое состояние вашего приложения (например, количество реплик Pod-ов) и Kubernetes будет стремиться поддерживать это состояние.
  • Service: Абстракция, определяющая логический набор Pod-ов и политику доступа к ним. Service обеспечивает стабильную IP-адрес и DNS-имя для группы Pod-ов, что позволяет другим приложениям внутри кластера обращаться к ним, не заботясь об отдельных IP-адресах Pod-ов, которые могут меняться.
  • Namespace: Виртуальный кластер внутри физического кластера Kubernetes. Namespaces используются для организации ресурсов кластера и изоляции групп ресурсов.
  • kubelet: Агент, работающий на каждом узле и отвечающий за запуск и управление контейнерами в Pod-ах, назначенных этому узлу мастером.
  • kube-proxy: Сетевой прокси, работающий на каждом узле и реализующий концепцию Service.
  • etcd: Распределенное, надежное хранилище ключей-значений, используемое Kubernetes для хранения всех данных кластера, включая конфигурацию, состояние и метаданные.
  • kube-scheduler: Компонент мастера, который назначает новые Pod-ы на узлы на основе доступных ресурсов, требований Pod-ов и политик размещения.
  • kube-controller-manager: Компонент мастера, который запускает основные контроллеры Kubernetes, такие как контроллер репликации, контроллер узлов, контроллер сервисов и контроллер конечных точек.
  • kube-apiserver: Компонент мастера, который предоставляет API Kubernetes. Все взаимодействия с кластером (как пользовательские команды, так и внутренние коммуникации компонентов) проходят через API-сервер.
  • kubectl: Командная строка Kubernetes (CLI), используемая для взаимодействия с API-сервером и управления кластером.

Основные принципы Kubernetes

  • Декларативное управление: Пользователи описывают желаемое состояние своей системы (например, сколько реплик приложения должно работать), а Kubernetes стремится поддерживать это состояние.
  • Автоматизация: Kubernetes автоматизирует многие рутинные задачи, такие как развертывание, масштабирование, восстановление после сбоев и управление ресурсами.
  • Самовосстановление (Self-healing): Kubernetes автоматически перезапускает отказавшие контейнеры, заменяет неисправные узлы и перераспределяет задачи при необходимости.
  • Масштабируемость: Kubernetes может масштабировать приложения как горизонтально (увеличивая количество реплик), так и вертикально (увеличивая ресурсы, выделенные Pod-ам).
  • Обнаружение сервисов и балансировка нагрузки: Kubernetes предоставляет встроенные механизмы для обнаружения сервисов и распределения трафика между Pod-ами.

Взаимодействие Docker и Kubernetes

Docker является одной из наиболее распространенных технологий контейнеризации, используемой Kubernetes. Kubernetes управляет контейнерами, созданными Docker (или другими совместимыми средами выполнения контейнеров, такими как containerd или CRI-O).

Обычно рабочий процесс выглядит так:

  1. Разработчики создают Docker-образы своих приложений.
  2. Эти образы хранятся в Docker Registry (например, Docker Hub или частном реестре).
  3. Администраторы Kubernetes развертывают приложения в кластере, определяя Pod-ы (которые включают контейнеры из этих образов), Deployments (для управления репликами) и Services (для обеспечения сетевого доступа).
  4. Kubernetes оркестрирует запуск этих контейнеров на узлах кластера, управляет их жизненным циклом, масштабирует при необходимости и обеспечивает взаимодействие между ними.

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

Pod

Pod — это базовая единица развертывания в Kubernetes. Он может содержать один или несколько контейнеров, которые тесно связаны и совместно используют ресурсы (сеть, хранилище). Контейнеры в одном Pod-е могут легко взаимодействовать друг с другом (например, через localhost).

yaml
# Пример определения Pod
apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
  labels:
    app: my-app
spec:
  containers:
    - name: my-app-container
      image: my-registry/my-app:1.0
      ports:
        - containerPort: 8080

Deployment

Deployment обеспечивает декларативное управление репликацией и обновлением Pod-ов. Вы описываете желаемое количество реплик, стратегию обновления (например, rolling update) и Kubernetes контролирует фактическое состояние.

yaml
# Пример определения Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app-container
          image: my-registry/my-app:1.0
          ports:
            - containerPort: 8080

Service

Service обеспечивает стабильный способ доступа к группе Pod-ов. Он предоставляет виртуальный IP-адрес (ClusterIP) и DNS-имя, которые не меняются, даже если IP-адреса отдельных Pod-ов меняются (например, при перезапуске или масштабировании). Существуют различные типы Services (ClusterIP, NodePort, LoadBalancer, ExternalName).

yaml
# Пример определения Service типа ClusterIP
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  labels:
    app: my-app
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Управление Kubernetes с помощью kubectl

kubectl — это основной инструмент командной строки для взаимодействия с кластером Kubernetes. Некоторые основные команды:

  • kubectl get <resource>: Отображает информацию о ресурсах (например, kubectl get pods, kubectl get deployments, kubectl get services).
  • kubectl create -f <filename.yaml>: Создает ресурсы, определенные в YAML-файле.
  • kubectl apply -f <filename.yaml>: Применяет конфигурацию, определенную в YAML-файле (создает или обновляет ресурсы). Рекомендуется использовать apply для декларативного управления.
  • kubectl describe <resource> <name>: Отображает подробную информацию о конкретном ресурсе (например, kubectl describe pod my-app-pod).
  • kubectl delete <resource> <name>: Удаляет указанный ресурс (например, kubectl delete pod my-app-pod, kubectl delete deployment my-app-deployment).
  • kubectl logs <pod_name> [-c <container_name>]: Отображает логи контейнера(ов) в Pod-е.
  • kubectl exec -it <pod_name> [-c <container_name>] -- <command>: Выполняет команду в контейнере Pod-а (например, kubectl exec -it my-app-pod -- /bin/bash).
  • kubectl scale deployment <deployment_name> --replicas=<count>: Масштабирует количество реплик Deployment-а.

Сравнение Docker Swarm и Kubernetes

FeatureDocker SwarmKubernetes
СложностьПроще в настройке и использованииБолее сложный в настройке и управлении
АрхитектураДецентрализованная (менеджеры)Централизованная (мастер и узлы)
МасштабируемостьХорошая для средних кластеровОтличная для больших и сложных кластеров
ФункциональностьОсновная оркестрация контейнеровШирокий спектр возможностей (хранение, сеть, безопасность и т.д.)
УстановкаВстроен в Docker EngineТребует отдельной установки и настройки
CLIdocker swarm, docker service, docker stackkubectl
КонфигурацияDocker Compose (расширенный)YAML-манифесты
Обнаружение сервисовВстроенное DNSВстроенное DNS
Балансировка нагрузкиВстроеннаяВстроенная (через Service)
ОтказоустойчивостьУправление кворумом менеджеровНесколько компонентов мастера с репликацией
СообществоМеньшееОгромное и очень активное
Случаи использованияПростые и средние приложения, Docker-ориентированные средыКрупные, сложные приложения, гетерогенные среды

Заключение

Kubernetes — это мощная и гибкая платформа оркестрации контейнеров, которая предоставляет широкие возможности для управления современными, масштабируемыми приложениями. Хотя его установка и управление могут быть более сложными, чем у Docker Swarm, Kubernetes предлагает более богатый набор функций и лучше подходит для крупномасштабных и сложных сред. Docker Swarm остается хорошим выбором для более простых сценариев и для команд, уже глубоко интегрированных с экосистемой Docker.

Выбор между Docker Swarm и Kubernetes зависит от конкретных потребностей вашего проекта, размера команды, сложности приложения и требований к масштабируемости и отказоустойчивости.