Мой домашний Kubernetes: как превратить обычный ПК в DevOps‑песочницу
Почему это полезно
Освоение Kubernetes и контейнеров сегодня — базовая компетенция для инженеров любой специализации: разработчиков, тестировщиков, админов, аналитиков. Лучший способ понять «кубер» — развернуть небольшой, но полноценный стенд у себя дома и пощупать все руками: сборку, деплой, мониторинг, маршрутизацию, секреты, хранилища и CI.
Базовая идея
Мы возьмём обычный домашний компьютер на Windows 10 или новее, включим подсистему WSL 2, установим Linux‑окружение, докер и minikube, а затем поднимем в кластере простое веб‑приложение со сборкой и доставкой. Это даст реальное понимание, как устроен современный стек — от кода до работающего сервиса.
Железо и ОС
Подойдёт практически любой ноутбук/ПК последних лет. Пример: Lenovo G510 2013 года, процессор поколения Haswell, 12 ГБ ОЗУ, Windows 10. Даже такая конфигурация достаточно комфортно тянет однонодовый кластер minikube и несколько сервисов.
Включаем WSL 2
- Включите компоненты Windows: «Панель управления» → «Программы и компоненты» → «Включение или отключение компонентов Windows». Активируйте пункт «Подсистема Linux для Windows».
- Выполните в PowerShell от имени администратора:
- wsl --install
- wsl --set-default-version 2
- Установите дистрибутив Ubuntu (его обычно предлагает мастер установки WSL). После установки перезагрузите ПК при необходимости.
Рабочее окружение разработчика
Удобно работать в IDE, которая дружит с WSL. В Visual Studio Code можно открыть терминал, выбрать bash внутри WSL и полностью жить в Linux‑среде, не покидая Windows. Так проще управлять зависимостями и проектами.
Важное замечание о правах
Для некоторых операций (например, minikube tunnel) нужны привилегии суперпользователя. В учебной песочнице допустимо работать под root, но безопаснее — под обычным пользователем, используя sudo только там, где это действительно требуется.
Набор инструментов
Внутри WSL (Ubuntu) установим базовый стек:
- JDK 17 (для Java‑бэкенда): apt install -y openjdk-17-jdk
- Docker и утилиты: apt install -y docker.io
- Kubernetes‑клиент: apt install -y kubectl
- Minikube: apt install -y minikube
- Node.js и npm (для фронтенда): apt install -y nodejs npm
- Дополнительно: git, make, jq (по желанию): apt install -y git make jq
Запускаем Docker в WSL:
- systemctl enable --now docker
- usermod -aG docker $USER
- newgrp docker
Теперь можно запускать контейнеры без sudo.
Стартуем кластер Kubernetes
- minikube start --driver=docker
- Проверяем: kubectl get nodes, kubectl get pods -A
- Полезные аддоны:
- minikube addons enable dashboard
- minikube addons enable metrics-server
- minikube addons enable ingress
- при необходимости: minikube addons enable registry
Открываем панель Dashboard:
- minikube dashboard
Команда откроет веб‑интерфейс в браузере и поможет наглядно наблюдать ресурсы кластера.
Как гонять трафик в кластер и обратно
Есть несколько вариантов:
- Временный форвардинг портов:
- kubectl port-forward svc/my-backend 8080:80
- Используйте для отладки сервисов, без изменения их типов.
- Сервис типа NodePort:
- Доступ по порту из диапазона 30000–32767 на ip minikube.
- Узнать адрес: minikube ip
- Сервис типа LoadBalancer в minikube:
- Требуется туннель: sudo minikube tunnel
- После запуска tunnel Kubernetes назначит внешний адрес локально, можно обращаться как к облачному LoadBalancer.
- Встроенная подсказка minikube:
- minikube service my-service --url
- Команда покажет прямой URL для доступа к сервису.
Архитектура учебного приложения
- Бэкенд: простое REST‑приложение на Java (например, Spring Boot), отдаёт JSON по /api, пишет логи в stdout.
- Фронтенд: одностраничное приложение (React/Vue/Angular), собираем статические файлы и отдаём через Nginx.
- База данных: для простоты можно стартовать PostgreSQL в контейнере с локальным PV.
- Коммуникации: фронтенд ходит на бэкенд через Ingress по доменным путям, например /api и /.
Контейнеризация
- Бэкенд Dockerfile (многослойная сборка):
- Этап build: образ с JDK, сборка jar.
- Этап runtime: образ с JRE, копируем jar и запускаем.
- Фронтенд Dockerfile:
- Этап build: node с npm ci && npm run build.
- Этап runtime: nginx, копируем сборку в /usr/share/nginx/html, настраиваем конфиг под SPA и проксирование /api.
Собираем образы «внутри» minikube
Чтобы не настраивать реестр, можно строить образы прямо в среде Docker, которую использует minikube:
- eval $(minikube docker-env)
- docker build -t demo-backend:dev backend/
- docker build -t demo-frontend:dev frontend/
Теперь при указании этих тегов в манифестах Kubernetes не нужно ничего пушить во внешний реестр.
Манифесты Kubernetes (ключевые объекты)
- Namespace: выделите отдельное пространство, например sandbox.
- ConfigMap: конфиги приложения (адрес БД, флаги).
- Secret: пароли/ключи (например, пароль к PostgreSQL).
- Deployment: для backend и frontend, по 1–2 реплики.
- Service: ClusterIP для внутрекластерного обращения.
- Ingress: маршрутизация HTTP. Включите addon ingress и создайте правила для / и /api.
- PersistentVolumeClaim: для БД и других стораджей; в minikube можно использовать стандартный storage‑provisioner.
Применение ресурсов:
- kubectl apply -n sandbox -f k8s/
Подключение БД
- Запускаем PostgreSQL как StatefulSet с PVC на 1–5 ГБ.
- Создаём Secret с логином/паролем.
- В backend прокидываем переменные окружения из Secret/ConfigMap (например, DATABASE_URL, USER, PASSWORD).
- Проверяем готовность Readiness/Liveness‑пробами.
Доступ из Windows
Варианты:
- Через minikube service --url: удобно мгновенно открыть сервис в браузере Windows.
- Через minikube ip и NodePort.
- Через sudo minikube tunnel и тип Service: LoadBalancer — самый «похожий на прод» сценарий.
Если работаете в WSL, следите, чтобы фаервол Windows не блокировал соответствующие порты.
Мониторинг и диагностика
- Dashboard: быстрый обзор подов, логов, событий.
- kubectl top pods / top nodes: метрики (нужен metrics‑server).
- kubectl logs -f deployment/demo-backend: чтение логов в реальном времени.
- kubectl describe pod/…: подробная диагностика ивентов и причин рестартов.
- Начните добавлять ресурсы/лимиты в Deployment, чтобы наблюдать поведение планировщика.
CI на коленке: Jenkins в контейнере
Чтобы не возиться с пакетами, запустим Jenkins в Docker:
- docker run -d --name jenkins -p 8081:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home --restart=unless-stopped jenkins/jenkins:lts
Дальше:
- Ставим нужные плагины (pipeline, docker, kubernetes-cli).
- В пайплайне:
- git checkout
- сборка backend и frontend
- docker build для обоих образов (при активном minikube docker-env)
- kubectl apply -f k8s/ (деплой в sandbox)
Так вы получите полноценный цикл: коммит → сборка → контейнер → деплой в кластер.
Ingress как «входная дверь»
- minikube addons enable ingress включает контроллер NGINX.
- Создайте Ingress с двумя правилами:
- / → demo-frontend:80
- /api → demo-backend:80
- Пропишите hosts в /etc/hosts WSL/Windows, если хотите использовать доменное имя, например myapp.local, указывая на minikube ip.
Работа с секретами
- kubectl create secret generic db-secret --from-literal=POSTGRES_PASSWORD=…
- В манифестах подов подключайте секреты как envFrom или конкретные переменные.
- Не храните пароли в открытом виде в репозитории: секреты отдельно, конфиги отдельно.
Персистентность данных
- Для локальной песочницы удобно использовать стандартный provisioner minikube — он динамически выделяет PVC.
- Для БД укажите StorageClass по умолчанию и размер, например 2Gi.
- Регулярно проверяйте состояние pvc/pv: kubectl get pvc,pv -n sandbox
Типичные проблемы и их решения
- Виртуализация отключена в BIOS/UEFI: включите Intel VT‑x/AMD‑V.
- Docker не стартует в WSL: проверьте systemctl status docker, права пользователя и наличие группы docker.
- minikube start падает: проверьте драйвер --driver=docker и свободное место на диске.
- Нет доступа к сервису: проверьте тип Service, работает ли tunnel, корректные порты и правила Ingress.
- Нехватка памяти: уменьшите количество реплик и лимиты ресурсов, остановите тяжелые приложения на хосте.
Практический маршрут для первых 2–3 часов
1) Поднимите WSL 2 и Ubuntu, установите docker, kubectl, minikube.
2) Запустите minikube и dashboard, включите ingress.
3) Соберите «Hello, world» backend и frontend, заверните в контейнеры, используйте minikube docker-env.
4) Примените Deployment/Service/Ingress, откройте приложение через minikube service --url или через tunnel.
5) Добавьте PVC к БД, прокиньте Secret, убедитесь, что данные переживают перезапуск подов.
6) Запустите Jenkins в контейнере и соберите первый Pipeline.
Что дальше развивать
- Автоматизируйте всё через Helm‑чарты.
- Поднимите локальный реестр образов (можно использовать аддон registry) и настройте push/pull.
- Попробуйте сервис‑мэш (например, Istio) и трассировку (Jaeger/Zipkin).
- Добавьте Prometheus и Grafana для метрик приложений.
- Экспериментируйте с HPA/ВPA для автоскейлинга по метрикам.
Итог
Даже старенький домашний ПК на Windows можно превратить в полноценный плацдарм для изучения Kubernetes и DevOps‑практик. Пара часов — и у вас запущен кластер, контейнеры с бэкендом и фронтендом, маршрутизация через Ingress, хранение данных на PVC и сборочный конвейер. С такой базой гораздо проще двигаться к более сложным сценариям и продвинутым инструментам — от GitOps до облачных кластеров. Главное — начать и не бояться экспериментировать.



