refactor(sqs-operator): переделка через Operator SDK v1.37.0

- operator-sdk init + create api (QueueService kind, group sqs, v1alpha1)
- Стандартная kubebuilder структура: cmd/, internal/controller/, config/
- CRD types с kubebuilder маркерами (validation, defaults, printcolumns)
- Reconciler перенесён из ручного кода в internal/controller/
- controller-gen v0.17.0 (совместимость с Go 1.26.1)
- Автогенерация: deepcopy, CRD YAML, RBAC ClusterRole
- Удалены все ручные файлы (controllers/, main.go, deployments/)
This commit is contained in:
Naeel
2026-04-07 14:25:14 +03:00
parent cbe61d9f62
commit 66dcd99465
53 changed files with 2459 additions and 973 deletions
+65 -18
View File
@@ -1,25 +1,72 @@
# Лог мышления — 2026-04-07
## Агент: GitHub Copilot (Claude Opus 4.6)
---
# Агент: Claude Opus 4.6 | SQS Operator Planning
## Контекст
Пользователь попросил создать managed SQS-совместимый сервис очередей для облачного провайдера.
## Контекст: Переделка SQS Operator через Operator SDK
## Анализ вариантов backend
1. **ElasticMQ** — Scala, 2.8k stars, persistence (H2), SQS API, native image (GraalVM), Apache-2.0, активная разработка (v1.7.1 — 2 дня назад). ПОБЕДИТЕЛЬ.
2. **GoAWS** — Go, 834 stars, НЕТ persistence, только in-memory. Не production.
3. **LocalStack** — Python, 56k stars, эмуляция всего AWS. Избыточно.
### Проблема
Первая версия sqs-operator была создана вручную (без Operator SDK):
- Ручной CRD types файл с самописным deepcopy
- Ручной Makefile
- Ручной Dockerfile
- Нет стандартной kubebuilder структуры
## Анализ архитектуры
- **Вариант A (инстанс на тенанта)** — выбран. Изоляция, отказоустойчивость, ~30MB RAM idle.
- **Вариант B (shared)** — отклонён: "если наебнётся — то у всех".
Пользователь справедливо потребовал переделать через Operator SDK.
## Ключевые решения
- Routing: path-based `sqs.kube5s.ru/sqs/{tenant}/` (не subdomain — не нужен wildcard DNS)
- Auth: Bearer token (существующий), абстрагирован для замены на ЛК
- Namespace: `sless-fn-{tenant}` (уже создаётся для serverless функций)
- Config: `SQS_EXTERNAL_HOST` — настраиваемый, для смены при деплое в облако
- DNS: создана A-запись `sqs.kube5s.ru` → 185.247.187.147
### Решение
## Результат
Создан подробный план `doc/sqs-operator-plan.md` — 10 этапов, 9 файлов, готов для реализации Sonnet.
1. **Установил operator-sdk v1.37.0** на VM
2. **Сделал бэкап** бизнес-логики в /tmp/sqs-backup/ (4 файла)
3. **Удалил** ручной sqs-operator/
4. **`operator-sdk init`** — сгенерировал scaffold:
- Makefile с полным toolchain (manifests, generate, build, docker-build, deploy)
- Dockerfile multi-stage
- config/ (CRD, RBAC, manager, prometheus, certmanager, scorecard)
- cmd/main.go — стандартный entry point
- PROJECT — метаданные оператора
5. **`operator-sdk create api`** — сгенерировал:
- api/v1alpha1/queueservice_types.go (scaffold)
- internal/controller/queueservice_controller.go (scaffold)
- config/rbac/ editor/viewer roles
- config/samples/ sample CR
### Проблема: controller-gen v0.14.0 не компилируется с Go 1.26.1
- Ошибка: `golang.org/x/tools@v0.16.1``tokeninternal.go:78:9: invalid array length`
- **Решение**: обновил CONTROLLER_TOOLS_VERSION в Makefile с v0.14.0 на v0.17.0
### Перенос бизнес-логики
- `queueservice_types.go` — заполнил CRD spec/status с kubebuilder маркерами:
- Spec: TenantID, MemoryMB (default 64), StorageMB (default 512), Persistence (default true)
- Status: Phase (Pending/Provisioning/Ready/Failed), Endpoint, SecretName, Message, ReadyAt
- PrintColumns: Tenant, Phase, Endpoint, Age
- `queueservice_controller.go` — перенёс reconciler из бэкапа, адаптировал:
- Package: `controller` (operator-sdk) вместо `controllers` (ручной)
- PVC Resources: `VolumeResourceRequirements` вместо `ResourceRequirements` (k8s v0.29.2 API)
- Остальная логика без изменений
- `internal/elasticmq/` — HOCON config генератор + credentials генератор
- `internal/config/` — env config (SQS_EXTERNAL_HOST, SQS_ELASTICMQ_IMAGE, OPERATOR_NAMESPACE)
- `cmd/main.go` — добавил загрузку конфига и передачу в reconciler
### Очистка
При `rm -rf sqs-operator/` старые файлы из ручного кода остались (sshfs cache?):
- `controllers/` (старый каталог) — конфликт с `internal/controller/`
- `internal/elasticmq/config.go` и `credentials.go` — конфликт с новыми `elasticmq_*.go`
- `internal/config/config.go` — конфликт с `sqs_operator_config.go`
- `main.go` (в корне) — конфликт с `cmd/main.go`
- `deployments/sqs-operator.yaml` — ручной yaml
Все удалены, `make build` прошёл успешно.
### Результат
-`make generate` — deepcopy сгенерирован автоматически
-`make manifests` — CRD YAML + RBAC roles сгенерированы из маркеров
-`make build` — бинарник bin/manager (55MB)
- CRD включает printColumns, validation constraints, defaults
- RBAC включает все необходимые permissions (apps, core, networking, sqs.kube5s.ru)
### Следующие шаги
- Добавить bin/manager в .gitignore
- Коммит + пуш
- Docker build + push
- Deploy в кластер + тестирование