Архитектура #
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
- доступ к панели управления DBapp-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).