9.8 KiB
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
КРИТИЧЕСКИЕ ПРАВИЛА (прочитай ПОЛНОСТЬЮ перед работой)
- ВСЕ команды — ТОЛЬКО через SSH на VM:
ssh -i /home/naeel/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 КОМАНДА - Файлы редактировать можно через VS Code — папка
/home/naeel/remote_dev/sless= mount VM~/terra/sless/ - НЕ запускать НИЧЕГО локально — только SSH
- Всегда указывать timeout в run_in_terminal
- Не делать без явной команды пользователя — спрашивать, если непонятно
- kubeconfig протух — перед kubectl нужно обновить. СПРОСИ ПОЛЬЗОВАТЕЛЯ как.
- Документировать каждый шаг в 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).
Нужно проверить/настроить:
- IMAGE: заменить
controller:latestна реальный registry image - ENV: добавить
SQS_EXTERNAL_HOST=sqs.kube5s.ruв Deployment container env - 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
- Deployment
Этап 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