- 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/)
73 lines
3.9 KiB
Markdown
73 lines
3.9 KiB
Markdown
# Лог мышления — 2026-04-07
|
||
## Агент: GitHub Copilot (Claude Opus 4.6)
|
||
|
||
---
|
||
|
||
## Контекст: Переделка SQS Operator через Operator SDK
|
||
|
||
### Проблема
|
||
Первая версия sqs-operator была создана вручную (без Operator SDK):
|
||
- Ручной CRD types файл с самописным deepcopy
|
||
- Ручной Makefile
|
||
- Ручной Dockerfile
|
||
- Нет стандартной kubebuilder структуры
|
||
|
||
Пользователь справедливо потребовал переделать через Operator SDK.
|
||
|
||
### Решение
|
||
|
||
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 в кластер + тестирование
|