Контейнеры и виртуальные машины
Один раздел с вкладками: Docker, Podman, LXD и Libvirt (виртуальные машины libvirt/QEMU.
Удаление
У контейнеров Docker и Podman, инстансов LXD и их снимков, машин libvirt, образов контейнеров, образов и файлов дисков машин, сетей и образов LXD и объектов Kubernetes есть галочки — выбранные удаляются разом. Потенциально долгие удаления (контейнеры, инстансы, снимки, машины, образы контейнеров, объекты Kubernetes) идут фоновым заданием с журналом: пока объект удаляется, его строка заблокирована — и после перезагрузки страницы, — а повторное нажатие откроет то же задание. По окончании хост пересканируется, и таблицы перестраиваются, в том числе связанные: после удаления машины с дисками — и список файлов дисков.
Значок ОС
Перед именем контейнера, инстанса и машины — значок его ОС (Ubuntu, Debian, Alpine, Windows, Fedora, RHEL и родственные…; прочий Linux — пингвин, неизвестная — «?»), подсказка — полное имя и откуда оно известно:
- контейнер Docker и Podman —
/etc/os-releaseзапущенного контейнера (одноexecна контейнер, ответ помнится по ID контейнера); без файла и безcatвнутри (scratch, distroless) — Linux образа; - инстанс LXD —
image.os/image.releaseего конфигурации (у Windows-машины, поставленной с ISO, их задают сами:lxc config set <имя> image.os=Windows); - машина libvirt — гостевой агент QEMU (
guest-get-osinfo, у работающей машины, раз в 10 минут), иначе метка libosinfo в XML (её ставят virt-install и virt-manager), иначе догадка по Hyper-V-флагам в XML — полупрозрачный значок Windows с «?».
У Windows-гостя нет текстовой консоли — у него только «Экран» (VNC или SPICE). Значок стоит и в заголовках окон: консоль, журналы, «Инспект», экран, правка.
Docker

- Контейнеры: статус, образ, порты, сети; запуск, остановка, перезапуск, удаление, логи; создание контейнера; сканирование compose-стеков.

- Инспект (иконка в строке контейнера) — вкладки:
- «Переменные» — окружение контейнера с источником: «для контейнера» (compose,
.env,docker run -e), «поверх образа» (своё значение вместоENVобраза), «из образа». Видно, дошло ли новое значение.envдо контейнера. Значения по умолчанию скрыты — сервер их даже не отдаёт; администратор раскрывает их кнопкой «Показать значения» с подтверждением, и это пишется в журнал действий (container.inspect_reveal); роль «чтение» видит только имена; - «Общее» — образ и его ID (и предупреждение, если тег уже указывает на новый образ, а контейнер работает на старом), состояние и healthcheck, время запуска, политика и число перезапусков, команда, пользователь, пределы памяти и CPU, стек compose;
- «Сеть и тома» — опубликованные порты, тома и монтирования, сети с адресами;
- «Метки» и полный JSON
docker inspect(значения переменных в нём замазаны так же).
- «Переменные» — окружение контейнера с источником: «для контейнера» (compose,
- Образы: размер, дата, кем используется; удаление, сохранение в tar на хосте (заданием, архивы — в карточке «Архивы образов»), очистка осиротевших слоёв.
- Стеки: compose-файлы хоста —
up,down,restart; compose редактируется в редакторе конфигов с проверкойdocker compose config; новый стек — из шаблона. - Если Docker на хосте нет — плашка с кнопкой установки прямо во вкладке (официальный репозиторий docker.com или пакеты дистрибутива с compose), фоновым заданием со стандартным окном журнала.

- Архивы образов — карточка под образами (такая же есть у Podman и LXD): файлы образов на хосте в каталоге сохранений nkt. «Сохранить образ в архив» —
docker saveвыбранного образа фоновым заданием; «Скачать» — файл на компьютер; «Загрузить в Docker» —docker loadзаданием; «Удалить». Сохранённые раньше кнопкой «Сохранить» у образов тоже здесь. Скачивание и загрузка — только администратору: в образе могут быть секреты.

«Загрузить образ…» (Docker и Podman) — архив
docker save(.tar,.tar.gz,.tgz,.tar.xz,.tar.zst) двумя способами:- по ссылке (http/https) — качает сам хост фоновым заданием со стандартным окном журнала: окно браузера можно закрыть, после обрыва связи или перезапуска nkt скачивание продолжается с места остановки. Имя файла по умолчанию — из ссылки; необязательная сумма sha256 проверяется по готовому файлу, несовпавший файл не остаётся. Хост без выхода в интернет качает через кэш хаба, как образы машин;
- с компьютера — тоже заданием хоста, заведённым до первого байта: окно журнала открывается сразу, хост пишет в задание проценты по дошедшим байтам, и ход виден в «Заданиях» хоста и в индикаторе фоновых операций из любого раздела, на хабе тоже. Файл передаёт браузер, так что переход по разделам и на хаб передачу не прерывает, а закрытие вкладки — прерывает (браузер переспросит); оборванная передача — ошибка задания с процентом, на котором она оборвалась, недописанный файл не остаётся.
Галочка «Сразу загрузить в Docker» (включена по умолчанию) — после скачивания или передачи
docker loadидёт следующим шагом того же задания. Под ней — «Удалить архив после загрузки» (тоже включена; активна только вместе с первой): после успешногоdocker loadархив удаляется — место на диске возвращается, образ уже в движке. Если загрузка в движок не удалась, архив остаётся для повтора. У LXD — кнопка «Загрузить с компьютера», тоже заданием, без загрузки в движок; так же — свой образ машины в разделе libvirt (после передачи задание само переносит его в каталог дисков).
Podman и LXD
Podman — контейнеры через собственный сокет, тот же жизненный цикл, что у Docker. LXD — контейнеры и виртуальные машины одним инструментом: launch, запуск, остановка, удаление.
Создание инстанса LXD и контейнера Podman идёт фоновым заданием: сразу открывается окно журнала с процентами загрузки образа, закрытие окна создание не прерывает, а задание остаётся в разделе «Задания» — на хосте и через хаб.
Вход по паролю. При создании инстанса LXD или машины libvirt можно задать пользователя и пароль или сгенерировать его. В окнах консоли и экрана строка «Вход» показывает логин и задан ли пароль. Кнопка «показать» открывает пароль администратору, кнопка «задать пароль» ставит новый фоновым заданием: в LXD через lxc exec и chpasswd, в libvirt через qemu-guest-agent. Пароль хранится в nkt зашифрованным и не попадает ни в параметры заданий, ни в командную строку.

У инстансов LXD в строке — память и лимиты (limits.memory, limits.cpu), диск, проброшенные порты (устройства proxy) с «проверить порт», автозапуск одной кнопкой (boot.autostart), логи (журнал внутри инстанса или лог самого LXD) и консоль.
Снимки инстанса — отдельное окно из строки: создать (по галочке — со снимком памяти), откатить (lxc restore), удалить. Создание и откат идут фоновым заданием с окном журнала, как и остановка и перезапуск инстанса: машина выключается дольше, чем стоит ждать ответа на запрос. Снимок живёт на том же пуле хранения; для переноса на другой хост нужен бэкап.

Конфигурация инстанса (lxc config show/edit) правится в окне: текст, быстрые поля limits.cpu и limits.memory, дифф перед записью и история версий с откатом. Рядом — итоговая конфигурация с профилями (--expanded), только для чтения.
Проброс порта (устройство proxy) добавляется кнопкой «+» в колонке портов и убирается корзиной рядом с портом: форма собирает устройство, а записывается оно через то же окно конфигурации — с диффом и версией в истории. Под списком инстансов — сети LXD (создать мост, удалить управляемую сеть), образы на хосте (удалить, скачать заранее с images: или ubuntu: с живым выводом) и пулы хранения (только чтение).
- Если Podman или LXD нет — плашка с кнопкой установки (Podman — apt, LXD — snap и
lxd init --auto). - Архивы образов — как у Docker: Podman —
podman saveиpodman load; LXD — «Экспортировать образ в архив» (lxc image export: один файл или пара «метаданные + корневая ФС»,.root) и «Импортировать в LXD» (lxc image import, для раздельного образа — вместе с файлом.root, псевдоним по желанию). Скачивание и загрузка с компьютера — те же.
Libvirt (виртуальные машины KVM)

- Если libvirt/KVM на хосте нет — плашка с кнопкой установки: демон, клиенты,
qemu-utils,virtinstи qemu своей архитектуры. - Домены libvirt: запуск, выключение, принудительное выключение, перезагрузка, автозапуск, удаление с дисками или без; адреса машин.
- Образы машин — кроме загрузки с компьютера, «Скачать на компьютер» у скачанного образа библиотеки и у файла каталога дисков libvirt.
- Экран машины — иконка «экран» у работающей машины: VNC прямо в браузере (noVNC), с Ctrl+Alt+Del и режимом «только смотреть», через хаб тоже. Машину только со SPICE-графикой окно открывает по SPICE (spice-html5) и предлагает «Добавить VNC» — правкой XML с диффом. У работающей виртуальной машины LXD такой же экран по SPICE. Лицензии клиентов — в
THIRD_PARTY_NOTICES.md. - Консоль — иконка в строке работающего контейнера (Docker, Podman:
exec, bash или sh, можно задать пользователя), инстанса LXD (lxc exec) и машины (последовательная консольvirsh console, выход — Ctrl+]; при подключении nkt сам нажимает Enter, и появляется «login:»). Нужен включённый веб-терминал. Консоль запускается от root, даже если терминал хоста под хабом работает от пользователя SSH. - Бэкап — иконка в строке машины и контейнера (Docker, Podman, LXD через
lxc export/lxc import; контейнер из compose — стеком целиком): архивы на хосте в/var/lib/netknownsthat/backups, создание фоновым заданием, скачивание, восстановление копией или поверх. Работающая машина не останавливается — диски на время копирования уходят на снимок. - LXD и Podman ставятся с их вкладок, если движка нет: Podman — apt, LXD — snap (snapd ставится сам) и
lxd init --auto. Образ для нового инстанса LXD выбирается из списка:images:,ubuntu:или уже скачанные на хост; контейнер или ВМ. - В строке — одна кнопка питания по состоянию (работает — «остановить», остановлен — «запустить», на паузе — «возобновить»); перезапуск и пауза — только у работающего.
- Запуск и перезапуск контейнера идут в окне выполнения nkt: виден вывод
docker start, через несколько секунд — состояние, и если контейнер не запущен — хвост его логов с причиной. Логи — иконка в строке:docker logsживьём, хвост 200/1000/5000 строк, «следить», «метки времени». То же у Podman. - Удаление машины — одна кнопка; «удалить и диски машины» — галочка в окне подтверждения, по умолчанию выключена.
- Конфигурация машины (XML) — карандаш в строке: вкладки «текст», «история» и «блоки» (элементы домена и устройства по одному: диск, сетевой интерфейс, графика — изменить, удалить,
+ disk/+ interface/+ graphicsс шаблоном); перед записью открывается окно с диффом «на диске → черновик», иvirsh defineвыполняется только после «Записать». Карандаш открывает/etc/libvirt/qemu/<имя>.xmlв редакторе конфигураций, с историей версий, откатом иvirsh defineпри сохранении. У запущенной машины правки вступят в силу после перезапуска. - Новая машина из облачного образа: имя, ядра, память, диск, сеть, пользователь и SSH-ключ через cloud-init. Недостающие программы (
virt-install,qemu-img…) ставятся сами. Шаблоны машин — чтобы создавать одинаковые повторно. - Образы: каталог облачных образов Ubuntu, Debian и др. — скачивание с проверкой контрольной суммы; свои образы — загрузка файла, перенос в каталог дисков.
- Сети libvirt: список, NAT-сеть с DHCP и автозапуском (подсеть проверяется на пересечение с сетями и интерфейсами хоста), мост на интерфейс хоста.
- XML домена редактируется в редакторе конфигов с проверкой
virt-xml-validateи применением черезvirsh define.
Машины из хаба
На хабе машина создаётся на хосте прямо из списка хостов, nkt ставится в неё автоматически, а профиль группы применяется сразу — см. Хаб.
Kubernetes
На узле кластера (машине, созданной хабом через «новый кластер») — вкладка Kubernetes: вариант и роль, узлы кластера с ролями и Ready, поды по namespace, kubeconfig и удаление узла из кластера.
На control plane ниже — объекты кластера по разделам: Workloads (Deployments, StatefulSets, DaemonSets, Jobs, CronJobs), поды, сеть (Services, Ingress), конфигурация (ConfigMaps, Secrets), хранилище (PVC, PV, StorageClass), доступ (ServiceAccounts, Roles, привязки — у ServiceAccount видно, какие роли к нему привязаны), NetworkPolicy, HPA, узлы, namespaces, события и Custom Resources — виды из CRD кластера с их собственными колонками. В каждом разделе — фильтр по namespace, общий для всех разделов, и поиск; цвет точки — состояние объекта. У секретов в списке только имена ключей, значения — кнопкой «показать» администратору, и каждый показ пишется в журнал действий.
У каждой строки — меню действий. «Описание» (kubectl describe с событиями) доступно всем, остальное — администратору: у подов журнал (хвост, слежение, предыдущий запуск) и консоль kubectl exec; у Deployments и StatefulSets — масштабирование, перезапуск (rollout restart), история выкаток и откат на ревизию; у CronJobs — «запустить сейчас» и пауза; у узлов — cordon/uncordon и вывод узла (drain) фоновым заданием; namespace можно создать и удалить, любой объект — удалить. Каждое действие пишется в журнал действий хоста. «Открыть в браузере» у пода и сервиса пробрасывает его порт (kubectl port-forward) и открывает приложение в новой вкладке по одноразовой ссылке — с отдельного адреса пробросов (порт 8446, NKT_FORWARD_ADDR), где у приложения свой origin и нет доступа к сессии nkt. Открытые ссылки видны в том же окне и закрываются кнопкой.
YAML любого объекта (кроме секретов) открывается из того же меню: перед записью — текстовый дифф и kubectl diff с кластера, запись — kubectl apply, каждая правка — версия в истории с откатом. Кнопка «Новый объект» создаёт объекты из шаблонов (Deployment + Service, Ingress, ConfigMap, CronJob). В окнах YAML есть блочный режим, как у конфигов: объекты, контейнеры, порты, правила и ключи — блоками, с правкой, удалением и «+ элемент»; запись — через те же диффы.
Раздел Helm — релизы кластера с фильтром по namespace: история и откат на ревизию, правка values с диффом и обновление, удаление, установка чарта из репозитория или oci://. В окне релиза — заданные значения (helm get values), все значения релиза и значения чарта по умолчанию — любое можно взять «в черновик». Всё — фоновыми заданиями; если helm на хосте нет, его ставит кнопка «Установить Helm» (официальный архив в /usr/local/bin).

Открыть в браузере (проброс порта)
«Открыть в браузере» у пода или сервиса: выбор порта, kubectl port-forward на узле и новая вкладка по одноразовой ссылке. Ссылки открытых пробросов остаются в том же окне — их можно открыть снова или закрыть.

- Приложение отдаётся с отдельного порта пробросов — 8446 на том же хосте, что интерфейс (
NKT_FORWARD_ADDR). Другой origin: скрипты приложения работают как обычно, но не видят сессию nkt. - Через SSH-туннель пробросьте и этот порт:
ssh -L 8077:127.0.0.1:8077 -L 8446:127.0.0.1:8446 …. - За обратным прокси заведите отдельное имя или порт и укажите
NKT_FORWARD_PUBLIC_URL. NKT_FORWARD_ADDR=off— пробросы по пути интерфейса в песочнице: простые страницы работают, приложения с JavaScript и cookie — нет.
Подробнее — Порты и доступ.
«Обновить» на карточке Kubernetes обновляет этот узел до выбранной минорной версии заданием (k3s — заменой бинарника, kubeadm — kubeadm upgrade); кластер, созданный хабом, обновляется целиком из раздела «Кластеры» — по узлам, с drain и uncordon. «Удалить» убирает Kubernetes с узла (k3s-uninstall.sh или kubeadm reset с удалением пакетов) тоже заданием: это минуты, и оборванный запрос бросал бы удаление на полпути.
