Поднимаем локальный кластер: minikube и kind

Рейтинг: 60.1% · 14 голосов
Kubernetes для разработчиков: поды, деплойменты, сервисы, ingress, конфиги и отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
anton_k8s
Сообщения: 26
Зарегистрирован: 12 май 2026, 03:23

Поднимаем локальный кластер: minikube и kind

Сообщение anton_k8s »

АкадемияKubernetes на практикеГлава 2 из 19
Оглавление курса (19)
  1. Зачем нужен Kubernetes и из чего состоит кластер
  2. Поднимаем локальный кластер: minikube и kind (вы здесь)
  3. Поды: базовая единица запуска
  4. Deployment и ReplicaSet: управляем репликами
  5. Service: сетевой доступ к подам
  6. ConfigMap и Secret: выносим конфигурацию
  7. Ingress: пускаем трафик снаружи
  8. Хранилище: Volumes и PersistentVolumeClaim
  9. Namespaces, requests и limits
  10. Health checks: liveness и readiness пробы
  11. Отладка: почему под не стартует
  12. Helm: пакетный менеджер для Kubernetes
  13. Базовая безопасность: RBAC и доступы
  14. Job и CronJob: разовые и периодические задачи
  15. StatefulSet и DaemonSet: stateful-нагрузки и системные агенты
  16. Стратегии обновления и планирование: rollout и rollback, graceful shutdown, nodeSelector, affinity, taints
  17. Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler
  18. Наблюдаемость: логи, метрики, events, обзор Prometheus и Grafana
  19. Безопасность глубже: securityContext, Pod Security Standards, NetworkPolicy, шифрование секретов
В первой главе мы разобрали, из чего состоит кластер: control plane, ноды, kubelet. Теперь нужен живой кластер под рукой, на котором будут работать все примеры курса. Поднимем его двумя способами и выберем подходящий.

Что выбрать:

Для локальной разработки есть два проверенных инструмента. Minikube создает кластер в контейнере или виртуалке и тащит с собой удобную обвязку: аддоны, дашборд, проброс портов одной командой. Kind (Kubernetes in Docker) запускает каждую ноду кластера как обычный Docker-контейнер. Он легче, стартует за секунды и отлично подходит для CI, где кластер создается и убивается на каждый прогон тестов.

Новичку проще с minikube, его и возьмем за основу в курсе. Kind пригодится, когда нужны быстрые пересоздания, тот же CI. Мультинодовый кластер, кстати, умеют оба: у kind это конфиг-файл, у minikube флаг --nodes, покажу ниже. Оба инструмента спокойно живут на одной машине параллельно.

Из требований: установленный и запущенный Docker, минимум 2 CPU и 4 ГБ свободной памяти. Комфортная планка 4 CPU и 8 ГБ, тогда останется запас под сами приложения.

Запускаем minikube:

Код: Выделить всё

# macOS: brew install minikube
# Linux:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

minikube start --driver=docker --cpus=4 --memory=8192
kubectl get nodes

minikube status      # жив ли кластер
minikube dashboard   # веб-интерфейс в браузере
minikube stop        # выключить, состояние сохранится
minikube delete      # снести кластер целиком
Нюанс для macOS и Windows: с docker-драйвером значение --memory не может превышать то, что выделено самому Docker Desktop. Если start жалуется на нехватку памяти при свободных гигабайтах в системе, поднимите лимит в настройках Docker Desktop (Settings, Resources) и перезапустите его.

Первый запуск скачает базовый образ ноды, это около гигабайта, наберитесь терпения. Дальше старт занимает меньше минуты. Команда kubectl get nodes должна показать одну ноду в статусе Ready. Если kubectl еще не установлен, временно выручит встроенный вызов minikube kubectl -- get nodes (обратите внимание на разделитель --, без него minikube попытается разобрать флаги сам и вы получите ошибку). Но лучше поставить бинарник отдельно, он понадобится на каждом шагу:

Код: Выделить всё

# macOS: brew install kubectl
# Linux:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
kubectl version --client
Аддоны включаются командой minikube addons enable, например аддон ingress нам понадобится в седьмой главе.

Запускаем kind:

Код: Выделить всё

# macOS: brew install kind
# Linux, готовый бинарник со страницы релизов:
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.30.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

kind create cluster --name dev
kubectl cluster-info --context kind-dev
kind delete cluster --name dev   # снести кластер, симметрично minikube delete
Свежий номер версии смотрите на github.com/kubernetes-sigs/kind/releases, на момент написания актуальна ветка v0.30 и новее. Вариант go install sigs.k8s.io/kind@v0.30.0 тоже рабочий, но требует установленного Go, для большинства проще взять готовый бинарник.

Кластер готов секунд за двадцать. Многонодовая конфигурация описывается отдельным файлом:

Код: Выделить всё

# kind-multi.yaml
# создание: kind create cluster --name dev --config kind-multi.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
Три ноды, как у взрослых, и все это обычные контейнеры, видимые через docker ps. У minikube то же самое делается одним флагом: minikube start --nodes=3. Учтите, что --cpus и --memory задаются на каждую ноду, на ноутбуке с тремя нодами аппетиты лучше урезать.

Локальные Docker-образы ни один из кластеров не видит автоматически: у нод свой внутренний рантайм, ему ваш хостовый Docker не указ. Собрали свой образ, загрузите его внутрь кластера явно:

Код: Выделить всё

docker build -t myapp:dev .

kind load docker-image myapp:dev --name dev   # для kind
minikube image load myapp:dev                 # для minikube
У minikube есть и второй путь: eval $(minikube docker-env) переключает docker CLI на демон внутри ноды, и docker build собирает образ сразу там, без шага с загрузкой.

Типичные грабли:

Docker не запущен. Обе утилиты при старте честно ругаются, но текст ошибки длинный, и суть в нем теряется. Проверяйте docker ps перед стартом кластера.

Не хватает памяти. Поды повисают в Pending, а kubectl describe pod показывает Insufficient memory. Лечится пересозданием: minikube delete, затем minikube start с большим значением memory.

Перепутанные контексты. Когда подняты и minikube, и kind, kubectl смотрит в тот кластер, который стартовал последним. Смотрите kubectl config get-contexts и переключайтесь через kubectl config use-context minikube. Половина загадочных "у меня под пропал" объясняется именно этим.

Docker Hub отдает 403 или тянет образы еле-еле. Знакомая история для РФ. Тут важно понимать, кто что качает. Зеркало в /etc/docker/daemon.json (секция registry-mirrors) настраивает только хостовый демон, то есть помогает скачать образ самой ноды (kicbase у minikube, kindest/node у kind) и собрать образ через docker build. А вот образы подов тянет рантайм внутри нод, и хостовая настройка туда не доезжает. Для minikube зеркало передается флагом при старте: minikube start --registry-mirror=https://адрес-зеркала. Для kind зеркала настраиваются через containerdConfigPatches в конфиге кластера плюс файлы hosts.toml внутри нод, готовый рецепт есть в документации kind на странице Local Registry (kind.sigs.k8s.io/docs/user/local-registry/). Есть и путь попроще: скачать нужный образ хостовым докером (он ваше зеркало уже использует) и закинуть в кластер через kind load docker-image или minikube image load.

Образ загружен в kind, а под все равно падает с ErrImagePull. Проверьте imagePullPolicy: с тегом latest политика по умолчанию Always, и кластер лезет в реестр вместо локального образа. Используйте осмысленные теги вроде myapp:dev или ставьте imagePullPolicy: IfNotPresent.

Что усвоили:

У вас есть локальный кластер, вы умеете его поднимать, останавливать и сносить, а заодно переключаться между несколькими кластерами через контексты. В следующей главе запустим в нем первые поды и разберем, как Kubernetes описывает контейнеры в манифестах.
👍3 ❤️4 🔥3 😄 🤔2
✔ Лучший ответ сформирован автоматически — deeptoaster
выше про minikube спрашивали. там то же самое, докер на хосте и докер внутри ноды разные. либо minikube image load myapp:dev, либо eval $(minikube docker-env) и собирать образ сразу внутри кластера. второй вариант удобнее при частых пересборках, только не забудьте потом открыть новый терминал, а то будете удивляться куда делись ваши обычные образы
Перейти к ответу →
Аватара пользователя
Newk1313
Сообщения: 1
Зарегистрирован: 13 май 2026, 04:37

Re: Поднимаем локальный кластер: minikube и kind

Сообщение Newk1313 »

anton_k8s писал(а):он не видит локальные Docker-образы автоматически
а minikube видит? собрал образ, задеплоил, под в ImagePullBackOff, хотя docker images его показывает. это та же проблема или я что-то другое сломал?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
deeptoaster
Сообщения: 2
Зарегистрирован: 15 май 2026, 05:13

Re: Поднимаем локальный кластер: minikube и kind

Сообщение deeptoaster »

✔ Лучший ответ — сформирован автоматически
выше про minikube спрашивали. там то же самое, докер на хосте и докер внутри ноды разные. либо minikube image load myapp:dev, либо eval $(minikube docker-env) и собирать образ сразу внутри кластера. второй вариант удобнее при частых пересборках, только не забудьте потом открыть новый терминал, а то будете удивляться куда делись ваши обычные образы
👍1 ❤️ 🔥1 😄 🤔1
Аватара пользователя
snell99
Сообщения: 2
Зарегистрирован: 11 май 2026, 02:58

Re: Поднимаем локальный кластер: minikube и kind

Сообщение snell99 »

кому на винде: minikube через WSL2 у меня отъедал почти всю память, винда вставала колом. лечится файлом .wslconfig в домашней папке с memory=8GB и wsl --shutdown после. в уроке про это нет, но грабли того же сорта
👍2 ❤️1 🔥 😄 🤔1
Аватара пользователя
nixos1
Сообщения: 4
Зарегистрирован: 11 май 2026, 01:02

Re: Поднимаем локальный кластер: minikube и kind

Сообщение nixos1 »

спасибо за пункт про registry-mirrors. убил вечер на ErrImagePull, грешил на кластер, пересоздавал его раза три. а это просто докерхаб не отдавал образы. прописал зеркало и все поехало
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Зачем нужен Kubernetes и из чего состоит кластер
Следующая глава →
Поды: базовая единица запуска

Все главы курса «Kubernetes на практике»

Поделиться темой: ✈ Telegram VK

Вернуться в «Kubernetes на практике»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость