Ship Keystone auth, multi-service handlers (Yoga→Dalmatian), Compose/Helm packaging, API contract packs, and pytest/Pulumi coverage labs.
7.3 KiB
Language / Язык: English | Русский
Kubernetes / Helm
Развёртывание опубликованного runtime-образа с Docker Hub чартом
helm/openstack-api-simulator.
Образ: inecs/openstack-api-simulator
Чарт зеркалирует Docker Compose:
| Компонент | Роль |
|---|---|
| simulator Deployment | FastAPI-приложение на :8080 |
| api-gateway Deployment | nginx multi-port шлюз OpenStack |
| PostgreSQL StatefulSet | Встроенный Postgres 17 (опционально) |
| migrate initContainer | Идемпотентные миграции схемы |
| seed Job (опционально) | Лабораторные данные minimal или demo |
Требования
- Kubernetes 1.27+ (или аналог)
- Helm 3.14+
- Для Ingress TLS: Ingress NGINX и cert-manager
Пример установки cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.2/cert-manager.yaml
Быстрая установка (Hub release + Ingress + Let's Encrypt)
Из git checkout этого репозитория:
helm upgrade --install os-sim ./helm/openstack-api-simulator \
-n openstack-sim --create-namespace \
-f ./helm/openstack-api-simulator/values-ingress-example.yaml \
--set certManager.email=you@example.com \
--set ingress.hosts[0].host=os-sim.example.com \
--set ingress.tls[0].hosts[0]=os-sim.example.com \
--set secret.ticketSigningKey="$(openssl rand -hex 32)" \
--set postgresql.auth.password="$(openssl rand -hex 16)"
Что происходит:
- Скачивается
inecs/openstack-api-simulator:0.1.0. - Устанавливается PostgreSQL 17 (
postgres:17.5-bookworm). - Выполняются миграции схемы в init-контейнере (идемпотентно).
- Засевается профиль demo (
seed.enabled=true, ~1000 серверов). - Разворачивается nginx api-gateway со стандартными портами OpenStack (5000, 8774, 9696, …).
- Создаются ресурсы
ClusterIssuer(letsencrypt-prod/letsencrypt-staging). - Создаётся Ingress → gateway
:5000(Keystone + Web UI) с TLS.
DNS для os-sim.example.com должен указывать на Ingress controller. Затем:
kubectl -n openstack-sim get certificate,ingress,pods
curl -sS https://os-sim.example.com/health/ready
open https://os-sim.example.com/
Логин по умолчанию: admin / secret (проект demo или admin, домен Default).
Сначала staging (рекомендуется)
helm upgrade --install os-sim ./helm/openstack-api-simulator \
-n openstack-sim --create-namespace \
-f ./helm/openstack-api-simulator/values-ingress-example.yaml \
--set certManager.email=you@example.com \
--set certManager.useStaging=true \
--set ingress.hosts[0].host=os-sim.example.com \
--set ingress.tls[0].hosts[0]=os-sim.example.com \
--set secret.ticketSigningKey="$(openssl rand -hex 32)"
Используйте curl -k против staging CA. Для production переключите certManager.useStaging=false.
Минимальная установка (ClusterIP + port-forward)
helm upgrade --install os-sim ./helm/openstack-api-simulator \
-n openstack-sim --create-namespace \
--set secret.ticketSigningKey="$(openssl rand -hex 32)" \
--set seed.enabled=true \
--set seed.profile=minimal
kubectl -n openstack-sim port-forward \
svc/os-sim-openstack-api-simulator-gateway \
5000:5000 8774:8774 9696:9696 9292:9292 8776:8776
| URL | Сервис |
|---|---|
| http://127.0.0.1:5000/ | Keystone + консоль |
| http://127.0.0.1:8774/v2.1/ | Nova |
| http://127.0.0.1:9696/v2.0/ | Neutron |
Полная матрица портов: ports.md.
Внешний PostgreSQL
helm upgrade --install os-sim ./helm/openstack-api-simulator \
-n openstack-sim --create-namespace \
--set postgresql.enabled=false \
--set secret.ticketSigningKey="$(openssl rand -hex 32)" \
--set secret.databaseUrl='postgresql://user:pass@pg.example.com:5432/openstack_simulator'
Или secret.existingSecret с ключами DATABASE_URL и TICKET_SIGNING_KEY.
Как работает api-gateway
Та же модель, что и в Compose (docker/gateway/openstack-ports.conf):
- Клиент подключается к порту сервиса (например Nova
8774). - nginx выставляет
X-OpenStack-ServiceиX-Forwarded-Port. - FastAPI переписывает путь в
/_os/<service>/…, чтобы/v3(Keystone vs Cinder) не конфликтовал.
Ingress (если включён) обслуживает Keystone/UI на порту 5000. Для Nova/Neutron извне кластера:
kubectl port-forwardдополнительных портов, или- expose
*-gatewayкакLoadBalancer/NodePort(gateway.service.type), или - дополнительные Ingress rules / TCP-сервисы для этих портов.
Как выпускается TLS
При certManager.enabled=true и certManager.createClusterIssuer=true чарт
создаёт ACME ClusterIssuer (HTTP-01). Шаблон Ingress добавляет:
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- secretName: openstack-api-simulator-tls
hosts: [os-sim.example.com]
Чарт не устанавливает cert-manager или Ingress controller.
Эксплуатация
# логи
kubectl -n openstack-sim logs -l app.kubernetes.io/component=simulator -f
kubectl -n openstack-sim logs -l app.kubernetes.io/component=gateway -f
# reseed minimal
kubectl -n openstack-sim exec deploy/os-sim-openstack-api-simulator -- \
python -m app.openstack.seed_cli --profile minimal
# reseed demo cloud
kubectl -n openstack-sim exec deploy/os-sim-openstack-api-simulator -- \
python -m app.openstack.seed_cli --profile demo
# активировать серию OpenStack pack
kubectl -n openstack-sim set env deploy/os-sim-openstack-api-simulator \
OPENSTACK_SERIES=caracal
# затем перезапустить pod / helm upgrade с --set config.openstackSeries=caracal
# удаление
helm -n openstack-sim uninstall os-sim
Справка по values
См. helm/openstack-api-simulator/values.yaml
и README чарта.
Связанные документы:
- Быстрый старт — путь Compose
- Эксплуатация — публикация на Docker Hub / day-2
- Порты — матрица портов OpenStack
- Seed-профили —
minimal/demo - Безопасность — лабораторные учётные данные