Инструкция Kubernetes
Требования к окружению
- PostgreSQL 14+
- RabbitMQ 3.11+
- Redis 7+
- Meilisearch 1.8+
- Weaviate 1.25+
- MinIO 2023-10+
- SMTP-сервер
Опционально:
- Установленная на GPU-кластере LLM с API совместимым с OpenAI / ключ OpenAI / ключ Yandex Cloud Foundation Models (для суммаризации и других AI-функций)
- Установленный на GPU-кластере Whisper / ключ Yandex Foundation Models (для speech-to-text)
Все компоненты окружения могут быть размещены как в кластере так и вне его.
Требования к инструментарию
- ArgoCD 2.10+
Подготовка
PostgreSQL:
Создайте базу данных yuchat_db
.
Создайте схему yuchat
.
Создайте пользователя (ТУЗ) с правами read/write
на эту базу данных и схему.
CREATE DATABASE yuchat_db;
RabbitMQ:
Создайте пользователя (ТУЗ) с правами configure/read/write
на виртуальный хост /
.
MinIO:
Создайте пользователя (ТУЗ) с правами на создание бакетов.
Настройте amqp нотификации с параметрами:
MINIO_NOTIFY_AMQP_ENABLE_PRIMARY: "on"
MINIO_NOTIFY_AMQP_URL_PRIMARY: "amqp://username:password@rabbitmq_host:5672"
MINIO_NOTIFY_AMQP_EXCHANGE_PRIMARY: "yuchat.aws.file.events.ex"
MINIO_NOTIFY_AMQP_EXCHANGE_TYPE_PRIMARY: "fanout"
MINIO_NOTIFY_AMQP_ROUTING_KEY_PRIMARY: "#"
MINIO_NOTIFY_AMQP_DURABLE_PRIMARY: "true"
MINIO_NOTIFY_AMQP_AUTO_DELETED_PRIMARY: "false"
На Minio должен быть настроен https!
Redis:
Создайте пользователя (ТУЗ).
Для Redis можно использовать стандартного пользователя, поскольку Redis обычно не использует отдельных учетных записей пользователей.
SMTP сервер:
Установите и настройте SMTP сервер для отправки почты (например, для подтверждения регистрации пользователей).
Убедитесь, что SMTP сервер доступен и настроен с параметрами SMTP_HOST
, SMTP_PORT
, SMTP_USERNAME
, SMTP_PASSWORD
.
Публичный IP адрес:
Подготовьте публичный IP адрес с портом 3478
, на который будет создан gateway для обеспечения связи с STUN/TURN серверами.
Создание домена для Yuchat:
Зарегистрируйте домен, на котором будет развернут Yuchat.
Например: yuchat.yourdomain.com
.
Установка
1. Создайте namespace yuchat:
kubectl create namespace yuchat
2. Создайте секрет с TLS сертификатом для домена и субдоменов:
Генерация и установка секрета:
kubectl create secret tls yuchat-tls --cert=/path/to/tls.crt --key=/path/to/tls.key -n yuchat
3. Создайте секрет с типом docker-registry для доступа к репозиторию с образами:
kubectl create secret docker-registry yuchat-regcred \\
--docker-server=https://registry.unison.team \\
--docker-username= <обратитесь к поставщику за учетными данными> \\
--docker-password= <обратитесь к поставщику за учетными данными> \\
-n yuchat
4. Создайте StorageClass:
Пример YAML для StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: yuchat-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
5. Настройка доступа в ArgoCD до репозитория с чартами:
В ArgoCD добавьте репозиторий:
argocd repo add <https://registry.unison.team/yuchatcharts> \\
--username <обратитесь к поставщику за учетными данными> \\
--password <об ратитесь к поставщику за учетными данными>
6. Создайте секреты для RabbitMQ, Redis, MinIO, PostgreSQL, SMTP и Stunner:
Redis:
kubectl create secret generic redis-creds-secret \\
--from-literal=REDIS_HOST=redis.yuchat.yourdomain.com \\
--from-literal=REDIS_PASSWORD=your_password \\
--from-literal=REDIS_PORT=6379 \\
-n yuchat
RabbitMQ:
kubectl create secret generic rabbitmq-creds-secret \\
--from-literal=RABBITMQ_URI=amqp://rabbitmq.yuchat.yourdomain.com:5672 \\
--from-literal=RABBITMQ_USERNAME=yuchat_user \\
--from-literal=RABBITMQ_PASSWORD=your_password \\
--from-literal=RABBITMQ_HOST=rabbitmq.yuchat.yourdomain.com \\
--from-literal=RABBITMQ_VHOST=\ \\
-n yuchat
MinIO:
kubectl create secret generic minio-creds-secret \\
--from-literal=CLOUD_ACCESS_KEY=your_access_key \\
--from-literal=CLOUD_SECRET_KEY=your_secret_key \\
--from-literal=S3_URL=https://minio.yuchat.yourdomain.com \\
--from-literal=S3_DOMAIN=minio.yuchat.yourdomain.com \\
-n yuchat
PostgreSQL:
kubectl create secret generic postgresql-creds-secret \\
--from-literal=DATASOURCE_USERNAME=yuchat_user \\
--from-literal=DATASOURCE_URL=jdbc:postgresql://postgres.yuchat.yourdomain.com:5432/yuchat_db \\
--from-literal=DATASOURCE_PASSWORD=your_password \\
--from-literal=DATASOURCE_SCHEMA=yuchat \\
-n yuchat
SMTP сервер:
Если отсутствуют username и password от сервера, установите SMTP_USERNAME и SMTP_PASSWORD в "".
kubectl create secret generic smtp-creds-secret \\
--from-literal=MAIL_SMTP_HOST=smtp.yourdomain.com \\
--from-literal=MAIL_SMTP_PORT=25 \\
--from-literal=MAIL_SMTP_USERNAME=smtp_user \\
--from-literal=MAIL_SMTP_PASSWORD=smtp_password \\
-n yuchat
Stunner:
kubectl create secret generic stunner-creds-secret \\
--from-literal=STUNNER_USERNAME=stunner_user \\
--from-literal=STUNNER_PASSWORD=stunner_password \\
--from-literal=STUNNER_PORT=3478 \\
--from-literal=STUNNER_HOST=<public_ip> \\
-n yuchat
7. Создайте секрет с переменными для backend сервисов:
kubectl create secret generic backend-secret \\
--from-literal=JWT_SHARED_SECRET=<random_string_256_bits> \\
--from-literal=MEILISEARCH_MASTER_KEY=<random_string> \\
-n yuchat
Подготовка HelmCharts
Для успешного развертывания всех сервисов в Kubernetes кластере через ArgoCD необходимо подготовить и настроить Helm Charts для каждого сервиса.
Для каждого сервиса создайте отдельный ArgoCD Application, кот орый будет управлять его развертыванием. Для всех сервисов настройте values.yaml, необходимо указать следующие параметры:
-
Репозитории с образами: Укажите URL-адрес репозитория Docker образов для сервиса.
-
PullSecret: Настройте секрет для доступа к приватным репозиториям с Docker образами. Укажите его в поле imagePullSecrets.
-
Ингресс: Настройте доступ к сервисам через Ingress, используя заранее созданный домен. Укажите все необходимые правила и аннотации.
-
StorageClass: Укажите класс хранилища для Persistent Volume, если сервис требует использования хранилища.
-
Селекторы и толерации: Если требуется, укажите селекторы и толерации для подов, чтобы они размещались на узлах с определёнными характеристиками.
-
Настройка секретов: В values-файлах укажите ссылки на существующие Kubernetes секреты, которые содержат критические данные для сервисов, такие как логины и пароли. Пример:
env:
secret:
postgresql-creds-secret:
- DATASOURCE_USERNAME
- DATASOURCE_URL
- DATASOURCE_PASSWORD
- DATASOURCE_SCHEMA
rabbitmq-creds-secret:
- RABBITMQ_URI
- RABBITMQ_USERNAME
- RABBITMQ_PASSWORD
Порядок установки сервисов
- Meilisearch: укажите название секрета backend-secret для параметра existingMasterKeySecret:
auth:
# Use an existing Kubernetes secret for the MEILI_MASTER_KEY
existingMasterKeySecret: "backend-secret"
-
STUNner Gateway Operator:
-
После деплоя applications в Арго создайте CRD для Gateway, GatewayClass, GatewayConfig и UDPRoute.
-
Пример конфигурации CRD:
-
Gateway:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
annotations:
stunner.l7mp.io/service-type: LoadBalancer
name: udp-gateway
namespace: yuchat
spec:
addresses:
- type: IPAddress
value: <Ваш IP>
gatewayClassName: stunner-gatewayclass
listeners:
- allowedRoutes:
namespaces:
from: Same
name: udp-listener
port: 3478
protocol: UDP
GatewayClass:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: stunner-gatewayclass
spec:
parametersRef:
group: stunner.l7mp.io
kind: GatewayConfig
name: stunner-gatewayconfig
namespace: yuchat
controllerName: "stunner.l7mp.io/gateway-operator"
GatewayConfig:
apiVersion: stunner.l7mp.io/v1alpha1
kind: GatewayConfig
metadata:
name: stunner-gatewayconfig
namespace: yuchat
spec:
authType: plaintext
password: <Ваш пароль>
realm: stunner.l7mp.io
stunnerConfig: stunnerd-config
userName: <Ваш логин>
logLevel: all:TRACE
UDPRoute:
kind: UDPRoute
metadata:
name: media-yuchat
namespace: yuchat
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: udp-gateway
rules:
- backendRefs:
- group: ""
kind: Service
name: webrtc
namespace: yuchat
weight: 1
port: 8090
Остальные сервисы: Установите оставшиеся сервисы в следующем порядке:
- web
- nginx-static (за уточнением конфигурации обратитесь к разработчикам)
- avnotes-streaming
- backend: при необходимости создайте вручную ConfigMap с конфигурацией и укажите его в values.yaml:
configurationExistingCM: "backend-configuration"
За уточнением конфигурации и получением секрета с api ключами (backend-apikeys) обратитесь к разработчикам
- ws-endpoint-service
- conference-service-discovery
- chat-message-event-service
- jira-chat-bot
- webrtc-fs-stack
- media-composer
- media-converter