Files
sless/doc/sqs-operator-sonnet-plan.md
T

9.8 KiB
Raw Blame History

SQS Operator — План для Sonnet (этап: сборка → деплой → тест)

Дата: 2026-04-07

Подготовил: Claude Opus 4.6

Исполнитель: Claude Sonnet


Контекст

SQS Operator переделан через Operator SDK v1.37.0. Код компилируется (make build OK). Нужно: docker build → push в registry → deploy в кластер → создать тестовый QueueService → убедиться что ElasticMQ pod поднялся.

Ветка: sqs-operator Последний коммит: 66dcd99 — refactor через Operator SDK


КРИТИЧЕСКИЕ ПРАВИЛА (прочитай ПОЛНОСТЬЮ перед работой)

  1. ВСЕ команды — ТОЛЬКО через SSH на VM:
    ssh -i /home/naeel/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 КОМАНДА
    
  2. Файлы редактировать можно через VS Code — папка /home/naeel/remote_dev/sless = mount VM ~/terra/sless/
  3. НЕ запускать НИЧЕГО локально — только SSH
  4. Всегда указывать timeout в run_in_terminal
  5. Не делать без явной команды пользователя — спрашивать, если непонятно
  6. kubeconfig протух — перед kubectl нужно обновить. СПРОСИ ПОЛЬЗОВАТЕЛЯ как.
  7. Документировать каждый шаг в doc/thinking/ и doc/progress.md

Этап 1: Исправить Dockerfile

Проблема: Scaffold Dockerfile копирует только internal/controller/, но наш код также в:

  • internal/config/ — загрузка env конфига
  • internal/elasticmq/ — HOCON генератор + credentials

Файл: sqs-operator/Dockerfile

Что менять: добавить строки COPY для недостающих пакетов. После строки:

COPY internal/controller/ internal/controller/

Добавить:

COPY internal/config/ internal/config/
COPY internal/elasticmq/ internal/elasticmq/

Проверка: make docker-build IMG=pearlharbor.registryk8s.services.ngcloud.ru/naeel/sqs-operator:v0.1.0


Этап 2: Docker build + push

cd ~/terra/sless/sqs-operator
make docker-build IMG=pearlharbor.registryk8s.services.ngcloud.ru/naeel/sqs-operator:v0.1.0
make docker-push IMG=pearlharbor.registryk8s.services.ngcloud.ru/naeel/sqs-operator:v0.1.0

Docker registry: pearlharbor.registryk8s.services.ngcloud.ru (уже залогинен - docker login возвращает OK).


Этап 3: Обновить kubeconfig

Сейчас kubectl не работаетthe server has asked for the client to provide credentials.

СПРОСИ ПОЛЬЗОВАТЕЛЯ как обновить kubeconfig. Не пытайся обойти самостоятельно.


Этап 4: Установить CRD в кластер

cd ~/terra/sless/sqs-operator
make install

Это применит config/crd/bases/sqs.kube5s.ru_queueservices.yaml в кластер.

Проверка:

kubectl get crd queueservices.sqs.kube5s.ru

Этап 5: Deploy оператора

5a. Подготовить manager.yaml

Kustomize namespace: sqs-operator-system (из config/default/kustomization.yaml).

Нужно проверить/настроить:

  1. IMAGE: заменить controller:latest на реальный registry image
  2. ENV: добавить SQS_EXTERNAL_HOST=sqs.kube5s.ru в Deployment container env
  3. ImagePullSecrets: если registry приватный, может понадобиться secret

Команда деплоя через kustomize:

cd ~/terra/sless/sqs-operator
make deploy IMG=pearlharbor.registryk8s.services.ngcloud.ru/naeel/sqs-operator:v0.1.0

5b. Добавить env SQS_EXTERNAL_HOST

ВАЖНО: manager.yaml не содержит env SQS_EXTERNAL_HOST. Оператор крашнется без него.

Варианты:

  • Вариант A (рекомендуемый): Создать kustomize patch файл config/manager/env_patch.yaml
  • Вариант B: Отредактировать config/manager/manager.yaml напрямую — добавить env

Добавить в containers[0].env:

env:
- name: SQS_EXTERNAL_HOST
  value: "sqs.kube5s.ru"

5c. ImagePullSecrets

Registry pearlharbor.registryk8s.services.ngcloud.ru — приватный. В namespace sqs-operator-system нужен secret:

kubectl create secret docker-registry pearlharbor-registry \
  --namespace=sqs-operator-system \
  --docker-server=pearlharbor.registryk8s.services.ngcloud.ru \
  --docker-username=admin \
  --docker-password=<PASSWORD>

Пароль для registry — проверь в secrets/pearlharbor_registry.txt.

И добавить imagePullSecrets в manager.yaml.

Проверка:

kubectl -n sqs-operator-system get pods
kubectl -n sqs-operator-system logs deployment/sqs-operator-controller-manager -c manager

Ожидаемый лог: operator config loaded, starting manager.


Этап 6: Тестирование — создать QueueService

6a. Обновить sample CR

Файл config/samples/sqs_v1alpha1_queueservice.yaml — сейчас пустой (scaffold). Заполнить:

apiVersion: sqs.kube5s.ru/v1alpha1
kind: QueueService
metadata:
  name: test-tenant-001
  namespace: sqs-operator-system
spec:
  tenantId: "test001"
  memoryMB: 64
  storageMB: 512
  persistence: true

6b. Применить

kubectl apply -f config/samples/sqs_v1alpha1_queueservice.yaml

6c. Наблюдение

# CR статус
kubectl get queueservices -A

# Логи оператора
kubectl -n sqs-operator-system logs deployment/sqs-operator-controller-manager -c manager -f

# Ресурсы тенанта (должны появиться в sless-fn-test001)
kubectl -n sless-fn-test001 get all,pvc,secret,ingress

# ElasticMQ pod
kubectl -n sless-fn-test001 get pods -w

Ожидаемый результат:

  • QueueService Phase: Pending → Provisioning → Ready
  • В sless-fn-test001:
    • Deployment sqs-test001 — 1 pod Running
    • Service sqs-svc-test001 — ClusterIP:9324
    • Ingress sqs-ing-test001 — sqs.kube5s.ru/sqs/test001
    • Secret sqs-creds-test001 — accessKey/secretKey
    • PVC sqs-data-test001
    • ConfigMap sqs-cfg-test001

Этап 7: Smoke test SQS API

# Получить credentials
ACCESS_KEY=$(kubectl -n sless-fn-test001 get secret sqs-creds-test001 -o jsonpath={.data.accessKey} | base64 -d)
SECRET_KEY=$(kubectl -n sless-fn-test001 get secret sqs-creds-test001 -o jsonpath={.data.secretKey} | base64 -d)

# Создать очередь через curl (SQS API)
curl -k "https://sqs.kube5s.ru/sqs/test001/?Action=CreateQueue&QueueName=my-test-queue&Version=2012-11-05" \
  --user "$ACCESS_KEY:$SECRET_KEY"

# Отправить сообщение
curl -k "https://sqs.kube5s.ru/sqs/test001/<QUEUE_URL_PATH>?Action=SendMessage&MessageBody=hello-world&Version=2012-11-05" \
  --user "$ACCESS_KEY:$SECRET_KEY"

# Прочитать сообщение
curl -k "https://sqs.kube5s.ru/sqs/test001/<QUEUE_URL_PATH>?Action=ReceiveMessage&Version=2012-11-05" \
  --user "$ACCESS_KEY:$SECRET_KEY"

Этап 8: Коммит + пуш

git add -A && git commit -m "feat(sqs-operator): docker build, deploy, tested QueueService"
git push

Справочная информация

Ключевые файлы

Файл Назначение
api/v1alpha1/queueservice_types.go CRD Spec/Status с kubebuilder маркерами
internal/controller/queueservice_controller.go Reconciler: provision, checkReady, handleDeletion
internal/elasticmq/elasticmq_config.go HOCON конфиг ElasticMQ для тенанта
internal/elasticmq/elasticmq_credentials.go Генератор accessKey/secretKey
internal/config/sqs_operator_config.go Env конфиг: SQS_EXTERNAL_HOST, SQS_ELASTICMQ_IMAGE
cmd/main.go Entry point (scaffold + config loading)
config/crd/bases/sqs.kube5s.ru_queueservices.yaml Автосгенерированный CRD YAML
config/rbac/role.yaml Автосгенерированный RBAC ClusterRole
Makefile Operator SDK toolchain: manifests, generate, build, docker-build, deploy
Dockerfile Multi-stage build (НУЖНО ИСПРАВИТЬ — см. этап 1)

Reconciler фазы

Pending → provision() → Provisioning → checkReady() → Ready
                                                         ↑
Failed ← ensureHealthy() (pod down)   recoverFromFailed() ←→ Ready

Env переменные оператора

Переменная Обязательная Default Описание
SQS_EXTERNAL_HOST ДА Публичный хост: sqs.kube5s.ru
SQS_ELASTICMQ_IMAGE нет softwaremill/elasticmq-native:1.7.1 Docker образ ElasticMQ
OPERATOR_NAMESPACE нет sless Namespace оператора

SSH

ssh -i /home/naeel/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213

Docker registry

pearlharbor.registryk8s.services.ngcloud.ru/naeel/sqs-operator:v0.1.0

Логин: admin, пароль в secrets/pearlharbor_registry.txt

Toolchain версии

  • Go: 1.26.1
  • operator-sdk: v1.37.0
  • controller-gen: v0.17.0
  • controller-runtime: v0.17.3
  • Docker: 28.2.2