Files
2026-06-24 18:58:35 +03:00
..
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00
2026-06-24 18:58:35 +03:00

Развёртывание audio-pipeline в k3s

Пошаговая инструкция для однонодового k3s. Все сервисы из docker-compose.yml переносятся в namespace audio-pipeline.

Архитектура в кластере

namespace: audio-pipeline
├── rabbit          (Service :5672, :15672)
├── postgres        (Service :5432, PVC local-path)
├── PVC audio-storage → hostPath /var/lib/audio-pipeline/storage
├── watcher
├── transcribe      (+ ConfigMap prompts.json)
├── tagging
└── analyse

DNS внутри кластера: rabbit, postgres — те же хосты, что в .env для Docker Compose.

Требования

  • Linux-сервер с k3s
  • kubectl (обычно /usr/local/bin/kubectl или k3s kubectl)
  • Docker (для сборки образов) или свой container registry

1. Установка k3s

curl -sfL https://get.k3s.io | sh -
sudo k3s kubectl get nodes

Для доступа без sudo:

mkdir -p ~/.kube
sudo k3s kubectl config view --raw > ~/.kube/config
chmod 600 ~/.kube/config

2. Подготовка секретов

cd audio-pipeline

# из корневого .env
./k8s/prepare-secret.sh

# или вручную
cp k8s/secret.env.example k8s/secret.env
# отредактируйте ключи Nexara / Yandex

Файл k8s/secret.env в git не коммитится.

Проверьте URL в секрете:

RABBITMQ_URL=amqp://admin:secret123@rabbit:5672/
DATABASE_URL=postgres://pipeline:pipeline_secret@postgres:5432/pipeline?sslmode=disable

3. Сборка и загрузка образов

Вариант A — локальный k3s (без registry)

chmod +x k8s/build-images.sh
./k8s/build-images.sh

Скрипт собирает 4 образа и импортирует их в containerd k3s.

Вариант B — через registry

REGISTRY=registry.example.com/audio-pipeline
TAG=v1

docker build -t $REGISTRY/watcher:$TAG ./watcher
docker build -t $REGISTRY/transcribe:$TAG ./workers/transcribe
docker build -t $REGISTRY/tagging:$TAG ./workers/tagging
docker build -t $REGISTRY/analyse:$TAG ./workers/analyse

docker push $REGISTRY/watcher:$TAG
# ... остальные

# в k8s/watcher.yaml и др. замените image: на $REGISTRY/...

4. Хранилище аудио

По умолчанию используется hostPath на ноде:

/var/lib/audio-pipeline/storage/
├── incoming/
├── processing/
└── failed/

Создайте каталоги на ноде k3s:

sudo mkdir -p /var/lib/audio-pipeline/storage/{incoming,processing,failed}
sudo chmod -R 777 /var/lib/audio-pipeline/storage   # или нужный uid подов

Важно: ReadWriteMany + hostPath работает, пока все поды на одной ноде. Для multi-node кластера подключите NFS или Longhorn с RWX.

5. Деплой

kubectl apply -k k8s/

Проверка:

kubectl -n audio-pipeline get pods
kubectl -n audio-pipeline get pvc
kubectl -n audio-pipeline logs -f deploy/watcher

Ожидаемый порядок старта: rabbit + postgres → воркеры (сами ждут RabbitMQ/Postgres при старте).

6. Загрузка тестового файла

На ноде k3s:

sudo cp recording.wav /var/lib/audio-pipeline/storage/incoming/

Или с машины разработчика (замените NODE на IP сервера):

scp recording.wav user@NODE:/tmp/
ssh user@NODE 'sudo cp /tmp/recording.wav /var/lib/audio-pipeline/storage/incoming/'

7. Мониторинг

# логи воркеров
kubectl -n audio-pipeline logs -f deploy/transcribe
kubectl -n audio-pipeline logs -f deploy/analyse
kubectl -n audio-pipeline logs -f deploy/tagging

# RabbitMQ Management UI (port-forward)
kubectl -n audio-pipeline port-forward svc/rabbit 15672:15672
# http://localhost:15672  (логин из secret.env)

# Postgres
kubectl -n audio-pipeline exec -it deploy/postgres -- \
  psql -U pipeline -d pipeline -c "SELECT task_id, status, updated_at FROM results ORDER BY updated_at DESC LIMIT 5;"

8. Обновление

После изменения кода:

./k8s/build-images.sh
kubectl -n audio-pipeline rollout restart deploy/watcher deploy/transcribe deploy/tagging deploy/analyse

После смены YANDEX_API_KEY / NEXARA_API_KEY:

./k8s/prepare-secret.sh
kubectl apply -k k8s/
kubectl -n audio-pipeline rollout restart deploy/tagging deploy/analyse

После смены prompts.json:

kubectl apply -k k8s/
kubectl -n audio-pipeline rollout restart deploy/transcribe

9. Удаление

kubectl delete -k k8s/
# данные postgres (PVC) и hostPath останутся — удалите вручную при необходимости

Отличия от Docker Compose

Compose k3s
env_file: .env ConfigMap + Secret
volume ./storage PVC audio-storage (hostPath)
DOTENV_PATH mount для hot-reload переменные из Secret; после смены — rollout restart
docker compose up --build build-images.sh + kubectl apply -k
порты 5672/5432 на хосте только внутри кластера; снаружи — port-forward или Ingress

Опционально: NodePort для RabbitMQ UI

Добавьте в k8s/rabbitmq.yaml в Service:

type: NodePort
# ports:
#   - name: management
#     port: 15672
#     nodePort: 31672

Troubleshooting

Симптом Решение
ImagePullBackOff Запустите ./k8s/build-images.sh или укажите registry
PVC audio-storage Pending Создайте PV hostPath (storage.yaml) и каталог на ноде
watcher не видит файлы Проверьте mount /data/storage и права на hostPath
tagging/analyse YANDEX_API_KEY is required Проверьте secret.env и kubectl apply -k k8s/
postgres CrashLoop Удалите PVC и передеплойте (init.sql только при первом старте)