Доступно в редакциях: CE, BE, SE, SE+, EE, CSE Lite (1.73), CSE Pro (1.73)
Стадия жизненного цикла модуля: General Availability
Модуль registry-packages-proxy предоставляет сервис HTTP-прокси внутри кластера для доступа к пакетам из хранилищ образов контейнеров (container registry). Он выступает в качестве посредника между компонентами кластера и внешними или внутренними хранилищами образов контейнеров с функциями кеширования для оптимизации использования пропускной способности сети и повышения производительности при загрузке пакетов.
Этот модуль — критически важный компонент инфраструктуры, который работает на master-узлах и используется во время загрузки кластера и операций в процессе работы кластера для извлечения пакетов из хранилищ образов контейнеров.
Модуль развёртывает высокодоступный прокси-сервис, который:
- Работает как deployment на master-узлах с включенным
hostNetworkдля обеспечения доступности во время загрузки, когда CNI ещё недоступен. - Прослушивает порт
4219(HTTPS) на IP-адресе каждого master-узла. - Предоставляет эндпоинт
/packageдля извлечения пакетов из хранилища образов контейнеров по дайджесту. - Реализует локальное кеширование извлечённых пакетов (до 1 ГБ) для снижения сетевого трафика и улучшения производительности.
- Следит за кастомными ресурсами ModuleSource для получения учётных данных хранилищ образов контейнеров.
- Использует
kube-rbac-proxyдля защиты доступа к прокси и эндпоинтам метрик. - Предоставляет публичный HTTPS API (через Ingress) для исполняемых файлов и плагинов Deckhouse CLI.
- Предоставляет внутрикластерный HTTPS API для иконок пакетов (без публикации через Ingress).
Архитектура
Прокси-сервис состоит из двух контейнеров:
- registry-packages-proxy — основное приложение прокси, которое:
- извлекает пакеты из удалённых хранилищ образов контейнеров с использованием дайджестов;
- кеширует пакеты локально в эфемерном volume (максимум 1 ГБ);
- поддерживает аутентификацию в хранилищах образов контейнеров через учётные данные из ресурсов ModuleSource;
- предоставляет проверки работоспособности и метрики Prometheus;
- прослушивает
127.0.0.1:5080(HTTP, внутренний).
- kube-rbac-proxy — обеспечивает контроль доступа на основе RBAC:
- предоставляет сервис на порту
4219(HTTPS); - защищает эндпоинт
/metricsс авторизацией Kubernetes RBAC; - защищает эндпоинт
/package, требуя соответствующих разрешений; - защищает
/v1/images/*(загрузка Deckhouse CLI) с авторизацией Kubernetes RBAC; - позволяет доступ к
/healthzбез аутентификации.
- предоставляет сервис на порту
HTTP API
После завершения развёртывания кластера (bootstrap) и настройки шаблона DNS-имен в параметре publicDomainTemplate, модуль создаёт Ingress для имени registry-packages-proxy, используя шаблон из publicDomainTemplate (например, registry-packages-proxy.company.my, для publicDomainTemplate: "%s.company.my").
Эндпоинты ниже доступны двумя способами:
- Публично (через Ingress на публичном имени
registry-packages-proxy): только/v1/images/*. - Только изнутри кластера (через Service
registry-packages-proxy.d8-cloud-instance-manager.svcна порту443, либо через:4219на каждом master-узле в фазе bootstrap): все маршруты, включая/v1/packages/*.
Иконки пакетов (/v1/packages/) — только изнутри кластера
Иконки пакетов отдаются без аутентификации (kube-rbac-proxy исключает эти пути из RBAC), но доступны только изнутри кластера. Маршрут /v1/packages/* намеренно не публикуется через Ingress, поэтому публичное имя registry-packages-proxy.<publicDomain> иконки не отдаёт.
| Метод | Путь | Описание |
|---|---|---|
GET, HEAD |
/v1/packages/<РЕПОЗИТОРИЙ-ПАКЕТОВ>/<ИМЯ-ПАКЕТА>/metadata/icon/ |
Иконка последнего semver-тега |
GET, HEAD |
/v1/packages/<РЕПОЗИТОРИЙ-ПАКЕТОВ>/<ИМЯ-ПАКЕТА>/metadata/icon |
То же, что выше |
GET, HEAD |
/v1/packages/<РЕПОЗИТОРИЙ-ПАКЕТОВ>/<ИМЯ-ПАКЕТА>/metadata/icon/<ВЕРСИЯ> |
Иконка указанной версии (<ВЕРСИЯ> — semver, например v1.0.1) |
<РЕПОЗИТОРИЙ-ПАКЕТОВ> — это metadata.name кастомного ресурса PackageRepository; поле spec.registry.repo этого ресурса определяет, по какому пути в хранилище образов прокси читает иконку. Прокси читает иконку из OCI-образа <spec.registry.repo>/<ИМЯ-ПАКЕТА>:<ТЕГ>.
Прокси ищет внутри образа пакета следующие файлы в указанном порядке приоритета и возвращает первый найденный:
| Путь | Content-Type |
|---|---|
docs/icon.svg |
image/svg+xml |
docs/icon.png |
image/png |
docs/icon.jpg |
image/jpeg |
docs/icon.jpeg |
image/jpeg |
Если ни одного из этих файлов нет (или файл больше 4 МиБ), прокси возвращает 404 Not Found; вызывающий код должен использовать иконку по умолчанию. SVG предпочтительнее, так как не зависит от разрешения.
Пример запроса из пода внутри кластера:
curl -fsSk "https://registry-packages-proxy.d8-cloud-instance-manager.svc/v1/packages/my-repo/my-module/metadata/icon/"
Пример успешного ответа (когда в образе есть docs/icon.svg):
Content-Type: image/svg+xml
Content-Disposition: attachment; filename="<ИМЯ-ПАКЕТА>.svg"
Загрузка Deckhouse CLI (/v1/images/) — публичный
Эти эндпоинты доступны через публичный Ingress (registry-packages-proxy.<publicDomain>) и требуют действительный токен Kubernetes (или клиентский сертификат, принимаемый kube-rbac-proxy) и право RBAC get на subresource deployments/cli-binary с именем registry-packages-proxy в namespace d8-cloud-instance-manager.
Выдайте доступ через ClusterRole d8:registry-packages-proxy:cli-download (привяжите к пользователям или ServiceAccount через ClusterRoleBinding или RoleBinding).
| Метод | Путь | Описание |
|---|---|---|
GET |
/v1/images/<ОБРАЗ>/tags |
JSON со списком тегов |
GET, HEAD |
/v1/images/<ОБРАЗ>/tags/<ТЕГ> |
OCI-образ в формате application/x-gzip (слои сведены) |
Допустимые значения для <ОБРАЗ>:
deckhouse-clideckhouse-cli/plugins/<ПЛАГИН>(один сегмент пути для<ПЛАГИН>)
Пример:
curl -fsS -H "Authorization: Bearer ${TOKEN}" "https://registry-packages-proxy.example.com/v1/images/deckhouse-cli/tags"
Внутренний эндпоинт /package
Устаревший эндпоинт /package?digest=... (bootstrap и внутренние компоненты) по-прежнему защищён RBAC (subresource deployments/http). Через публичный Ingress не публикуется.
Поток извлечения пакетов
Когда компонент запрашивает пакет:
- Запрос включает параметр
digest(обязательный) и необязательные параметрыrepositoryиpath. - Прокси проверяет локальный кеш на наличие запрошенного дайджеста.
- Если запрашиваемый пакет есть в кеше, он извлекается из кеша.
- Если запрашиваемый пакет отсутствует в кеше:
- Прокси извлекает учётные данные для указанного хранилища образов из отслеживаемых ресурсов ModuleSource.
- Пакет извлекается из удалённого хранилища образов.
- Пакет передаётся клиенту с одновременным кешированием для будущих запросов.
- Ответы включают соответствующие HTTP-заголовки для кеширования (
Cache-Control,ETag,Content-Length).
Высокая доступность
Модуль обеспечивает высокую доступность через:
- Запуск нескольких реплик на master-узлах (в HA-конфигурациях).
- Правила anti-affinity для распределения подов по разным master-узлам.
- PodDisruptionBudget для предотвращения одновременного нарушения работы всех реплик.
- Поддержку Vertical Pod Autoscaler для автоматической настройки ресурсов.
Роли RBAC, создаваемые модулем
| ClusterRole | Назначение |
|---|---|
d8:registry-packages-proxy:cli-download |
Доступ к /v1/images/* |
d8:registry-packages-proxy:packages-download |
Зарезервирована для будущих защищённых маршрутов /v1/packages/* (иконки отдаются анонимно, доступ только изнутри кластера) |
Ограничения
- Модуль работает исключительно на master-узлах.
- Требует
hostNetwork: trueдля работы во время фазы загрузки. - Размер кеша ограничен 1 ГБ на под.
- Большинство HTTP-эндпоинтов требуют RBAC Kubernetes; без аутентификации доступны только проверки работоспособности (health check) и иконки пакетов. Иконки пакетов дополнительно ограничены доступом только изнутри кластера (без маршрута через публичный Ingress).
- Иконки читаются из фиксированных путей внутри образа пакета (
docs/icon.svg,docs/icon.png,docs/icon.jpg,docs/icon.jpeg); SVG предпочтительнее. Максимальный размер иконки — 4 МиБ.