Перейти к основному содержимому

Установка в 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:

  1. images: указывает образы mpbx, mpbx-media и mpbx-rtpengine вашего релиза. В производстве используйте digest: sha256:... вместо newTag.
  2. MPBX_PUBLIC_URL= в configMapGenerator — адрес веб-клиента. Он используется для ссылки настройки первого администратора.
  3. 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/tcpSIP. По возможности ограничьте доступ вашими транками и площадками.
Медиаузел (брандмауэр облака)40000-50000/udpRTP.

Никогда не открывайте 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 могут остаться; удаляйте их только после проверки резервной копии.