Границы компонентов

БраузерыПриложение ColloqRuntime broker
Ядро комнаты AЯдро комнаты B

В production приложение работает с UID 1000 без Docker socket и Kubernetes credentials. Только приватный runtime broker получает namespaced service-account token и создаёт Pod/Service из фиксированного шаблона и доверенного каталога. API не принимает произвольный Pod template или путь хоста.

Каждая комната получает отдельный Jupyter Pod, токен и workspace subPath. Если runtime, образ или политика недоступны, запуск не происходит: перехода к общему ядру сервера нет.

Ограничения Pod

Room Pod работает с UID/GID 1000, без дополнительных capabilities и повышения привилегий, с RuntimeDefault seccomp и read-only корневой файловой системой. Service-account token не монтируется. Записываемые области: каталог комнаты, /tmp, /home/runner и /dev/shm.

Pod Security требует restricted-профиль. RBAC брокера ограничен операциями с Pod и Service в namespace, но не умеет ограничить каждое поле создаваемого Pod. Поэтому код брокера, его шаблоны и каталог входят в доверенную часть системы.

Сеть: проверяйте фактический результат

NetworkPolicy разрешает вход к Jupyter только приложению и брокеру. Исходящий трафик комнат по умолчанию разрешён только к DNS Pod в kube-system по TCP/UDP 53. Для загрузки внешних данных нужен отдельно спроектированный outbound proxy или профиль.

Если нужна изоляция от host-сервисов, добавьте CNI с host policy или проверенную firewall-политику с точечным разрешением брокеру доступа к Kubernetes API. До допуска недоверенных пользователей выполните реальный room-to-node connection test. Наличие манифеста не является доказательством.

Файлы и квоты

Linux production использует доступ через доверенные файловые дескрипторы, O_NOFOLLOW и /proc/self/fd. Символические ссылки не обходят каталог комнаты. Если защищённый механизм недоступен, production отказывает в работе.

Старый workspace не должен содержать hardlink между комнатами. При миграции копируйте обычные файлы в отдельные каталоги и проверьте владельцев и ссылки. Два имени существующего общего inode не превращаются в независимые данные от проверки пути.

Размер PVC — метаданные планирования, а не filesystem quota. MAX_UPLOAD_MB и MAX_SESSION_MB ограничивают операции приложения и не сдерживают произвольную запись Python. Используйте отдельный раздел и мониторинг свободного места.

Права, ссылки и секреты

Ссылка комнаты даёт доступ к занятию; преподавательская ссылка даёт доступ к панели. Setup-token позволяет владельцу восстановить контроль. Храните секреты и backup приватно; полный доступ к диску сервера означает доступ к данным и ключам.

Отдельные ответы Консилиума не дают отдельное ядро каждому студенту. Ограничения действий и browser-ban не являются проверкой личности. Автоматического оценивания, SSO и защиты экзаменационного исполнения система не обещает.

Пределы развёртывания

Контейнеры разделяют Linux-ядро VM. Это не изоляция виртуальными машинами и не защита от уязвимостей ядра. Одна VM, один узел k3s и local PV не дают HA. Потеря машины требует внешнего backup; обновления прерывают работу и теряют память Python.

Проверяйте собственную нагрузку. Не существует подтверждённого универсального лимита «сколько студентов выдержит сервер»: результаты зависят от вычислений, вывода, файлов, активных комнат и сети.