Docker — открытая платформа, предназначенная для автоматизации процессов создания, распространения и запуска программ. Ключевая ее ценность — обеспечение единообразной среды, в которой приложения функционируют стабильно и вне зависимости от операционной системы или платформы.
Где используется
В программировании, например. Также часто встречается в рамках DevOps-практик и администрирования.
Kubernetes — тоже платформа и тоже с открытым исходным кодом, и тоже применяется для автоматизации, но уже контейнеризованных сервисов. Она предлагает механизмы для развертывания приложений, их масштабирования и обеспечения бесперебойной работы.
Архитектура Kubernetes-кластера
Кластер Kubernetes включает два типа узлов:
- Control Plane Nodes (узлы плоскости управления) — ранее известные как Master-узлы
- 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 превосходен для управления контейнерами, и вот почему:
- При создании контейнеров на этапе сборки приложение абстрагируется от физической инфраструктуры. Среда разработки и тестирования остается единой — будь то сервер или локальная машина программиста.
- Контейнеры легко мигрируют между разными ОС (Ubuntu, RHEL, CoreOS) и облачными платформами (Google Kubernetes Engine, Amazon EKS, Azure AKS).
- Kubernetes использует декларативный подход, позволяя задать целевое состояние, автоматически приводя текущую конфигурацию к требуемой. Система самостоятельно запускает новые экземпляры, удаляет устаревшие и оптимизирует распределение ресурсов.
- Kubernetes позволяет точно указать требования к процессору и памяти для каждого контейнера, чтобы эффективно использовать ресурсы кластера.
- Встроенные механизмы самовосстановления автоматически перезапускают упавшие контейнеры и перемещают рабочие нагрузки при отказе узлов.
Подготовка Docker-образа
Перед созданием Docker-образов необходимо установить Docker на рабочую машину. Метод установки варьируется в зависимости от ОС; подробные инструкции доступны на официальном сайте: https://docs.docker.com/get-docker/
И прежде чем двигаться дальше, давайте разберемся с базовыми концепциями. Они пригодятся позже.
Здесь у нас есть два центральных элемента:
- Images (образы) — неизменяемые шаблоны с кодом, зависимостями и настройками приложения.
- 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:
- Использует официальный Node.js образ с Alpine Linux
- Устанавливает рабочую директорию
/app - Копирует файлы package.json и устанавливает зависимости
- Копирует остальные файлы приложения
- Указывает, что приложение использует порт 3000
- Запускает приложение командой
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 важно понять основные объекты:
- Pod — наименьшая единица в Kubernetes, содержит один или несколько контейнеров
- Deployment — управляет набором идентичных подов, обеспечивает обновления и масштабирование
- Service — обеспечивает стабильный доступ к подам через единый IP-адрес и DNS-имя
- ConfigMap и Secret — предоставляют конфигурационные данные подам
- 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/


