Files
IoT/doc/run-and-test.md
T

7.5 KiB
Raw Blame History

ЛЕГАСИ (2026-08-16) — СТАРЫЙ IoT (k8s-деплой). НЕ ПРИНИМАТЬ ВО ВНИМАНИЕ. Актуальное: HISTORY/2026-08-16-session-log.md

IoT — Руководство по запуску и тестированию (v0.2.3)

Дата: 2026-04-12 Кластер: iot-naeel, namespace: sless Образ: naeel/iot-operator:v0.2.3


Содержание

  1. Предварительные требования
  2. Сборка и публикация образа
  3. Деплой в кластер
  4. E2E тест: полный путь данных
  5. Проверка компонентов
  6. Отладка

Предварительные требования

  • kubectl с kubeconfig для кластера iot-naeel (185.247.187.149:6443)
  • Docker для сборки образа
  • mosquitto-clients для MQTT тестов (apt install mosquitto-clients)
  • curl для REST API

Сборка и публикация образа

cd /home/naeel/terra/IoT

# Сборка multi-binary Docker образа
docker build -t naeel/iot-operator:v0.2.3 .

# Push на Docker Hub
docker push naeel/iot-operator:v0.2.3

Dockerfile собирает 3 бинарника: /iot-operator, /mqtt-bridge, /sqs-consumer.


Деплой в кластер

# Применить CRD
kubectl apply -f config/crd/bases/iot.kube5s.ru_iotdevices.yaml

# Деплой всех компонентов
kubectl apply -f deployments/k8s/emqx.yaml
kubectl apply -f deployments/k8s/iot-operator.yaml
kubectl apply -f deployments/k8s/iot-mqtt-bridge.yaml
kubectl apply -f deployments/k8s/iot-sqs-consumer.yaml
kubectl apply -f deployments/k8s/iot-postgres.yaml

# Проверка
kubectl get pods -n sless
# Ожидаем: emqx, iot-operator, iot-mqtt-bridge, iot-sqs-consumer — все Running

E2E тест: полный путь данных

Полный тест проверяет цепочку: REST API → CRD → Secret → MQTT → SQS → Postgres → Telemetry API.

Шаг 1: Создать устройство через API

curl -X POST https://iot.kube5s.ru/v1/namespaces/sless/iot/devices \
  -H "Authorization: Bearer test-token" \
  -H "Content-Type: application/json" \
  -d '{"name":"e2e-test-01","device_id":"e2e-test-01","enabled":true}'

Ответ: 201 Created с данными устройства.

Шаг 2: Получить MQTT credentials

curl -s https://iot.kube5s.ru/v1/namespaces/sless/iot/devices/e2e-test-01 \
  -H "Authorization: Bearer test-token" \
  | jq '{mqtt_username, mqtt_password, phase}'

Ожидаем: phase=Active, mqtt_username="sless_e2e-test-01", mqtt_password=hex(64).

Если phase=Pending — подождать 1-2 секунды, контроллер ещё создаёт Secret.

Шаг 3: Отправить телеметрию через MQTT

# Вставить реальный пароль из Шага 2
MQTT_USER="sless_e2e-test-01"
MQTT_PASS="<mqtt_password из шага 2>"

# Через WebSocket (через Ingress)
mosquitto_pub \
  -h iot.kube5s.ru \
  -p 443 \
  --capath /etc/ssl/certs \
  -u "$MQTT_USER" \
  -P "$MQTT_PASS" \
  -t "sless/telemetry/e2e-test-01" \
  -m '{"temperature": 22.5, "humidity": 65}' \
  --protocol-version mqttv5

# ИЛИ через kubectl port-forward (MQTT напрямую)
kubectl port-forward svc/emqx -n sless 1883:1883 &
mosquitto_pub \
  -h localhost \
  -p 1883 \
  -u "$MQTT_USER" \
  -P "$MQTT_PASS" \
  -t "sless/telemetry/e2e-test-01" \
  -m '{"temperature": 22.5, "humidity": 65}'

Шаг 4: Проверить что телеметрия дошла до Postgres

Подождать 5-10 секунд (SQS long polling + обработка).

curl -s "https://iot.kube5s.ru/v1/namespaces/sless/iot/telemetry?device=e2e-test-01&limit=10" \
  -H "Authorization: Bearer test-token" \
  | jq '.'

Ожидаем: count >= 1, items содержит запись с payload {"temperature": 22.5, "humidity": 65}.

Шаг 5: Очистка

curl -X DELETE https://iot.kube5s.ru/v1/namespaces/sless/iot/devices/e2e-test-01 \
  -H "Authorization: Bearer test-token"

Проверка компонентов

Поды

kubectl get pods -n sless -l 'app in (iot-operator,iot-mqtt-bridge,iot-sqs-consumer,emqx)'

Логи

# Operator (controller + API)
kubectl logs -n sless deployment/iot-operator --tail=50

# MQTT Bridge
kubectl logs -n sless deployment/iot-mqtt-bridge --tail=50

# SQS Consumer
kubectl logs -n sless deployment/iot-sqs-consumer --tail=50

# EMQX
kubectl logs -n sless deployment/emqx --tail=50

CRD ресурсы

# Список IoTDevice
kubectl get iotdevices -n sless

# Детали
kubectl describe iotdevice e2e-test-01 -n sless

# Секреты
kubectl get secret -n sless -l app.kubernetes.io/managed-by=iot-operator

EMQX Dashboard (отладка)

kubectl port-forward svc/emqx -n sless 18083:18083
# Открыть http://localhost:18083
# Default: admin / public

SQS очередь

# Через admin stats endpoint
curl -s https://iot.kube5s.ru/iot-admin/stats \
  -H "Authorization: Bearer <ADMIN_STATS_TOKEN>" \
  | jq '.sqs'

Отладка

Устройство не подключается по MQTT

  1. Проверить phase: kubectl get iotdevice {name} -n {ns} -o jsonpath='{.status.phase}' — Должно быть Active
  2. Проверить Secret: kubectl get secret iot-{deviceId} -n {ns}
  3. Проверить EMQX logs: kubectl logs -n sless deployment/emqx | grep "auth"
  4. Ручная проверка auth:
    kubectl port-forward svc/iot-operator -n sless 9090:9090
    curl -X POST http://localhost:9090/internal/mqtt/auth \
      -d '{"username":"sless_sensor-01","password":"...","clientid":"test"}'
    

Телеметрия не появляется в API

  1. Bridge подключён? kubectl logs -n sless deployment/iot-mqtt-bridge | tail -20
  2. SQS получает? curl /iot-admin/stats → sqs.approximate_messages
  3. Consumer обрабатывает? kubectl logs -n sless deployment/iot-sqs-consumer | tail -20
  4. Postgres доступен? Проверить логи consumer на ошибки подключения

Bridge не подключается к MQTT

  1. Проверить Secret iot-bridge-credentials: kubectl get secret iot-bridge-credentials -n sless -o jsonpath='{.data.MQTT_USERNAME}' | base64 -d
  2. Проверить env в Bridge pod: kubectl exec -n sless deployment/iot-mqtt-bridge -- env | grep MQTT

IoT Console (Web UI)

Открыть https://iot.kube5s.ru/console в браузере.

Функции:

  • CRUD устройств через REST API
  • Встроенный MQTT WebSocket клиент (wss://iot.kube5s.ru/mqtt)
  • Real-time отображение входящей телеметрии
  • Просмотр истории из Postgres

IoT Admin Panel

Открыть https://iot.kube5s.ru/iot-admin в браузере.

Функции:

  • Статистика по PostgreSQL (количество записей по тенантам)
  • SQS: approximate message count
  • Статус подов bridge и consumer
  • Автообновление каждые 30 секунд