← Kubernetes локально
9 мин · просто · Урок 5 из 8

minikube: драйверы, порты и аддоны

Чем minikube отличается от kind и k3d, какую версию Kubernetes он даёт на самом деле и почему порты тут отдельная тема.

minikube - старейший из живых инструментов для локального Kubernetes, и устроен он иначе, чем kind или k3d. Те умеют ровно одно: запускать ноды как контейнеры. minikube выбирает, где поднять ноду, из целого списка вариантов. Контейнер Docker, виртуальная машина KVM, виртуальная машина через нативный гипервизор macOS или Windows.

Это выбирается флагом --driver. Дальше по тексту такие варианты называются драйверами.

Виртуальная машина стоит дороже по ресурсам, зато даёт настоящее ядро и настоящую изоляцию от хоста. Контейнерная нода запускается быстрее, но делит ядро с хостом со всеми вытекающими ограничениями. В официальном бенчмарке time-to-k8s (v1.36.0, linux/amd64) minikube поднимается за 50,8 секунды против 33,0 у kind и 19,9 у k3d.

Версия и ловушка с документацией

Актуальный релиз - v1.38.1 от 19 февраля 2026. Релизов с тех пор не было, но коммиты в репозиторий идут: последний датирован 31 августа 2026.

Дальше внимательно. Сайт документации minikube собирается из ветки master и пишет, что версия Kubernetes по умолчанию - v1.37.0. В релизном бинаре v1.38.1 по умолчанию поднимается v1.35.1. Поддерживаемый диапазон в этом бинаре - от v1.28.0 до v1.35.1.

Расхождение появилось потому, что дефолт в master уже подняли, а релиза с этим изменением ещё не выпустили. Документация опережает то, что реально скачивается.

Проверить, что получилось у себя, проще всего по самому кластеру:

minikube start
minikube kubectl -- get nodes

В колонке VERSION будет версия, с которой запустился kubelet. На неё и ориентируются, а не на цифру с сайта.

Драйверы

Фактический дефолт на всех системах - docker. Если Docker установлен, minikube возьмёт его.

Когда Docker ставить не хочется, есть варианты с виртуальной машиной:

Два ограничения стоит знать заранее. Драйвер hyperkit объявлен устаревшим и отключён в brew с 21 июня 2025, полагаться на него больше нельзя. VirtualBox не поддерживается на darwin/arm64, то есть на Apple Silicon его нет.

Отдельно про Windows: связка WSL2 с драйвером docker помечена в проекте как экспериментальная.

Минимум для запуска - 2 CPU, 2 GB свободной памяти, 20 GB диска. Память кластеру minikube выделяет сам: примерно 25% от памяти хоста, зажатые в границы 3072-6144 MB. При --nodes N этот объём делится между нодами.

Флаг --memory может молча ничего не сделать. Если на хосте нет нужных cgroup-контроллеров, ошибки не будет: лимит просто не применится, а кластер возьмёт столько памяти, сколько сможет.

Установка

brew install minikube
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
winget install Kubernetes.minikube

На Apple Silicon нужен именно arm64-бинарь, minikube-darwin-arm64. Причина конкретная: amd64-бинарь запустится под Rosetta и будет работать, но драйвер docker при этом уходит в состояние Unhealthy. Homebrew подбирает правильную сборку сам, вручную скачанный файл - нет.

Запуск и жизненный цикл

minikube start
minikube start --kubernetes-version=v1.34.0 --driver=docker
minikube start --nodes 2 -p multinode-demo
minikube stop; minikube delete

Флаг -p задаёт имя профиля. Профиль - это отдельный кластер со своим состоянием, их может быть несколько параллельно.

Отдельный kubectl ставить не обязательно, minikube носит свой:

minikube kubectl -- get po -A

Двойной дефис отделяет аргументы minikube от аргументов kubectl. Всё, что после него, уходит внутрь как есть.

Порты

виртуальная машина Docker твой Mac curl 192.168.49.2 нода minikube 192.168.49.2 Pod web · 8080 curl висит minikube service --url
IP ноды остаётся за границей виртуальной машины. Наружу выходит только проброс.

Это самый нагруженный раздел, и разбираться в нём приходится сразу.

С драйвером docker нода живёт внутри контейнера. На Linux сеть Docker доступна с хоста напрямую, и IP ноды пингуется. На macOS, Windows и в WSL2 Docker работает поверх виртуальной машины, поэтому IP ноды с хоста недостижим. Команда minikube ip выдаёт адрес, curl по нему висит, и причина не в кластере.

Для Service типа NodePort есть готовый обход:

minikube service web --url

Команда печатает адрес вида http://127.0.0.1:<порт> и держит проброс, пока процесс запущен. Закрыли терминал - проброс исчез.

Для Service типа LoadBalancer нужен туннель:

minikube tunnel
minikube tunnel --cleanup

Без него EXTERNAL-IP так и останется в <pending>. Туннель настраивает маршрутизацию на хосте, поэтому запрашивает права root. На Windows порты ниже 1024 тоже требуют повышенных прав. На macOS у туннеля с драйвером docker есть ограничение: он не резолвит Kubernetes DNS.

Третий вариант - зафиксировать проброс при создании кластера:

minikube start --driver=docker --ports=127.0.0.1:8080:30080

Это ближе всего к тому, как порты открывают в kind. Работает без дополнительных процессов, но задаётся один раз при старте.

СпособДля какого ServiceСколько живётПрава root
minikube service web --urlNodePortпока запущен процесснет
minikube tunnelLoadBalancerпока запущен процессда
--ports=127.0.0.1:8080:30080NodePortвсё время жизни кластеранет

Аддоны

Дополнительные компоненты в minikube включаются одной командой.

minikube addons enable ingress
minikube addons enable metrics-server

С ingress есть неприятная деталь, о которой лучше знать до того, как привыкнешь к команде. Аддон ставит ingress-nginx версии 1.14.3. Репозиторий kubernetes/ingress-nginx архивирован 24 марта 2026 и переведён в read-only: релизов, багфиксов и патчей безопасности больше не будет. Даже последняя выпущенная версия 1.15.1 в аддон не попала. Issue об этом (kubernetes/minikube#22030) открыт с 3 декабря 2025, решения нет.

Для локального обучения это терпимо: кластер стоит на ноутбуке и наружу не смотрит. Переносить такую же схему куда-то дальше не стоит, официальная рекомендация Kubernetes - выбирать реализацию Gateway API.

Документация аддона пишет «Linux only», но код v1.38.1 новее документации: на macOS и Windows аддон включается и советует запустить minikube tunnel.

С metrics-server проще. В kind его после установки приходится патчить флагом для работы с самоподписанным сертификатом kubelet, а в minikube аддон собран с нужными флагами сразу. Заработает kubectl top, ничего править не надо.

Хранилище

StorageClass называется standard и помечен дефолтным. Провижнер - k8s.io/minikube-hostpath, это не CSI-драйвер, а собственная реализация minikube.

Два ограничения:

В multi-node кластере host-path провижнер не работает. Том создаётся на одной ноде, а под может уехать на другую. Для нескольких нод нужен отдельный аддон CSI Hostpath Driver.

Перезагрузку кластера переживают только данные в каталогах /data, /var/lib/minikube, /var/lib/docker и /tmp/hostpath_pv. Всё, что записано мимо них, исчезнет.

Что обычно ломается

Rosetta на Apple Silicon. В версии v1.38.0 была регрессия: эмуляция x86_64 ломалась с ошибкой exec format error. В v1.38.1 есть изменение «mask systemd-binfmt», которое похоже на исправление, но прямая связь этого изменения с issue не подтверждена. Если запускаете x86-образы на Apple Silicon, версию v1.38.0 стоит обойти стороной.

IPv6. Не поддерживается. Сценарии с dual-stack на minikube не разобрать.

Коротко

Прошли материал до конца? Отметьте урок пройденным.