Установка в Kubernetes (Kustomize)
Набор для Kubernetes — это простые манифесты с Kustomize, которые применяются командой kubectl apply -k. Helm-чарта нет. Набор находится в каталоге deploy/k8s репозитория. Используйте его, если у вас уже работает кластер; для одного сервера без кластера используйте установщик для ВМ или набор Docker Compose.
:::info Статус
Манифесты проверены статически и в локальном кластере kind. Медиатракт (SIP и RTP через реальный брандмауэр облака и NAT) пока не проверен в интернете. Прочитайте ограничения в deploy/k8s/README.md, прежде чем подключать к нему живые транки.
:::
Требования
- Kubernetes 1.30 или новее с StorageClass по умолчанию (три тома ReadWriteOnce для встроенных баз данных).
- CNI, который применяет NetworkPolicy (Calico, Cilium, GKE Dataplane V2). Без него политики принимаются, но игнорируются.
- Хотя бы один медиаузел: узел с публичным адресом (или 1:1 NAT), который вы помечаете
mpbx.io/media=true. SIP и RTP работают на нём в сетевом режиме хоста. kubectlиkustomize(илиkubectlсо встроенным Kustomize).- Собственные образы контейнеров одного релиза, закреплённые по digest для производства.
Установка
Сначала задайте три значения, которые нужны оверлею. В файле оверлея те же три места отмечены как 1., 2. и 3..
export MEDIA_NODE="${MEDIA_NODE:?set to the name of the media node}"
export MEDIA_NODE_IP="${MEDIA_NODE_IP:?set to the internal IP of the media node}"
export MPBX_PUBLIC_URL="${MPBX_PUBLIC_URL:?set to the https URL users open, for example https://pbx.example.com}"
Затем отредактируйте deploy/k8s/overlays/small/kustomization.yaml:
images:указывает образыmpbx,mpbx-mediaиmpbx-rtpengineвашего релиза. В производстве используйтеdigest: sha256:...вместоnewTag.MPBX_PUBLIC_URL=вconfigMapGenerator— адрес веб-клиента. Он используется для ссылки настройки первого администратора.db-from-media-nodesсодержит внутренний адрес медиаузла в виде/32.
Примените набор:
set -eu
: "${MEDIA_NODE:?set MEDIA_NODE to the media node name}"
: "${MPBX_PUBLIC_URL:?set MPBX_PUBLIC_URL}"
kubectl label node "$MEDIA_NODE" mpbx.io/media=true --overwrite
kubectl apply -k deploy/k8s/overlays/small
kubectl -n mpbx wait --for=condition=complete job/mpbx-init --timeout=5m
Прочитайте ключ восстановления и ссылку настройки первого администратора. Они показываются один раз:
set -eu
kubectl -n mpbx logs job/mpbx-init
kubectl -n mpbx delete job mpbx-init
Запишите ключ восстановления в менеджер паролей или на бумаге. Он нигде не хранится в кластере. Без него утерянный Secret означает потерю паролей транков, ключей API и зашифрованных записей. Сохраните Secret mpbx/mpbx-secrets вместе с резервными копиями кластера и создавайте зашифрованные парольной фразой резервные копии АТС, как описано в Резервное копирование и восстановление. Эти резервные копии включают мастер-ключ.
Откройте ссылку настройки и продолжите по шагам первого запуска.
API и поды SIP обычно перезапускаются один-два раза при первой установке, пока запускается Postgres. Это ожидаемо.
Проверка установки
set -eu
kubectl -n mpbx get pods
kubectl -n mpbx rollout status deploy/mpbx-api --timeout=5m
kubectl -n mpbx port-forward svc/mpbx-api 8080:80 >/dev/null 2>&1 &
pf=$!
trap 'kill "$pf" 2>/dev/null || true' EXIT
sleep 3
curl -fsS http://127.0.0.1:8080/api/v1/version
API отвечает только после выполнения миграций базы данных. Эндпоинт проверки работоспособности /healthz находится на порту метрик (9464), а не на порту API.
Повторное применение и обновление
Команду kubectl apply -k можно запускать повторно в любое время. Задание init создаёт Secret, только если его нет, поэтому повторное применение никогда не меняет ключи. Шаблон пода задания неизменяем: если mpbx-init всё ещё существует, когда вы меняете образ, сначала удалите его (kubectl -n mpbx delete job mpbx-init).
Обновление и откат описаны в скриптах deploy/k8s/ops/upgrade и scripts/upgrade.sh. Сначала запустите --dry-run. См. Обновление и откат.
Порты и брандмауэр
| Где | Порт | Зачем |
|---|---|---|
| Ingress или балансировщик нагрузки | 443/tcp | Веб-клиент, API, WebSocket. Необязательный компонент Ingress (deploy/k8s/components/ingress) обслуживает их. |
| Медиаузел (брандмауэр облака) | 5060/udp и 5060/tcp | SIP. По возможности ограничьте доступ вашими транками и площадками. |
| Медиаузел (брандмауэр облака) | 40000-50000/udp | RTP. |
Никогда не открывайте 5432, 6379, 8123, 9000 или 22222 (управляющий порт rtpengine не имеет аутентификации). Набор не создаёт для них публичных Service.
Пробный запуск без кластера
Чтобы проверить манифесты без кластера, соберите оверлей:
set -eu
kustomize build deploy/k8s/overlays/small >/dev/null
echo "overlay renders"
deploy/k8s/scripts/validate.sh прогоняет каждый оверлей через kubeconform и проверки инвариантов манифестов (не root, файловая система только для чтения, исключения Pod Security).
Удаление
kubectl delete -k deploy/k8s/overlays/small
Эта команда удаляет рабочие нагрузки. Постоянные тома и Secret могут остаться; удаляйте их только после проверки резервной копии.