Skip to content

Контейнеры и виртуальные машины ​

Один раздел с вкладками: 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 ​

Контейнеры Docker

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

Инспект контейнера

  • Инспект (иконка в строке контейнера) — вкладки:
    • «Переменные» — окружение контейнера с источником: «для контейнера» (compose, .env, docker run -e), «поверх образа» (своё значение вместо ENV образа), «из образа». Видно, дошло ли новое значение .env до контейнера. Значения по умолчанию скрыты — сервер их даже не отдаёт; администратор раскрывает их кнопкой «Показать значения» с подтверждением, и это пишется в журнал действий (container.inspect_reveal); роль «чтение» видит только имена;
    • «Общее» — образ и его ID (и предупреждение, если тег уже указывает на новый образ, а контейнер работает на старом), состояние и healthcheck, время запуска, политика и число перезапусков, команда, пользователь, пределы памяти и CPU, стек compose;
    • «Сеть и тома» — опубликованные порты, тома и монтирования, сети с адресами;
    • «Метки» и полный JSON docker inspect (значения переменных в нём замазаны так же).
  • Образы: размер, дата, кем используется; удаление, сохранение в 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: инстансы, сети, образы, пулы

У инстансов LXD в строке — память и лимиты (limits.memory, limits.cpu), диск, проброшенные порты (устройства proxy) с «проверить порт», автозапуск одной кнопкой (boot.autostart), логи (журнал внутри инстанса или лог самого LXD) и консоль.

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

Конфигурация инстанса LXD

Конфигурация инстанса (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).

Helm

Открыть в браузере (проброс порта) ​

«Открыть в браузере» у пода или сервиса: выбор порта, 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 с удалением пакетов) тоже заданием: это минуты, и оборванный запрос бросал бы удаление на полпути.

Kubernetes