Compare commits

...
4 Commits
3 changed files with 106 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
# LoadTest — Flask-сервис проверки загрузки файлов/сообщений.
# Образ: naeel/loadtest (Docker Hub, публичный — требование платформы Nubes).
#
# Деплой через «Простой HTTP контейнер»:
# - путь до образа: naeel/loadtest:<tag>
# - порт берётся из EXPOSE (ровно один) — 5000
# - переменные пода (env) — задаются в ЛК при создании (если нужны)
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY site /app/site
EXPOSE 5000
# gunicorn вместо dev-сервера Flask:
# --timeout 300 — чтобы платформа/шлюз не резали долгие POST
# --workers 1 — однорепликовый тест-сервис, больше не нужно
# ВАЖНО: --chdir /app/site + app:app (НЕ site.app:app!) — папка site
# конфликтует со stdlib-модулем Python site.py (автозагружается при старте),
# поэтому import site.app всегда падает с ModuleNotFoundError.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--chdir", "/app/site", "--timeout", "300", "--workers", "1", "app:app"]
+42
View File
@@ -0,0 +1,42 @@
# 2026-08-21 — LoadTest: сборка Docker-образа для «Простой HTTP контейнер»
_Дата: 2026-08-21. Ветка: master. Состояние Flask сохранено в ветке `flask-state` (запушена)._
## Задача
Перевести loadtest с managed-Flask (gitPath, без аннотаций) на «Простой HTTP контейнер»:
образ + переменные пода + аннотации к Ingress (раньше правили кубером на своём кластере).
## Что сделано
1. Ветка `flask-state` — сохранение состояния Flask (запушена в origin).
2. `Dockerfile` в loadtest (master):
- `python:3.12-slim`, WORKDIR /app, requirements.txt, COPY site/, EXPOSE 5000
- CMD gunicorn `--timeout 300 --workers 1 site.app:app`
- Один EXPOSE (5000) — требование платформы (порт берётся из EXPOSE).
3. Сборка на ВМ (SSH remote-dev, docker 29.1.3): `docker build -t naeel/loadtest:v2.0.0`
- Контекст: `/home/naeel/loadtest-build` (rsync из локального loadtest).
- Логин Docker Hub на ВМ уже есть (`naeel`).
4. Push: `naeel/loadtest:v2.0.0` — digest `sha256:432a8742...`, linux/amd64, ~50MB, публичный.
## Данные для формы «Простой HTTP контейнер»
- **Путь до образа:** `naeel/loadtest:v2.0.0`
- **Переменные пода:** `{}` (секретов/окружения нет)
- **Дополнительные аннотации к Ingress** (JSON):
```json
{
"nginx.ingress.kubernetes.io/proxy-body-size": "1024m",
"nginx.ingress.kubernetes.io/proxy-connect-timeout": "120",
"nginx.ingress.kubernetes.io/proxy-read-timeout": "600",
"nginx.ingress.kubernetes.io/proxy-send-timeout": "600",
"nginx.ingress.kubernetes.io/proxy-request-buffering": "false"
}
```
## Почему эти аннотации
Взяты из правок, которые раньше делали кубером на iot-naeel (см. History drhider):
- `proxy-body-size 1024m` — лимит тела (на общем кластере >64КБ обрывало: HTTP 000 ~10с).
- `connect/read/send-timeout 120/600/600` — таймауты (drhider ingress те же значения).
- `proxy-request-buffering false` — отключение буферизации тела (план, не выполненный на iot-naeel).
## Обновление образа
Только пересоздание контейнера с новым тегом (`latest` кэшируется зеркалом платформы).
В своём кластере — `kubectl -n <ns> set image deployment/containerk8s app=naeel/loadtest:<tag>`.
+37
View File
@@ -0,0 +1,37 @@
# 2026-08-21 — LoadTest: фикс gunicorn (site.app → --chdir /app/site app:app), v2.0.1
_Дата: 2026-08-21. Ветка: master. Инстанс: http-12.containerk8s.dev.nubes.ru (503)._
## Симптом
Инстанс отдавал 503 на всех путях (ingress nginx отвечал, бэкенд недоступен).
Локальный прогон образа на ВМ показал падение gunicorn:
```
ModuleNotFoundError: No module named 'site.app'; 'site' is not a package
```
## Причина
Папка `site/` в проекте конфликтует со **стандартным модулем Python `site.py`**
(автоматически импортируется интерпретатором при старте). `import site.app` всегда
резолвится в stdlib-`site` → ModuleNotFoundError → worker падает → под не Ready → 503.
На managed-Flask работало, потому что платформа запускала ФАЙЛ `python site/app.py`,
а не импорт пакета `site.app`.
## Фикс
`Dockerfile` CMD:
```
gunicorn --bind 0.0.0.0:5000 --chdir /app/site --timeout 300 --workers 1 app:app
```
- `--chdir /app/site` + импорт `app:app` (без пути через `site`) — stdlib-`site` не мешает.
- Проверено на ВМ: `docker run naeel/loadtest:v2.0.1` → `/health` = `ok v2.0.0`, HTTP 200.
## Образ
- `naeel/loadtest:v2.0.1` — digest `sha256:9ad5cd52...`, запушен в Docker Hub.
- В ЛК редеплой с путём `naeel/loadtest:v2.0.1` (новый тег — старый v2.0.0 мог кэшироваться зеркалом).
## Кластеры (наблюдения 2026-08-21)
- `k8s-3-sandbox-nubes-ru` — НЕ запускается вообще (баги платформы: script returned exit code 1,
No such property: name for class: Script2, поды не работают).
- `k8s-4-sandbox-nubes-ru` — запустилось, но ТОЛЬКО с одной аннотацией:
`nginx.ingress.kubernetes.io/proxy-body-size: 1024m`.
Добавление других аннотаций (таймауты/request-buffering) → падение скрипта платформы
(поле `ingress_annotations` «поддерживает пока простые аннотации»).