kind: локальный Kubernetes в Docker
Kubernetes-кластер на ноутбуке — задача нередкая: CI/CD, эксперименты с операторами, проверка манифестов без нагрузки на prod. minikube тянет виртуалку, k3s просит отдельный host, а kind поднимает управляющую плоскость в Docker-контейнерах. Развернули, поработали, удалили — без побочных эффектов.
Зачем kind
kind создает кластер из Docker-контейнеров: control-plane и worker-ноды — это образы kindest/node. Основной use-case — локальная разработка и CI. В GitHub Actions есть официальный action create-kind, что делает пайплайны с тестами поверх K8s тривиальными.
От minikube отличается отсутствием гипервизора и нативной поддержкой multi-node топологий. От k3d — тем, что не требует Rancher и работает с CRI/containerd напрямую.
Установка
macOS, Linux и Windows (через WSL2) — бинарник из GitHub Releases.
Понадобится Docker (или Podman с kind use docker driver). Убедись, что в Docker выставлен минимум 4 GB памяти для всех контейнеров.
Первый кластер одной командой
kind создал кластер с именем kind, записал kubeconfig в ~/.kube/config. Проверяем:
Готово. Single-node кластер поднят за минуту.
Конфиг: multi-node и runtime
Для кластера с несколькими worker-нодами используется YAML-конфиг. Создадим три worker-ноды:
Флаги создания кластера:
| Флаг | Назначение | Пример |
|---|---|---|
--name | Имя кластера | kind create cluster --name prod |
--config | Путь к YAML | --config ./kind.yaml |
--image | Кастомный образ node | --image kindest/node:v1.28.0 |
--wait | Таймаут readiness | --wait 5m |
--kubeconfig | Альтернативный kubeconfig | --kubeconfig ~/.kube/dev |
Вместо флага --image можно указать node.internalImage в конфиге — полезно для air-gapped окружений.
Загрузка образов в кластер
kind использует отдельный container runtime внутри ноды. Образы из локального Docker daemon не видны. Для загрузки:
Для CI часто используют образ из tar-архива:
После загрузки образ доступен в кластере без registry.
extraMounts и kubeadm-патчи
Смонтировать директорию хоста в ноду — для локального registry или фикстур:
Настройка kubelet или kube-proxy через kubeadm-патчи:
Если порт API-сервера 6443 занят, задайте другой в конфиге кластера:
kind с kubeconfig
По умолчанию kind мержит контекст в ~/.kube/config. Для изоляции:
Управление несколькими кластерами:
Очистка
Без --name удаляется кластер по умолчанию (kind). Все ресурсы Docker удаляются вместе с нодами. Если Docker был остановлен при работающем кластере — ноды остаются в статусе NotReady при следующем запуске. Лечится пересозданием кластера.
Gotchas
containerd внутри ноды. kubectl работает с containerd напрямую. Привычные docker ps и docker exec не покажут поды — они живут внутри kind-ноды. Для отладки:
HostNetworking и PortMappings. Для доступа извне к подам нужен extraPortMappings в конфиге. Без него hostPort не работает — pod Networking в kind изолирован.
PersistentVolumes. kind создает StorageClass kind-node на основе local-path-provisioner. Данные хранятся на хосте в /var/local-path-provisioner. Для чистого окружения — просто удали кластер.
Cgroups v2. В новых дистрибутивах (Ubuntu 22.04+, Fedora) Docker может требовать настройки:
kind работает с обоими версиями, но в редких случаях с cgroups v2 на Arch Linux возникают проблемы с лимитами памяти. Решение — передать в конфиг:
Версии. kind отстает от upstream Kubernetes на 1-2 минорные версии. Актуальную матрицу совместимости смотри в README проекта перед поднятием prod-подобного окружения.
Port already allocated. kind не смог занять порт API-сервера или проброшенный hostPort. Проверьте, что 6443 свободен, или смените networking.apiServerPort. Для Ingress extraPortMappings не должны пересекаться с сервисами на хосте.
No space left on device. Docker исчерпал диск. Почистите неиспользуемые образы и пересоздайте кластер:
kind — быстрый способ поднять Kubernetes на машине разработчика или в CI без виртуализации. Основной цикл: kind create cluster, работа, kind delete cluster. Для air-gapped или многонодовых сценариев — YAML-конфиг и kind load docker-image. Ограничения известны: нет GPU, нет реального сетевого стека, производительность ниже bare metal. Для остального — сойдет.