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:
+65
-18
@@ -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 в кластер + тестирование
|
||||
|
||||
Reference in New Issue
Block a user