7.5 KiB
⛔⛔⛔ ЛЕГАСИ (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
Содержание
- Предварительные требования
- Сборка и публикация образа
- Деплой в кластер
- E2E тест: полный путь данных
- Проверка компонентов
- Отладка
Предварительные требования
- 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
- Проверить phase:
kubectl get iotdevice {name} -n {ns} -o jsonpath='{.status.phase}'— Должно бытьActive - Проверить Secret:
kubectl get secret iot-{deviceId} -n {ns} - Проверить EMQX logs:
kubectl logs -n sless deployment/emqx | grep "auth" - Ручная проверка 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
- Bridge подключён?
kubectl logs -n sless deployment/iot-mqtt-bridge | tail -20 - SQS получает?
curl /iot-admin/stats→ sqs.approximate_messages - Consumer обрабатывает?
kubectl logs -n sless deployment/iot-sqs-consumer | tail -20 - Postgres доступен? Проверить логи consumer на ошибки подключения
Bridge не подключается к MQTT
- Проверить Secret iot-bridge-credentials:
kubectl get secret iot-bridge-credentials -n sless -o jsonpath='{.data.MQTT_USERNAME}' | base64 -d - Проверить 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 секунд