Files
sless/doc/thinking/2026-04-07.md
T
Naeel 66dcd99465 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/)
2026-04-07 14:25:14 +03:00

3.9 KiB
Raw Blame History

Лог мышления — 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.1tokeninternal.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 в кластер + тестирование