Границы компонентов
В 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.
Проверяйте собственную нагрузку. Не существует подтверждённого универсального лимита «сколько студентов выдержит сервер»: результаты зависят от вычислений, вывода, файлов, активных комнат и сети.