feb32e1285
Disable ingress-nginx intercept for 404/405 on all lab Ingresses and document how to verify JSON/XML responses after upgrade.
171 lines
6.7 KiB
Markdown
171 lines
6.7 KiB
Markdown
**Language / Язык:** [English](README.md) | [Русский](README.ru.md)
|
||
|
||
# Лаборатория API-симуляторов (автономная)
|
||
|
||
Четыре опубликованных симулятора и один PostgreSQL. Исходники репозиториев не нужны.
|
||
Локально — Docker Compose; в Kubernetes — Helm-чарт.
|
||
|
||
## Структура
|
||
|
||
```
|
||
simulators/
|
||
Makefile
|
||
docker-compose.yml
|
||
docker/
|
||
postgres-init/01-simulators.sql
|
||
tls/server.{crt,key} # общие lab TLS для Compose gateway
|
||
ovirt/ovirt-engine.conf
|
||
vmware/vmware-ports.conf
|
||
openstack/openstack-ports.conf
|
||
charts/api-simulators-lab/ # Helm: все четыре симулятора + Ingress
|
||
```
|
||
|
||
Образы: `inecs/proxmox-api-simulator`, `inecs/ovirt-api-simulator`,
|
||
`inecs/vmware-api-simulator`, `inecs/openstack-api-simulator`.
|
||
|
||
---
|
||
|
||
## Docker Compose
|
||
|
||
Данные Postgres — в Compose volume `postgres-data`.
|
||
|
||
```bash
|
||
cd /Users/inecs/Разработка/simulators
|
||
make help
|
||
make up # pull → migrate → apps → seed; печатает URL
|
||
make urls # снова вывести Compose-эндпоинты
|
||
make logs # или: make logs SERVICE=proxmox
|
||
make restart
|
||
make down # остановить контейнеры, volume БД сохранить
|
||
make clean # остановить + удалить volumes, мусор и сети проекта
|
||
make shell # или: make shell SERVICE=ovirt
|
||
make push # git add . → многострочный commit (Ctrl-D) → push origin
|
||
```
|
||
|
||
`make up` гоняет migrate/seed через `docker compose run --rm` (profile `init`),
|
||
поэтому эти контейнеры не остаются в статусе `Exited`.
|
||
|
||
Эквивалент через Compose:
|
||
|
||
```bash
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
При первом старте БД создаются из `docker/postgres-init` (только на пустом
|
||
volume `postgres-data`). Seed выполняется один раз после готовности каждого симулятора.
|
||
|
||
Закрепить тег образа:
|
||
|
||
```bash
|
||
IMAGE_TAG=0.1.0 docker compose up -d
|
||
# или: IMAGE_TAG=0.1.0 make up
|
||
```
|
||
|
||
### Compose-эндпоинты
|
||
|
||
| Симулятор | URL |
|
||
|---|---|
|
||
| Proxmox | http://localhost:8006/ |
|
||
| oVirt Engine | https://localhost:7443/ |
|
||
| oVirt Web UI | http://localhost:7500/ |
|
||
| VMware (HTTPS) | https://localhost:8443/ |
|
||
| VMware (HTTP) | http://localhost:8081/ |
|
||
| OpenStack Keystone | http://localhost:9500/ |
|
||
| OpenStack Nova | http://localhost:8774/ |
|
||
| OpenStack HTTPS | https://localhost:9443/ |
|
||
| PostgreSQL | `127.0.0.1:5432` (пользователь `lab` / `lab`) |
|
||
|
||
### Сброс БД Compose
|
||
|
||
```bash
|
||
make clean
|
||
make up
|
||
# или: docker compose down -v && docker compose up -d
|
||
```
|
||
|
||
---
|
||
|
||
## Kubernetes (Helm)
|
||
|
||
Чарт: `charts/api-simulators-lab`.
|
||
|
||
Перед деплоем настройте: `charts/api-simulators-lab/values.yaml`
|
||
|
||
| Ключ | Назначение |
|
||
|---|---|
|
||
| `namespace` | Целевой namespace (`simulators` по умолчанию; `namespaceCreate: true`) |
|
||
| `ingresses` | Хосты, TLS secrets, annotations (по одному Ingress на запись) |
|
||
| `certManager` | Let's Encrypt через cert-manager (`letsencrypt-prod`) |
|
||
| `imageTag` / секреты / `postgres.persistence` | Образы, ключи, PVC |
|
||
|
||
Хосты Ingress по умолчанию (для Let's Encrypt замените на публичный DNS):
|
||
|
||
| Симулятор | Host |
|
||
|---|---|
|
||
| Proxmox | https://proxmox.lab.local/ |
|
||
| oVirt | https://ovirt.lab.local/ |
|
||
| VMware | https://vmware.lab.local/ |
|
||
| OpenStack | https://openstack.lab.local/ |
|
||
|
||
```bash
|
||
make helm up # предупреждение → подтверждение [y/N] → helm upgrade --install
|
||
make helm down # uninstall релиза
|
||
make helm-urls # хосты Ingress из values
|
||
make helm-template
|
||
make helm-lint
|
||
```
|
||
|
||
Без подтверждения (CI): `make helm-up HELM_YES=1`
|
||
|
||
Сменить namespace без правки файла: `HELM_NAMESPACE=other make helm-up`
|
||
|
||
Эквивалент Helm:
|
||
|
||
```bash
|
||
helm upgrade --install simulators charts/api-simulators-lab \
|
||
--namespace simulators --create-namespace --wait
|
||
```
|
||
|
||
### Как стартует чарт
|
||
|
||
1. **Namespace** — создаётся из `values.namespace`, если `namespaceCreate: true`.
|
||
2. **PostgreSQL** — StatefulSet + init SQL на четыре БД симуляторов.
|
||
3. **Симуляторы** — Deployments с init-контейнерами:
|
||
- `wait-postgres` → `migrate` (идемпотентно; ничего не делает, если схема уже актуальна).
|
||
4. **Seed** — Jobs post-install / post-upgrade на каждый симулятор.
|
||
- Job ждёт ready приложения, затем сидирует.
|
||
- `seed.skipIfSql` пропускает seed, если в БД уже есть лабораторные данные.
|
||
5. **Ingress** — TLS через аннотацию cert-manager `cert-manager.io/cluster-issuer`.
|
||
- `certManager.createClusterIssuer: true` и `certManager.email` — создать
|
||
ClusterIssuer из чарта; иначе ожидается уже существующий `letsencrypt-prod`.
|
||
- Let's Encrypt HTTP-01 требует **публичный DNS** на Ingress-контроллер
|
||
(не `*.lab.local`).
|
||
- На каждом Ingress стоят `proxy-intercept-errors: "false"` и
|
||
`custom-http-errors: "502,503"`, чтобы кластерный брендированный HTML
|
||
(например «DevOps спит») не подменял JSON/XML симулятора на 404/405/401.
|
||
**Не** добавляйте 404/405 в `custom-http-errors`. После `helm upgrade`
|
||
проверьте: `curl -sH 'Accept: application/json' https://<host>/…` —
|
||
ожидайте тело ошибки API, не HTML. Если HTML остаётся — править
|
||
controller-level `custom-http-errors` у ingress-nginx (вне этого чарта).
|
||
|
||
---
|
||
|
||
## Git
|
||
|
||
`origin` пушит в оба remote (как у остальных симуляторов):
|
||
|
||
- `git@github.com:sergeyantropoff/simulators.git`
|
||
- `ssh://git@git.antropoff.ru:30022/DevOpsTools/Simulators.git`
|
||
|
||
```bash
|
||
make push # stage all → многострочное сообщение (конец — Ctrl-D) → push origin
|
||
```
|
||
|
||
Тот же UX, что в `proxmox_api_simulator`.
|
||
|
||
---
|
||
|
||
Только лабораторные defaults — не выставляйте стек в публичный Интернет без смены
|
||
секретов (`ticketSigningKey`, пароли БД, хосты Ingress).
|