PSB Hosting
Как развернуть Docker-контейнеры в Kubernetes: подробная инструкция

Как развернуть Docker-контейнеры в Kubernetes: подробная инструкция

  1. Главная
  2. Блог
  3. Как развернуть Docker-контейнеры в Kubernetes: подробная инструкция

Docker — открытая платформа, предназначенная для автоматизации процессов создания, распространения и запуска программ. Ключевая ее ценность — обеспечение единообразной среды, в которой приложения функционируют стабильно и вне зависимости от операционной системы или платформы.

Где используется

В программировании, например. Также часто встречается в рамках DevOps-практик и администрирования.

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

Архитектура Kubernetes-кластера

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

  1. Control Plane Nodes (узлы плоскости управления) — ранее известные как Master-узлы
  2. Worker Nodes (рабочие узлы)

Control Plane координируют работу системы. Они направляют команды Worker Nodes для запуска или остановки задач, а также мониторят статус самого кластера. Технически Control Plane узлы тоже способны исполнять пользовательские задачи, но с позиции безопасности — это не рекомендуемая практика: если вредоносный код попадет в рабочую нагрузку на таком узле, последствия будут куда серьезнее, чем при его запуске на Worker Node.

 Интересный факт: Истоки Kubernetes ведут к Google, где разработчики вдохновлялись внутренней системой Borg, отточенной годами эксплуатации в гигантских масштабах. Само название "Kubernetes" происходит от греческого слова κυβερνήτης (kybernḗtēs), означающего "кормчий" или "рулевой", что является отсылкой к проекту Borg из вселенной Star Trek.

Контейнеры: что это такое?

Контейнеризация — это упаковывание приложений в изолированные и компактные среды, легко переносимые между разными системами.

От виртуализации контейнеризация отличается фундаментально:

  • Виртуальные машины эмулируют компьютер с собственной операционной системой и ядром, в то время как контейнеры используют ядро хост-системы и изолируют только процессы и ресурсы.
  • Виртуальные машины требуют гипервизор и значительно больше ресурсов.
  • Виртуальные машины являются более универсальным решением, поскольку позволяют запускать разнородные операционные системы с различными ядрами.

Контейнеры более легкие, быстрее запускаются и настраиваются под конкретные задачи.

С точки зрения безопасности, изоляция контейнеров уступает изоляции виртуальных машин. Тем не менее, существуют механизмы для усиления безопасности контейнеров:

  • seccomp-профили
  • AppArmor/SELinux
  • Pod Security Standards
  • Network Policies
  • и другие

Достигаемого уровня изоляции достаточно для большинства сценариев.

Преимущества использования Kubernetes

Kubernetes превосходен для управления контейнерами, и вот почему:

  1. При создании контейнеров на этапе сборки приложение абстрагируется от физической инфраструктуры. Среда разработки и тестирования остается единой — будь то сервер или локальная машина программиста.
  2. Контейнеры легко мигрируют между разными ОС (Ubuntu, RHEL, CoreOS) и облачными платформами (Google Kubernetes Engine, Amazon EKS, Azure AKS).
  3. Kubernetes использует декларативный подход, позволяя задать целевое состояние, автоматически приводя текущую конфигурацию к требуемой. Система самостоятельно запускает новые экземпляры, удаляет устаревшие и оптимизирует распределение ресурсов.
  4. Kubernetes позволяет точно указать требования к процессору и памяти для каждого контейнера, чтобы эффективно использовать ресурсы кластера.
  5. Встроенные механизмы самовосстановления автоматически перезапускают упавшие контейнеры и перемещают рабочие нагрузки при отказе узлов.

Подготовка Docker-образа

Перед созданием Docker-образов необходимо установить Docker на рабочую машину. Метод установки варьируется в зависимости от ОС; подробные инструкции доступны на официальном сайте: https://docs.docker.com/get-docker/

И прежде чем двигаться дальше, давайте разберемся с базовыми концепциями. Они пригодятся позже.

Здесь у нас есть два центральных элемента:

  1. Images (образы) — неизменяемые шаблоны с кодом, зависимостями и настройками приложения.
  2. Containers (контейнеры) — runtime-сущности на основе образа, запущенные экземпляры приложений, которые разворачиваются посредством Docker.

Где разместить Docker-контейнеры для тестов и продакшена

После сборки и публикации образа в реестр, следующим шагом станет выбор надёжной инфраструктуры для запуска контейнеров. Здесь важно учитывать производительность, стабильность и возможность гибкой настройки ресурсов.

Отличным решением для размещения контейнеризованных приложений являются VPS-серверы от PSB.Hosting. Вы получаете:

  • Высокопроизводительные виртуальные машины с процессорами AMD Ryzen и дисками NVMe.
  • Поддержку всех популярных Linux-дистрибутивов и Docker-окружений.
  • Быстрое развёртывание, доступ к консоли и масштабируемые тарифы.

Такой вариант идеально подходит как для запуска небольших кластеров Kubernetes, так и для продвинутой среды CI/CD, особенно если вы хотите держать всё под контролем без избыточной зависимости от облачных провайдеров.

Создание Dockerfile для приложения

Dockerfile — это текстовый файл с инструкциями, необходимыми для сборки Docker-образа. Вот пример простого Dockerfile для Node.js приложения:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000
CMD ["node", "app.js"]

Этот Dockerfile:

  1. Использует официальный Node.js образ с Alpine Linux
  2. Устанавливает рабочую директорию /app
  3. Копирует файлы package.json и устанавливает зависимости
  4. Копирует остальные файлы приложения
  5. Указывает, что приложение использует порт 3000
  6. Запускает приложение командой node app.js

Сборка и публикация Docker-образа

После создания Dockerfile нужно собрать образ и опубликовать его в реестре:

# Сборка образа
docker build -t myapp:1.0 .

# Тегирование для Docker Hub или другого реестра
docker tag myapp:1.0 username/myapp:1.0

# Публикация в реестре
docker push username/myapp:1.0

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

Перед развертыванием приложения в Kubernetes важно понять основные объекты:

  1. Pod — наименьшая единица в Kubernetes, содержит один или несколько контейнеров
  2. Deployment — управляет набором идентичных подов, обеспечивает обновления и масштабирование
  3. Service — обеспечивает стабильный доступ к подам через единый IP-адрес и DNS-имя
  4. ConfigMap и Secret — предоставляют конфигурационные данные подам
  5. Ingress — управляет внешним доступом к сервисам в кластере

Развертывание приложения в Kubernetes

1. Создайте Deployment

Файл deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: username/myapp:1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "500m"

2. Создайте Service

Файл service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 3000
  type: ClusterIP

3. Опционально: создайте Ingress для внешнего доступа

Файл ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp
            port:
              number: 80

4. Примените конфигурацию к кластеру

# Убедитесь, что kubectl настроен на ваш кластер
kubectl config current-context

# Создайте namespace (не обязательно)
kubectl create namespace myapp

# Примените конфигурацию
kubectl apply -f deployment.yaml -n myapp
kubectl apply -f service.yaml -n myapp
kubectl apply -f ingress.yaml -n myapp

# Проверьте статус развертывания
kubectl get pods -n myapp
kubectl get services -n myapp
kubectl get ingress -n myapp

Масштабирование и обновление приложения

Масштабирование

# Увеличение количества реплик
kubectl scale deployment myapp -n myapp --replicas=5

Обновление образа

# Обновление образа в Deployment
kubectl set image deployment/myapp myapp=username/myapp:2.0 -n myapp

# Проверка статуса обновления
kubectl rollout status deployment/myapp -n myapp

Откат обновления

# Если обновление оказалось неудачным
kubectl rollout undo deployment/myapp -n myapp

Мониторинг и отладка

Просмотр логов

# Получение названия пода
kubectl get pods -n myapp

# Просмотр логов
kubectl logs pod/myapp-abc123 -n myapp

Доступ к контейнеру

# Выполнение команды в контейнере
kubectl exec -it pod/myapp-abc123 -n myapp -- /bin/bash

Мониторинг ресурсов

# Просмотр потребления ресурсов подами
kubectl top pods -n myapp

Главное

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

Для более глубокого изучения Kubernetes рекомендую обратиться к официальной документации: https://kubernetes.io/ru/docs/