- 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/)
3.9 KiB
3.9 KiB
Лог мышления — 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.
Решение
- Установил operator-sdk v1.37.0 на VM
- Сделал бэкап бизнес-логики в /tmp/sqs-backup/ (4 файла)
- Удалил ручной sqs-operator/
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 — метаданные оператора
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) - Остальная логика без изменений
- Package:
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_*.gointernal/config/config.go— конфликт сsqs_operator_config.gomain.go(в корне) — конфликт сcmd/main.godeployments/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 в кластер + тестирование