Skip to content

Кэш пакетов и хосты без интернета ​

Хосты качают пакеты через хаб, и каждый .deb уходит в интернет один раз на все хосты. Публичный адрес хабу не нужен, новых открытых портов у хостов нет.

Как устроено ​

  • Хаб держит к каждому хосту с галочкой «пакеты через кэш хаба» (в форме хоста, по умолчанию включена) отдельную SSH-сессию с обратным пробросом порта: на хосте 127.0.0.1:3142 (NKT_HUB_APTCACHE_PORT) ведёт в кэширующий прокси хаба. Сессия переподключается сама; значок в колонке «Канал» показывает, держится ли проброс.
  • На хосте лежат /etc/apt/apt.conf.d/99nkt-hub-proxy и /usr/local/bin/nkt-apt-proxy — штатный Acquire::http::Proxy-Auto-Detect: скрипт отвечает адресом прокси, если порт открыт, и DIRECT, если хаб не подключён, — apt тогда работает как обычно. Файлы кладутся при установке nkt с хаба, а на уже установленный хост — сразу при включении галочки (нужен root или sudo без пароля).
  • Кэшируется только неизменяемое — pool/… и by-hash/…; индексы (dists/…) идут насквозь; https-репозитории туннелируются как есть — внутрь TLS прокси не смотрит.
  • Строка «localhost» через кэш не ходит.

«О системе» → «Кэш пакетов»: размер, число файлов, попадания и промахи, трафик, сколько хостов на пробросе, лимит в гигабайтах (NKT_HUB_APTCACHE_MAX_GB, по умолчанию 20; 0 — без лимита; значение из интерфейса важнее) и очистка. При переполнении вытесняется давно не спрошенное.

Файлы по ссылке ​

Тот же порт умеет больше, чем apt. Всё, что хосту нужно из интернета для кластеров и машин, при открытом порте идёт через хаб и оседает в его кэше: хост без выхода наружу получает это с хаба, хост с выходом не качает по разу на узел то, что хаб уже видел. Хост проверяет, что порт отвечает как кэш nkt (/nkt/ping): чужой прокси на том же порту за свой не примется. Порт закрыт — всё идёт напрямую.

GET http://127.0.0.1:3142/nkt/artifact?url=… — хаб качает ссылку сам и отдаёт из кэша. Так берутся установщик и бинарник k3s с airgap-образами (k3s ставится с INSTALL_K3S_SKIP_DOWNLOAD), Cilium CLI, ключ репозитория pkgs.k8s.io, манифест Flannel, облачные образы машин. Ссылки с версией в пути и .deb лежат бессрочно, остальное (get.k3s.io, …/latest/…, «текущий» образ Ubuntu) перекачивается, если старше 6 часов; недоступен источник — отдаётся копия.

Зеркало registry ​

/v2/… на том же адресе — pull-through cache образов контейнеров. containerd на узле кластера настраивается брать docker.io, quay.io, registry.k8s.io, ghcr.io и gcr.io через зеркало (k3s — /etc/rancher/k3s/registries.yaml, kubeadm — /etc/containerd/certs.d/<registry>/hosts.toml).

  • Слои и манифесты по digest лежат бессрочно, «тег → digest» — 5 минут; при недоступном источнике берётся прошлое значение.
  • К источникам хаб ходит анонимно (Bearer по вызову WWW-Authenticate); приватные образы через зеркало не идут.
  • .deb с https-репозиториев (pkgs.k8s.io) по-прежнему туннелируются без оседания.

Сухой прогон кластера проверяет ссылки через кэш хаба, если он есть, а с галочкой «заодно подготовить» хаб заранее кладёт в кэш всё, что узлы возьмут потом.