Антон Ларичев

Введение
Kubernetes давно перестал быть инструментом только для DevOps-инженеров. Сегодня разработчики всё чаще сталкиваются с необходимостью самостоятельно деплоить свои приложения в кластер. Это пугает: тонны YAML-файлов, незнакомые термины — Pod, Deployment, Service, Ingress. Но на практике базовый деплой приложения требует знания всего нескольких концепций.
В этой статье мы разберём минимальный набор знаний для деплоя реального приложения в Kubernetes. Никакой теории ради теории — только то, что нужно прямо сейчас.
Что нужно подготовить
Перед началом убедитесь, что у вас есть:
- Установленный
kubectl— CLI для работы с кластером - Доступ к кластеру (локальный
minikubeили удалённый) - Docker-образ вашего приложения, опубликованный в реестре (Docker Hub, GitHub Container Registry и т.д.)
Проверить подключение к кластеру можно командой:
kubectl cluster-info
Если хотите попрактиковаться локально — установите minikube:
# Запуск локального кластера
minikube start
Ключевые концепции за 5 минут
Вам достаточно понять три сущности:
Pod — минимальная единица запуска в Kubernetes. Содержит один или несколько контейнеров. Pods смертны: упал — Kubernetes создаст новый.
Deployment — управляет набором одинаковых Pods. Следит, чтобы нужное количество реплик всегда было запущено. Именно с Deployment вы будете работать чаще всего.
Service — стабильная точка доступа к вашим Pods. Даже если Pods пересоздаются и меняют IP-адреса, Service остаётся на месте.
Пишем манифест Deployment
Создайте файл deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app # имя деплоймента
labels:
app: my-app
spec:
replicas: 2 # количество копий приложения
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app # метка, по которой Service найдёт наши поды
spec:
containers:
- name: my-app
image: yourname/my-app:latest # ваш образ из реестра
ports:
- containerPort: 3000 # порт, который слушает приложение
env:
- name: NODE_ENV
value: production # переменная окружения
resources:
requests:
memory: "64Mi" # минимум памяти для запуска
cpu: "100m" # 0.1 ядра процессора
limits:
memory: "256Mi" # максимум памяти
cpu: "500m" # максимум 0.5 ядра
Применяем манифест:
kubectl apply -f deployment.yaml
Проверяем, что Pods запустились:
kubectl get pods
Открываем доступ к приложению через Service
Создайте файл service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app # ищем поды с этой меткой
ports:
- protocol: TCP
port: 80 # порт Service снаружи
targetPort: 3000 # порт внутри контейнера
type: ClusterIP # доступен только внутри кластера
kubectl apply -f service.yaml
Для локальной проверки используйте port-forward:
# Пробрасываем порт 8080 с вашей машины на порт 80 Service
kubectl port-forward service/my-app-service 8080:80
Теперь приложение доступно на http://localhost:8080.
Хранение секретов: ConfigMap и Secret
Никогда не храните пароли и токены прямо в манифестах. Используйте Secret:
# Создаём секрет с паролем к базе данных
kubectl create secret generic db-credentials \
--from-literal=password=supersecret \
--from-literal=username=admin
Подключаем секрет в Deployment:
# Добавьте в блок containers -> env
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials # имя секрета
key: password # ключ внутри секрета
Для нечувствительных настроек используйте ConfigMap:
kubectl create configmap app-config \
--from-literal=LOG_LEVEL=debug \
--from-literal=API_URL=https://api.example.com
Обновление приложения
Чтобы задеплоить новую версию, обновите тег образа в манифесте и примените его заново:
# Быстрое обновление образа без редактирования файла
kubectl set image deployment/my-app my-app=yourname/my-app:v2
Kubernetes выполнит rolling update — постепенно заменит старые Pods новыми без простоя.
Посмотреть статус обновления:
kubectl rollout status deployment/my-app
Если что-то пошло не так — откат на предыдущую версию:
kubectl rollout undo deployment/my-app
Полезные команды для отладки
# Посмотреть логи пода
kubectl logs <имя-пода>
# Логи в реальном времени
kubectl logs -f <имя-пода>
# Описание пода с событиями (помогает найти причину ошибок)
kubectl describe pod <имя-пода>
# Зайти внутрь контейнера
kubectl exec -it <имя-пода> -- /bin/sh
# Посмотреть все ресурсы в неймспейсе
kubectl get all
Частые ошибки
ImagePullBackOff — Kubernetes не может скачать образ. Проверьте правильность имени образа и тега. Если реестр приватный — нужно создать Secret с учётными данными реестра.
CrashLoopBackOff — контейнер запускается и сразу падает. Смотрите логи командой kubectl logs <pod>. Чаще всего причина — ошибка в приложении или неверные переменные окружения.
Pending Pod — Pod создан, но не запускается. Обычно это означает нехватку ресурсов в кластере. Выполните kubectl describe pod <имя> и смотрите секцию Events.
Неверные лейблы в selector — если лейбл в selector.matchLabels не совпадает с лейблом в template.metadata.labels, Deployment не найдёт свои Pods. Это частая опечатка у новичков.
Отсутствие limits — запуск без ограничений ресурсов может привести к тому, что одно приложение «съест» все ресурсы узла. Всегда указывайте requests и limits.
Заключение
Вы только что прошли весь путь от нуля до работающего приложения в Kubernetes: написали Deployment, создали Service, научились хранить секреты и обновлять приложение без даунтайма. Этого достаточно для большинства рабочих задач разработчика.
Дальнейшие шаги: изучите Ingress для внешнего доступа к приложению по доменному имени, разберитесь с Namespace для изоляции окружений, и посмотрите на Helm — менеджер пакетов для Kubernetes, который упростит управление манифестами.
Kubernetes не такой страшный, как кажется. Начните с малого — задеплойте своё приложение сегодня.






Комментарии
0