khook: декларативный bootstrap Kubernetes без скриптов

Проблема, которую решает khook

Terraform (или eksctl, или CAPI) передаёт вам готовый кластер. ArgoCD берёт управление на себя, как только установлен. Между этими двумя моментами живёт всеми нелюбимый артефакт: скрипт начальной инициализации (bootstrap script) — несколько сотен строк kubectl apply, helm upgrade --install, sleep 30 и циклов повторных попыток, склеенных в null_resource и вызывающих ужас у дежурных инженеров.

khook заменяет этот промежуток декларативной спецификацией:

apiVersion: khook.io/v1
kind: Khook
metadata:
  name: bootstrap
steps:
  - name: cilium
    helm:
      chart: cilium
      repo: https://helm.cilium.io/
      version: 1.18.4
      namespace: kube-system
      atomic: true
  - name: all-ready
    needs: [cilium]
    wait:
      for: condition=Ready
      on: pods
      allNamespaces: true
$ khook apply -f bootstrap.yaml
✓ cilium (helm)  21.457s
✓ all-ready (wait)  4.203s
  • Один бинарный файл, никаких зависимостей. SDK Kubernetes и Helm встроены внутрь; khook никогда не запускает внешних процессов. На раннере нужно установить только сам khook.

  • Граф зависимостей (DAG), а не скрипт. Шаги объявляют needs:; khook топологически сортирует их и выполняет каждый уровень параллельно. Циклические зависимости обнаруживаются до того, как что-либо затронет кластер.

  • Идемпотентность по умолчанию. Повторный запуск спецификации всегда безопасен — история релизов Helm определяет, нужно ли устанавливать или обновлять; apply сводит существующие ресурсы к нужному состоянию; delete считает «уже удалено» успехом. Запускайте на каждый terraform apply.

  • Чёткие и точные сообщения об ошибках. Таймауты и повторные попытки на уровне каждого шага, параметр onError: fail | continue, итоговая таблица с точным указанием того, что успешно выполнилось, завершилось ошибкой или было пропущено, — а также отдельные коды выхода для ошибок валидации и выполнения.

  • Инициализация, а затем — передача управления. khook устанавливает CNI, инструменты для управления секретами и GitOps-контроллер — после чего уходит в сторону. Он намеренно не является GitOps-движком.

Семь видов шагов охватывают всю поверхность начальной инициализации: helm, apply, delete, patch, wait, rollout, job — с подстановкой ${VAR}, конвейерами sprig и условиями when: (CEL), благодаря чему одна спецификация подходит для множества окружений. Полный справочник по полям: спецификация DSL.

Быстрый старт

make build
k3d cluster create dev
bin/khook apply -f examples/simple.yaml \
  --set NAMESPACE_NAME_TO_CREATE=demo \
  --set NAMESPACE_NAME_FOR_INGRESS=ingress

В терминале каждый шаг отображается в виде живой строки статуса; в CI выводятся обычные логи и итоговая таблица, либо --output json. Запустите повторно — всё сойдётся к нужному состоянию, ничего не сломается. В этом и есть смысл.

Полное пошаговое руководство: Getting started.

Документация

Статус проекта

Ядро v1 реализовано и протестировано (юнит-тесты и сквозные тесты на k3d): семь типов шагов, движок DAG, переменные, возобновляемые запуски (state:), удаление (destroy) и CLI. Проект находится в стадии предрелиза — интеграция с Terraform/Lambda включена в roadmap.

Разработка

go test ./...   # юнит-тесты (движок, спецификация, исполнители на фейках)
./tests/e2e.sh  # сквозные тесты на одноразовом k3d-кластере

Вклад в проект приветствуется — прочитайте AGENTS.md с описанием соглашений репозитория и порядком чтения материалов.

Лицензия

MIT

© 2026 meganuke