Практический кластер: kind + Deckhouse CE

Уровень: beginner ~55 мин

Что нужно знать перед уроком

  • M0.02 — Установка инструментов — нужны установленные docker/kubectl/d8

Что нужно знать перед уроком

M0 урок 2 — установленные docker, kubectl, d8. В этом уроке мы поднимаем кластер, на котором пройдёт весь оставшийся курс.

Теория

Зачем kind, а не облачный кластер

kind (Kubernetes IN Docker) — инструмент для запуска полноценного multi-node Kubernetes-кластера внутри Docker-контейнеров на локальной машине. Для целей курса это оптимальный вариант: кластер поднимается за пару минут, полностью воспроизводим (kind delete cluster + заново создать — и вы в чистом состоянии), не требует облачного аккаунта или оплаты, и при этом это настоящий Kubernetes API — все команды kubectl/d8 k работают одинаково что здесь, что в продакшене.

Deckhouse Community Edition (CE) можно установить на любой Kubernetes, соответствующий минимальным требованиям — команда Deckhouse поддерживает официальный сценарий установки именно на kind для тестирования и обучения.

Что происходит при установке Deckhouse CE на kind

sequenceDiagram participant You as Вы (терминал) participant Docker as Docker participant Kind as kind (control-plane в контейнере) participant DH as deckhouse-controller You->>Docker: kind create cluster Docker->>Kind: поднимает control-plane + worker в контейнерах Kind-->>You: kubeconfig записан в ~/.kube/config You->>Kind: устанавливает Deckhouse CE (Helm/скрипт) Kind->>DH: deckhouse-controller запускается как Pod DH->>Kind: разворачивает базовые модули (CNI, ingress, мониторинг...) You->>Kind: kubectl get nodes / d8 k get modules

Официальный сценарий, подтверждённый документацией Deckhouse, — единый скрипт kind-d8.sh, который создаёт кластер kind с уже подготовленной конфигурацией (проброшенные порты, нужные точки монтирования для CNI) и сразу устанавливает на него Deckhouse CE:

1
bash -c "$(curl -Ls https://raw.githubusercontent.com/deckhouse/deckhouse/main/tools/kind-d8.sh)"

Скрипт интерактивно спросит несколько параметров (например, release channel Deckhouse — по умолчанию разумно взять stable) и выполнит всю последовательность из диаграммы выше автоматически. Процесс занимает несколько минут — на этом этапе Deckhouse скачивает и разворачивает свои базовые модули.

Тот же скрипт можно скачать напрямую со страницы урока — kind-d8.sh (снимок на момент написания урока, лицензия Apache-2.0) — и запустить локально:

1
chmod +x kind-d8.sh && ./kind-d8.sh

Актуальная версия всегда живёт в оригинальном репозитории Deckhouse: deckhouse/deckhouse/tools/kind-d8.sh. Если после выхода курса скрипт обновится (новая версия kind/kubectl, другой образ узла и т. п.), ориентируйтесь на версию из репозитория, а не на копию из урока.

Ресурсы вашей машины
kind + Deckhouse CE — это полноценный кластер с control-plane и системными модулями платформы. Рекомендуется не менее 4 CPU и 8 ГБ RAM, выделенных Docker Desktop (или аналогичному runtime). На слабых машинах установка будет заметно медленнее, но должна пройти успешно.

Чем этот кластер отличается от «боевого»

Дальше по курсу все команды kubectl/d8 k даются в расчёте именно на этот кластер, но важно заранее понимать отличия от продакшен/staging-кластера:

Аспектkind + Deckhouse CE (этот курс)Типичный прод/staging
Число узлов1–2 (control-plane + опционально worker), всё в Docker на одной машинедесятки узлов, реальное железо/облако
Внешний доступчерез проброс портов Docker на localhostреальный балансировщик/DNS
Хранилищелокальный StorageClass на диске Docker-хостасетевой storage (Ceph/CSI облачного провайдера)
EditionCommunity Edition — нет d8 mirror/d8 delivery-kit, ограниченный набор модулейEnterprise/Basic Edition — полный набор
HA control-planeнет (единая точка)обычно есть (несколько control-plane узлов)
Персистентность между перезапускамиконтейнеры kind эфемерны — легко пересоздать с нулякластер живёт постоянно

Linux / Сети / Docker

Как kind использует Docker

Каждый «узел» кластера kind — это отдельный Docker-контейнер, внутри которого запущен полноценный container runtime (containerd) — то есть у вас получается контейнер в контейнере (сам kind-узел — контейнер Docker, а Pod’ы внутри кластера — контейнеры containerd внутри этого узла). Это работает благодаря тому, что образ узла kind включает предустановленный containerd и все системные компоненты Kubernetes уже «зашитыми» в образ, а не устанавливаемыми поверх заново при каждом старте.

1
2
docker ps                          # увидите контейнер(ы) вида kind-control-plane
docker exec -it kind-control-plane crictl ps   # список контейнеров ВНУТРИ узла kind (уровень containerd)

Проверка сетевой доступности API-сервера

1
2
3
kubectl cluster-info
kubectl config view --minify        # проверить, что контекст переключился на kind
curl -k https://127.0.0.1:<port>/version   # порт из kubeconfig, прямой запрос к API-серверу

Практика в кластере

🧩 Практика урока: Пока без OSS-приложения — проверяем сам кластер
  1. Установите кластер (актуальный скрипт по curl или локальная копия kind-d8.sh со страницы урока):
1
bash -c "$(curl -Ls https://raw.githubusercontent.com/deckhouse/deckhouse/main/tools/kind-d8.sh)"
  1. Проверьте, что узлы кластера видны и находятся в состоянии Ready:
1
2
3
kubectl get nodes
# NAME                 STATUS   ROLES           AGE   VERSION
# kind-control-plane   Ready    control-plane   3m    v1.31.6

Точный номер версии в вашем выводе может отличаться — в отличие от «боевых» kubeadm-кластеров, где Deckhouse сам управляет версией Kubernetes через kubernetesVersion: Automatic (дефолт на момент написания урока — 1.33, платформа поддерживает диапазон вплоть до 1.35), здесь control-plane уже готов внутри образа kind, и версия Kubernetes жёстко зафиксирована переменными KIND_IMAGE/KUBECTL_VERSION прямо в kind-d8.sh (на момент написания урока — v1.31.6, что попадает в поддерживаемый платформой диапазон) — ориентируйтесь на VERSION из вашего собственного вывода и на актуальное содержимое скрипта, а не на конкретную цифру из примера.

  1. Проверьте, что Deckhouse установлен и его модули включаются:
1
2
3
4
5
d8 k get modules
# NAME              WEIGHT   STATE     SOURCE   PHASE   ENABLED
# deckhouse         900      Enabled            Ready   true
# ingress-nginx     402      Enabled            Ready   true
# ...
  1. Посмотрите общий статус платформы:
1
d8 status
  1. Проверьте статусную модель одного модуля через conditions (пригодится для troubleshooting в M2 уроке 3 и M10 уроке 10):
1
2
d8 k get module deckhouse -o yaml
# смотрим status.conditions и status.phase
  1. Создайте тестовый namespace для будущей практики (в M1 мы будем создавать по одному namespace на урок, чтобы не смешивать примеры):
1
2
kubectl create namespace course-m1-lesson01
kubectl get ns

Практика разработки

В этом уроке сборки/деплоя ещё нет — она появится в M3. Но полезно уже сейчас убедиться, что werf/docker могут достучаться до вашего локального container runtime:

1
2
docker run --rm hello-world
werf version

Шпаргалка команд урока

1
2
3
4
5
6
7
8
bash -c "$(curl -Ls https://raw.githubusercontent.com/deckhouse/deckhouse/main/tools/kind-d8.sh)"
kubectl get nodes
kubectl cluster-info
d8 k get modules
d8 status
d8 k get module <name> -o yaml
kubectl create namespace <name>
kind delete cluster                 # полный снос кластера, если нужно начать с чистого листа

Вопросы для самопроверки

Что представляет собой один «узел» кластера kind технически?

kind поднимает control-plane и worker-узлы как Docker-контейнеры, внутри каждого работает containerd — получается «контейнер в контейнере».

Источник: kind — документация

Какая команда покажет установленные модули Deckhouse и их состояние?

d8 k get modules — прямой аналог kubectl get с CRD модулей платформы Deckhouse, показывает WEIGHT/STATE/PHASE/ENABLED.

Источник: Рекомендуемая литература

Чем принципиально ограничена Community Edition Deckhouse на этом практическом кластере?

d8 mirror (офлайн-копирование) и d8 delivery-kit (build/publish/plan/deploy) — функции старших редакций, недоступные в CE/BE.

Источник: Deckhouse — Deckhouse-cli

Что произойдёт, если выполнить kind delete cluster?

kind delete cluster уничтожает все контейнеры узлов кластера — это эфемерная среда, полностью пересоздаваемая с нуля.

Источник: kind — документация

Рекомендуемая литература

Официальная документация

Статьи и блоги

Книги

  • Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.

Связанные материалы