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

Инструкция 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:

    1. После деплоя applications в Арго создайте CRD для Gateway, GatewayClass, GatewayConfig и UDPRoute.

    2. Пример конфигурации 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

Остальные сервисы: Установите оставшиеся сервисы в следующем порядке:

  1. web
  2. nginx-static (за уточнением конфигурации обратитесь к разработчикам)
  3. avnotes-streaming
  4. backend: при необходимости создайте вручную ConfigMap с конфигурацией и укажите его в values.yaml:
configurationExistingCM: "backend-configuration"

За уточнением конфигурации и получением секрета с api ключами (backend-apikeys) обратитесь к разработчикам

  1. ws-endpoint-service
  2. conference-service-discovery
  3. chat-message-event-service
  4. jira-chat-bot
  5. webrtc-fs-stack
  6. media-composer
  7. media-converter