Overview

Архитектура #

Web-сайт состоит из нескольких микро-сервисов управляемых Kubernetes.

Предыдущие версии работали без K8s, больше это неподдерживаемое решение.

K8s deployments #

Каждая часть представлена K8s deployment доступ к которому осуществляется через K8s service.

  • Front end
  • Captcha на странице регистрации
  • Основная часть (лента, профиль, группы, компании, друзья и тд.)
  • Чат
  • Загрузка фаилов
  • Админ панель
  • Domain name
  • Listing
  • DB
  • Периодические задачи

DB #

db-deployment

MySQL запускается как единственный экземпляр. Если потребуется увеличить производительность более, чем один экземпляр, нужно использовать StatefulSet.

K8s volumes #

Мы используем два NFS-share для хранения данных:

  • База данных
  • Медиа-фаилов (кантринки, видео)

Текущая реализация использует NFS для доступа к shared data, будущие планы - перейти на object storage (например: AWS S3 bucket).

K8s ingress #

Мы используем nginx ingress (разработанный Google). Следующие endpoints доступны снаружи.

  • admin-ingress - доступ к панели управления сайта
  • adminer-ingress - доступ к панели управления DB
  • app-ingress - доступ к основному сайту
  • uploaders-ingress - загрузка фаилов (картинки и видео) на сайт
  • chat - спец. условия (см. ниже)

chat-ingress #

Чат использует Secure WebSocket-s для онлайн обмена сообщениями. Поскольку WebSocket не поддерживает reverse proxy, то WebSocket порт прозрачно пробрасывается в chat-service. Это означает, что SSL реализован в самом сервисе, а не в ingress-controller как в стандартном HTTP/HTTPS. Следует помнить, что SSL-сертификат находится в сервисе и шифрование так-же реализовано внутри сервиса.

Для удобства разработки GUI определяет какой протокол используется HTTP или HTTPS. Соответствующий протокол используется для WebSocket. В процессе разработки рекомендуется использовать HTTP, во избежание необходимости генерировать SSL-сертификат.

adminer-ingress #

Во избежание доступа к вдминистрированию БД из Internet. Доступ к панели DB ограничен RFC1918 IP-адресами (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).