Проблема, которую решает 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.
Документация
-
Getting started — установка, первая спецификация, переменные
-
Спецификация DSL — семь типов шагов, переменные, конвейеры, условия
-
Справочник CLI — команды, флаги, приоритет переменных, коды выхода, семантика
-
vs Terraform — почему не провайдеры
kubernetes/helm -
Примеры —
real-case.yaml(production-образная инициализация EKS),localenv.yaml(k3d/kind)
Статус проекта
Ядро v1 реализовано и протестировано (юнит-тесты и сквозные тесты на k3d): семь типов шагов, движок DAG, переменные, возобновляемые запуски (state:), удаление (destroy) и CLI. Проект находится в стадии предрелиза — интеграция с Terraform/Lambda включена в roadmap.
Разработка
go test ./... # юнит-тесты (движок, спецификация, исполнители на фейках)
./tests/e2e.sh # сквозные тесты на одноразовом k3d-кластере
Вклад в проект приветствуется — прочитайте AGENTS.md с описанием соглашений репозитория и порядком чтения материалов.