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

Быстрый старт: Kubernetes / Helm

Эта инструкция — для администратора, который ставит Portal в кластер Kubernetes через Helm и программу portal-cli из готового архива (bundle).

Читайте сверху вниз. На каждом шаге есть команда и способ проверить успех.

Если ещё не уверены, что нужен Kubernetes — сначала выберите канал. Для одного сервера чаще проще Docker.


После всех шагов:

  1. В namespace portal работают поды API, Worker, Frontend, БД, кэш, хранилище, Portal Office.
  2. Через Ingress открывается сайт Portal (и Office).
  3. Есть пользователь admin с паролем, который установщик печатает в конце (и сохраняет в секретах).
  4. На корневом узле доступна страница welcome.

ЧтоМинимумЗачем
Кластер Kubernetesверсия 1.28+куда ставим
Helm3.12+установка chart
kubectlс доступом к кластерукоманды kubectl …
Ingress Controllerрекомендуется nginx-ingressвход снаружи на HTTP/HTTPS
StorageClassдля PVCдиски PostgreSQL, Valkey (Redis), SeaweedFS
Память кластера8 GB RAM минимум для пилотаиначе поды не встанут
Образы Portalв registry кластера или загружены на нодысм. §3 и air-gapped
Архивportal-1.0.0-k8s-bundle.tar.gz (версия может отличаться)от поставщика
Окно терминала
kubectl version --client
helm version
kubectl get nodes

Как проверить успех:

  • kubectl и helm печатают версии;
  • kubectl get nodes показывает хотя бы одну ноду в статусе Ready.

Если nodes пустой или Forbidden — нет доступа к кластеру: исправьте kubeconfig и повторите.


Portal нужен Ingress, чтобы браузер попадал на Frontend и Office.

Проверка:

Окно терминала
kubectl get pods -A | grep -i ingress

Если Ingress уже есть — пропустите этот шаг.

Если нет — пример установки nginx-ingress:

Окно терминала
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx -n ingress --create-namespace

Как проверить:

Окно терминала
kubectl get pods -n ingress
kubectl get svc -n ingress

Поды контроллера должны быть Running. Запомните внешний IP / LoadBalancer — на него потом укажет DNS.


Bundle — архив с chart, образами, portal-cli и документацией.

Окно терминала
cd /opt
tar xzf portal-1.0.0-k8s-bundle.tar.gz
cd portal-1.0.0-k8s-bundle
pwd
ls -la
chmod +x portal-cli/portal-cli

Что должны увидеть: каталоги portal-cli/, images/, helm/ (или путь к chart в поставке).

Загрузка образов на машину, где есть Docker (часто bastion / jump-хост):

Окно терминала
docker load -i images/portal-images.tar
docker images | grep portal

Если в кластере private registry — после docker load сделайте retag и docker push для образов portal/* в ваш registry (как принято у вас). Без доступных образов поды останутся в ImagePullBackOff.

Как проверить: docker images | grep portal не пустой; в кластере после установки поды не в ErrImagePull.


Все команды — из корня распакованного k8s-bundle, с рабочим kubectl на нужный контекст:

Окно терминала
./portal-cli/portal-cli install --mode k8s

Включает PgBouncer и 2 реплики API/Worker:

Окно терминала
./portal-cli/portal-cli install --mode k8s --prod
  1. Создаёт namespace portal.
  2. Поднимает PostgreSQL, Valkey (Redis), SeaweedFS (StatefulSet + PVC).
  3. Запускает Job db-init: SQL-миграции, seed (admin, системные узлы, страница welcome), bucket S3.
  4. Запускает API, Worker, Frontend, Portal Office.
  5. Создаёт Ingress для портала и Portal Office.

В конце portal-cli печатает логин и пароль администратора. Их же показывают заметки Helm:

Окно терминала
helm get notes portal -n portal

Как проверить успех — §5 и §6. Не закрывайте терминал, пока не сохраните пароль.


Логин по умолчанию: admin (или значение seed.adminLogin в values).

Пароль:

  • выводится при установке;
  • лежит в сгенерированном файле portal-values.generated.yaml (поле secrets.seedAdminPassword);
  • либо в секрете Kubernetes:
Окно терминала
kubectl get secret portal-secrets -n portal \
-o jsonpath='{.data.seed-admin-password}' | base64 -d; echo

Как проверить: команда печатает строку пароля и перевод строки. Сохраните пароль в сейф организации.

Адрес: http://<ingress.host>
По умолчанию часто http://portal.local — добавьте имя в DNS или в /etc/hosts на своём ПК (см. §10).


Окно терминала
./portal-cli/portal-cli status --mode k8s
Окно терминала
kubectl get pods -n portal

Ожидание: основные поды в Running (Job db-init может быть Completed — это нормально).

Если CrashLoopBackOff / Pending:

Окно терминала
kubectl describe pod -n portal ИМЯ_ПОДА
kubectl logs -n portal ИМЯ_ПОДА --tail=80
kubectl logs -n portal job/portal-db-init

Если Ingress уже резолвится с вашей машины:

Окно терминала
curl -sS http://portal.local/api/v1/system/version

Подставьте свой host. Если DNS ещё нет — временный доступ через port-forward:

Окно терминала
kubectl port-forward -n portal svc/portal-frontend 8080:80

В другом терминале:

Окно терминала
curl -sS http://localhost:8080/api/v1/system/version

В браузере: http://localhost:8080 (пока открыт port-forward).

Успех: JSON с версией; вход под admin работает.


Без LICENSE.key запись в Portal ограничена. Ключ — у поставщика (в т.ч. trial 30 дней). Канал в ключе должен быть k8s.

  1. Войдите как admin → Админка → Настройки → Продукт и лицензия.
  2. Передайте поставщику Привязку.
  3. Активируйте полученный LICENSE.key.

Или с jump-хоста (из каталога bundle):

Окно терминала
./portal-cli/portal-cli license activate --file LICENSE.key
./portal-cli/portal-cli upgrade --mode k8s

Подробнее: Лицензии и тарифы.


Окно терминала
./portal-cli/portal-cli upgrade --mode k8s

При upgrade Job db-init применяет миграции (при необходимости Job пересоздают; либо helm upgrade — как описано в полной инструкции).

  1. На jump-хосте с тем же kubeconfig запустите:
Окно терминала
./portal-cli/portal-cli update-runner --mode k8s

Оставьте процесс запущенным (Online).

  1. В админке: Настройки → Продукт и лицензия → Обновить.

Полная инструкция: Обновление Portal.

Проверка после обновления:

Окно терминала
./portal-cli/portal-cli status --mode k8s
kubectl get pods -n portal
curl -sS http://portal.local/api/v1/system/version

ФайлНазначение
helm/portal/values.yamlЗначения chart по умолчанию
portal-values.generated.yamlСекреты и параметры, которые сгенерировал portal-cli (пароли и т.п.)

Редактор на jump-хосте — снова nano (сохранение Ctrl+O, выход Ctrl+X):

Окно терминала
nano portal-values.generated.yaml
ingress:
host: portal.company.ru
tls:
enabled: true
secretName: portal-tls
backend:
replicas: 3
pgbouncer:
enabled: true
postgresql:
enabled: true # false + host — если внешняя БД
storage: 100Gi # обязателен при enabled: true
seaweedfs:
enabled: true # false + s3.endpoint — внешнее хранилище
storage: 500Gi # обязателен при enabled: true

Размер PVC не зашит навсегда в chart — задайте под ваш StorageClass и объём документов. Redis по умолчанию использует 1Gi (redis.storage).

При установке через portal-cli размеры PVC часто подставляются автоматически (100Gi / 500Gi). Переопределение:

  • переменные окружения PORTAL_PG_STORAGE и PORTAL_S3_STORAGE;
  • или явно в portal-values.generated.yaml.

Для загрузки файлов до 4 ГБ в values уже задано
nginx.ingress.kubernetes.io/proxy-body-size: "4096m".

seaweedfs:
enabled: false
s3:
endpoint: s3.corp.local
port: 443
useSsl: true
accessKey: portal-rw
bucket: portal-files
secrets:
s3SecretKey: "..."

Подробнее: Внешние сервисы.

Окно терминала
helm upgrade --install portal ./deploy/helm/portal \
-n portal --create-namespace \
-f portal-values.generated.yaml \
--set postgresql.storage=100Gi \
--set seaweedfs.storage=500Gi

Путь к chart в готовом client-bundle может называться иначе (смотрите ls helm/ в вашем архиве). В исходниках репозитория chart лежит в deploy/helm/portal. Главное — указать каталог chart из вашей поставки и актуальный -f с секретами.


Добавьте записи на IP Ingress:

ИмяКуда
portal.company.ruIP Ingress
office.company.ruтот же IP (если так задано в values)

Для пилота на своём компьютере можно временно прописать в /etc/hosts:

127.0.0.1 portal.local office.portal.local

(Если Ingress не на localhost — поставьте реальный IP сервиса Ingress вместо 127.0.0.1.)

Узнать внешний адрес контроллера:

Окно терминала
kubectl get svc -n ingress
# или: kubectl get ingress -n portal

Как проверить: с вашего ПК ping/curl до имени хоста доходит; в браузере открывается логин Portal.


В поставке обычно так:

helm/portal/
Chart.yaml
values.yaml
templates/
backend.yaml, worker.yaml, frontend.yaml
postgresql.yaml, redis.yaml, seaweedfs.yaml
db-init-job.yaml
ingress.yaml

Это справочно: править шаблоны вручную не нужно для типовой установки.


Как в Docker: пакеты ставятся hot deploy без обязательного рестарта подов. Штатные образы без отладчика в контейнере — брейкпоинты из IDE к Api/Worker не входят в поставку. Диагностика: kubectl logs. См. Отладка расширений.


Что видитеЧто сделать
ImagePullBackOffОбразы не в registry / на ноде — §3 (load, retag, push)
PVC PendingНет StorageClass или мало места — проверьте kubectl get sc и размеры storage
Ingress 404 / не открываетсяHost в values ≠ DNS; нет Ingress Controller — §2 и §10
Job db-init Failedkubectl logs -n portal job/portal-db-init
Не знаете пароль adminКоманда с seed-admin-password в §5
Нельзя сохранять в UIАктивируйте лицензию канала k8s — §7

Общее: Устранение неполадок.