feat: замена Kafka → shared-SQS в IoT pipeline
- mqtt-bridge: kafka.Writer → SQS SendMessage (AWS SDK Go v2) - kafka-consumer → sqs-consumer: polling loop с ReceiveMessage/DeleteMessage - admin stats: Kafka lag → SQS GetQueueAttributes - Удалён kafka-consumer, добавлен sqs-consumer - go.mod: убран segmentio/kafka-go, добавлен aws-sdk-go-v2 - Dockerfile, Makefile: kafka-consumer → sqs-consumer - .gitignore: исправлен чтобы не игнорировать cmd/ директории - deployments: новый iot-sqs-consumer.yaml, обновлён mqtt-bridge - doc/decisions: задокументировано решение
This commit is contained in:
@@ -1,25 +1,18 @@
|
||||
# Создано: 2026-04-04
|
||||
# Изменено: 2026-04-06 (MQTT→Kafka: убран RABBITMQ_URL, добавлен KAFKA_BROKERS, v0.1.67)
|
||||
# Deployment iot-mqtt-bridge — MQTT→Kafka мост для IoT.
|
||||
# Изменено: 2026-04-12 (замена Kafka → shared-SQS)
|
||||
# Deployment iot-mqtt-bridge — MQTT→SQS мост для IoT.
|
||||
#
|
||||
# Получает MQTT сообщения от EMQX (подписка на "+/telemetry/+")
|
||||
# и публикует в Kafka топик "iot.telemetry" (ключ = namespace).
|
||||
# и отправляет в shared-SQS очередь "iot-telemetry" через AWS SDK.
|
||||
#
|
||||
# Credentials для MQTT подключения берутся из Secret iot-bridge-credentials.
|
||||
# Этот Secret нужно создать вручную ДО деплоя:
|
||||
# Credentials для SQS берутся из Secret iot-sqs-credentials.
|
||||
#
|
||||
# # 1. Создать IoTDevice для bridge через API:
|
||||
# curl -X POST .../v1/namespaces/sless-bridge/iot/devices \
|
||||
# -d '{"name":"bridge","device_id":"bridge","enabled":true}'
|
||||
#
|
||||
# # 2. Получить credentials:
|
||||
# MQTT_USERNAME=$(kubectl get secret iot-bridge -n sless-bridge -o jsonpath='{.data.mqtt-username}' | base64 -d)
|
||||
# MQTT_PASSWORD=$(kubectl get secret iot-bridge -n sless-bridge -o jsonpath='{.data.mqtt-password}' | base64 -d)
|
||||
#
|
||||
# # 3. Создать Secret для bridge Deployment (один раз):
|
||||
# kubectl create secret generic iot-bridge-credentials -n sless \
|
||||
# --from-literal=MQTT_USERNAME="$MQTT_USERNAME" \
|
||||
# --from-literal=MQTT_PASSWORD="$MQTT_PASSWORD"
|
||||
# Создание SQS Secret (один раз):
|
||||
# kubectl create secret generic iot-sqs-credentials -n sless \
|
||||
# --from-literal=SQS_ENDPOINT="https://qu.kube5s.ru" \
|
||||
# --from-literal=SQS_ACCESS_KEY="<access_key>" \
|
||||
# --from-literal=SQS_SECRET_KEY="<secret_key>"
|
||||
#
|
||||
# Применение: kubectl apply -f deployments/k8s/iot-mqtt-bridge.yaml
|
||||
|
||||
@@ -47,19 +40,20 @@ spec:
|
||||
# При смене версии оператора — менять тег и здесь.
|
||||
image: pearlharbor.registryk8s.services.ngcloud.ru/naeel/sless-operator:v0.1.69
|
||||
imagePullPolicy: Always
|
||||
command: ["/iot-mqtt-bridge"]
|
||||
command: ["/mqtt-bridge"]
|
||||
env:
|
||||
- name: MQTT_BROKER_URL
|
||||
value: "tcp://emqx.sless.svc:1883"
|
||||
- name: KAFKA_BROKERS
|
||||
value: "kafka.sless.svc.cluster.local:9092"
|
||||
- name: SQS_QUEUE_NAME
|
||||
value: "iot-telemetry"
|
||||
- name: SQS_REGION
|
||||
value: "us-east-1"
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: iot-bridge-credentials
|
||||
# IOT_PG_DSN — сохранение телеметрии в Postgres (опционально)
|
||||
# SQS_ENDPOINT, SQS_ACCESS_KEY, SQS_SECRET_KEY
|
||||
- secretRef:
|
||||
name: iot-postgres-secret
|
||||
optional: true
|
||||
name: iot-sqs-credentials
|
||||
resources:
|
||||
requests:
|
||||
memory: "32Mi"
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
# Создано: 2026-04-12
|
||||
# Deployment iot-sqs-consumer — читает IoT телеметрию из shared-SQS → пишет в IoT Postgres.
|
||||
#
|
||||
# Long polling (WaitTimeSeconds=20) — минимизирует пустые запросы.
|
||||
# Сообщение удаляется из SQS только после успешной записи в Postgres (at-least-once).
|
||||
#
|
||||
# Credentials для SQS берутся из Secret iot-sqs-credentials.
|
||||
# IOT_PG_DSN берётся из Secret iot-postgres-secret.
|
||||
#
|
||||
# Создание SQS Secret (один раз, если ещё не создан):
|
||||
# kubectl create secret generic iot-sqs-credentials -n sless \
|
||||
# --from-literal=SQS_ENDPOINT="https://qu.kube5s.ru" \
|
||||
# --from-literal=SQS_ACCESS_KEY="<access_key>" \
|
||||
# --from-literal=SQS_SECRET_KEY="<secret_key>"
|
||||
#
|
||||
# Применение: kubectl apply -f deployments/k8s/iot-sqs-consumer.yaml
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: iot-sqs-consumer
|
||||
namespace: sless
|
||||
labels:
|
||||
app: iot-sqs-consumer
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: iot-sqs-consumer
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: iot-sqs-consumer
|
||||
spec:
|
||||
containers:
|
||||
- name: sqs-consumer
|
||||
# Тот же образ что и оператор — все IoT бинари в одном образе.
|
||||
image: pearlharbor.registryk8s.services.ngcloud.ru/naeel/sless-operator:v0.1.69
|
||||
imagePullPolicy: Always
|
||||
command: ["/sqs-consumer"]
|
||||
env:
|
||||
- name: SQS_QUEUE_NAME
|
||||
value: "iot-telemetry"
|
||||
- name: SQS_REGION
|
||||
value: "us-east-1"
|
||||
envFrom:
|
||||
# SQS_ENDPOINT, SQS_ACCESS_KEY, SQS_SECRET_KEY
|
||||
- secretRef:
|
||||
name: iot-sqs-credentials
|
||||
# IOT_PG_DSN — master DSN для IoT Postgres (per-tenant DB)
|
||||
- secretRef:
|
||||
name: iot-postgres-secret
|
||||
resources:
|
||||
requests:
|
||||
memory: "32Mi"
|
||||
cpu: "25m"
|
||||
limits:
|
||||
memory: "64Mi"
|
||||
cpu: "100m"
|
||||
imagePullSecrets:
|
||||
- name: sless-registry-auth
|
||||
Reference in New Issue
Block a user