Deckhouse Platform устанавливает CRD, но не удаляет их при отключении модуля. Если вам больше не нужны созданные CRD, удалите их.
Стадия жизненного цикла модуля: Preview
RegistryConfig
Short names: rcfg
Scope: Cluster
Version: v1alpha1
Описывает результирующую конфигурацию хранилища образов контейнеров кластера.
В штатном режиме объект рендерится модулем из ModuleConfig/registry. Объект — контракт, а не собственность Deckhouse: администратор может править его напрямую, когда оператор Deckhouse недоступен, и правка применяется на лету контроллером хранилища образов контейнеров и синкером хранилища, без перегенерации helm.
Используется единственный объект с именем registry.
- объектspec
Обязательный параметр
- строкаspec.mode
Управляет ли модуль путём загрузки образов.
Managed— модуль владеет путём загрузки и создаёт свои компоненты.Unmanaged— модуль не владеет ничем, компоненты не создаются.
По умолчанию:
ManagedДопустимые значения:
Managed,Unmanaged - объектspec.primary
Единственный авторитетный источник образов компонентов Deckhouse.
Дополнительные хранилища образов контейнеров объявляются отдельными объектами RegistryUpstream. Несколько разных Primary не поддерживается: тогда были бы неоднозначны и «полон ли кеш», и «из чего наполняется кеш в air-gap».
- объектspec.primary.upstream
Хранилище образов контейнеров, из которого загружаются образы компонентов Deckhouse.
Если не задан, кластер считается air-gap: внутрикластерный кеш становится авторитетным и наполняется извне командой
d8 mirror push. Отсутствие параметра требуетstorage.cache: true.- объектspec.primary.upstream.auth
Ключи доступа к хранилищу образов контейнеров.
Чувствительные данные. Ключи хранятся внутри объекта, а не по ссылке на секрет, — так агент на узле остаётся самодостаточным при недоступном API-сервере. Ограничивайте доступ к ресурсам хранилища образов контейнеров соответствующим образом.
- строкаspec.primary.upstream.auth.auth
Заранее закодированное значение
base64("username:password").Имеет приоритет над
usernameиpassword, если задано. - строкаspec.primary.upstream.auth.password
Пароль для базовой аутентификации.
- строкаspec.primary.upstream.auth.username
Имя пользователя для базовой аутентификации.
- строкаspec.primary.upstream.ca
PEM-сертификат удостоверяющего центра для проверки хранилища образов контейнеров при
scheme: HTTPS.Если не задан, используется системное хранилище доверенных сертификатов.
- строкаspec.primary.upstream.host
Обязательный параметр
Хост хранилища образов контейнеров, опционально с портом.
Пример:
host: registry.deckhouse.io - массив объектовspec.primary.upstream.mirrors
Дополнительные адреса, отдающие тот же контент, что и основное хранилище образов контейнеров, — для отказоустойчивости и балансировки.
Зеркала не являются отдельными источниками. Хранилище кеширует один дедуплицированный набор независимо от того, с какого зеркала образы были загружены.
- объектspec.primary.upstream.mirrors.auth
Ключи доступа к зеркалу.
Чувствительные данные. См.
primary.upstream.auth.- строкаspec.primary.upstream.mirrors.auth.auth
Заранее закодированное значение
base64("username:password"). - строкаspec.primary.upstream.mirrors.auth.password
Пароль для базовой аутентификации.
- строкаspec.primary.upstream.mirrors.auth.username
Имя пользователя для базовой аутентификации.
- строкаspec.primary.upstream.mirrors.ca
PEM-сертификат удостоверяющего центра для проверки зеркала.
- строкаspec.primary.upstream.mirrors.host
Обязательный параметр
Хост зеркала, опционально с портом.
Пример:
host: registry-mirror.example.com - строкаspec.primary.upstream.mirrors.path
Префикс пути к репозиторию внутри зеркала.
- строкаspec.primary.upstream.mirrors.scheme
Протокол подключения к зеркалу.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- строкаspec.primary.upstream.path
Префикс пути к репозиторию внутри хранилища образов контейнеров.
Пример:
path: "/deckhouse/ee" - строкаspec.primary.upstream.scheme
Протокол подключения к хранилищу образов контейнеров.
Используйте
HTTPтолько для незащищённых доверенных хранилищ образов контейнеров.По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- объектspec.storage
Настройки внутрикластерного кеша хранилища образов контейнеров.
- булевыйspec.storage.cache
Идут ли загрузки через внутрикластерный кеш на master-узлах.
Это первая из двух осей конфигурации. Вторая — задан ли
primary.upstream. Вместе они заменяют прежнюю стейт-машину режимов:cache: falseс заданным upstream — агент форвардит загрузки напрямую в upstream, хранилище не нужно.cache: trueс заданным upstream — сквозной кеш, наполняется из upstream.cache: trueбез upstream — air-gap: кеш авторитетен и наполняется командойd8 mirror push.
По умолчанию:
false - объектspec.storage.garbageCollection
When the cache reclaims the disk taken by releases the cluster has moved past.
Nothing else ever removes anything: every release adds a slice of the repository, so a cluster that lives for years fills its store and then stops being able to pull.
A collection puts one replica read-only for as long as it takes. That replica keeps serving every image it holds; what it cannot do is store the result of a cache miss, or accept a
d8 mirror push. Only one replica collects at a time.- булевыйspec.storage.garbageCollection.enabled
Whether the cache reclaims its disk at all.
- строкаspec.storage.garbageCollection.schedule
A five-field cron expression, in the replicas’ own time zone.
Defaults to a night hour, or to the start of the
masternode group’s maintenance window when one is set.
- строкаspec.storage.size
Размер персистентного хранилища под кеш.
Шаблон:
^[0-9]+(\.[0-9]+)?(E|P|T|G|M|k|Ei|Pi|Ti|Gi|Mi|Ki)?$Пример:
size: 50Gi - объектspec.storage.source
Набор образов, который должен оказаться в кеше.
Обязателен в air-gap: без upstream, к которому можно откатиться, полнота должна быть вычислимой, прежде чем отдавать образы только из кеша.
- строкаspec.storage.source.bundleRef
Имя набора образов, например bundle, залитого командой
d8 mirror push.Пример:
bundleRef: d8-mirror-bundle - целочисленныйspec.storage.source.expectedDigests
Количество уникальных дайджестов в наборе.
Допустимые значения:
0 <= XПример:
expectedDigests: 459
- объектstatus
- массив объектовstatus.conditions
Сводка здоровья, которую пишет контроллер хранилища образов контейнеров.
Valid— результирующая конфигурация согласована.UpstreamValid— результат preflight-пробы Primary upstream: достижимость, приём ключей, наличие sentinel-контента. ЗначениеFalseозначает, что контроллер держит последний рабочий upstream и не переключился, — так испорченная лицензия или неверный адрес не роняют кластер.StorageConverged— хранилище пришло в состояние, которого требует конфигурация.
- строкаstatus.conditions.lastTransitionTime
Обязательный параметр
Время последнего изменения состояния.
- строкаstatus.conditions.message
Пояснение для человека.
- целочисленныйstatus.conditions.observedGeneration
Поколение
spec, для которого выставлено состояние. - строкаstatus.conditions.reason
Обязательный параметр
Машиночитаемая причина состояния.
- строкаstatus.conditions.status
Обязательный параметр
Значение состояния.
Допустимые значения:
True,False,Unknown - строкаstatus.conditions.type
Обязательный параметр
Тип состояния.
- объектstatus.effectiveUpstream
Upstream, который фактически действует, — не обязательно тот, что задан в конфигурации.
Это собственная запись контроллера о последнем upstream, прошедшем preflight-пробу, и именно она делает неудачное изменение переживаемым: если ввести нерабочие ключи или переключиться на лицензию без доступа, это поле — а вместе с ним и кластер — остаётся на прежнем рабочем upstream, а состояние
UpstreamValidсообщает причину.Оно же держит upstream во время ухода в air-gap, когда конфигурация уже говорит «нет», а кеш ещё не полон.
Пусто означает, что никакой upstream не действует: либо кластер в air-gap, либо ничего ещё не настроено.
- строкаstatus.effectiveUpstream.ca
PEM-сертификат удостоверяющего центра для проверки хранилища образов контейнеров.
- строкаstatus.effectiveUpstream.host
Хост хранилища образов контейнеров, опционально с портом.
- массив объектовstatus.effectiveUpstream.mirrors
Дополнительные адреса, отдающие тот же контент.
- строкаstatus.effectiveUpstream.mirrors.ca
PEM-сертификат удостоверяющего центра для проверки зеркала.
- строкаstatus.effectiveUpstream.mirrors.host
Обязательный параметр
Хост зеркала, опционально с портом.
- строкаstatus.effectiveUpstream.mirrors.path
Префикс пути к репозиторию внутри зеркала.
- строкаstatus.effectiveUpstream.mirrors.scheme
Протокол подключения к зеркалу.
Допустимые значения:
HTTP,HTTPS
- строкаstatus.effectiveUpstream.path
Префикс пути к репозиторию внутри хранилища образов контейнеров.
- строкаstatus.effectiveUpstream.scheme
Протокол подключения к хранилищу образов контейнеров.
Допустимые значения:
HTTP,HTTPS
- строкаstatus.effectiveUpstreamAuthDigest
Опознаёт действующие ключи доступа, не раскрывая их.
Нужен потому, что вопрос «изменилась ли конфигурация» обязан учитывать ключи: смена лицензии при неизменном адресе — ровно тот случай, который нужно проверить пробой до переключения кластера. Ключи здесь больше не хранятся, и сравнение с дайджестом настроенных — то, что оставляет этот вопрос разрешимым.
- целочисленныйstatus.observedGeneration
Поколение
spec, на которое контроллер отреагировал последним.
RegistryNode
Short names: rnode
Scope: Cluster
Version: v1alpha1
Описывает полную выкладку хранилища образов контейнеров для одного узла, скомпилированную для его агента.
По одному объекту на узел, имя совпадает с именем узла, ownerReference указывает на него. Объект пишет контроллер хранилища образов контейнеров; status пишет только агент.
Объект плоский и, если не считать одной намеренной ссылки, самодостаточный: сертификаты удостоверяющих центров и маршруты лежат внутри, агент держит полную копию на диске и продолжает отдавать образы по ней при недоступном API-сервере — а в этот момент разыменовывать уже нечего. Исключение — учётные данные: они не лежат внутри, а названы (auth.secretRef указывает на секрет, в который их разрешает модуль). Именно это позволяет читать объект каждому узлу, не выдавая при этом каждому узлу все учётные данные реестров кластера. По той же причине контроллер компилирует все принятые RegistryUpstream в spec.additionalRoutes, вместо того чтобы агент следил за N объектами: согласованность многих объектов при недоступном API гарантировать нельзя.
Объект не содержит per-node секретов. Всё в нём — глобальная конфигурация, одинаковая на каждом узле. Именно поэтому его безопасно читать всей группе system:nodes, через которую агент получает доступ по kubeconfig kubelet’а.
- объектspec
Обязательный параметр
- массив объектовspec.additionalRoutes
Принятые объекты RegistryUpstream, скомпилированные контроллером.
Всегда транзит, никогда не кешируется: агент проксирует загрузку и передаёт её потоком, не записывая на диск.
- объектspec.additionalRoutes.auth
Где хранятся ключи доступа к этому эндпоинту.
Указаны ссылкой, а не значением. Ресурс кластерного уровня, а роль узлового агента привязана к группе
system:nodes, поэтому ключ, записанный здесь, был бы доступен через API kubelet’у любого узла — включая ключи к хранилищу образов контейнеров, откуда этот узел ничего не тянет. Компонент, который это читает, разрешает ссылку один раз и сохраняет результат, поэтому продолжает работать и при недоступном API-сервере.- объектspec.additionalRoutes.auth.secretRef
Секрет с ключами доступа и ключ внутри него.
- строкаspec.additionalRoutes.auth.secretRef.key
Обязательный параметр
Ключ внутри него. Один секрет содержит все разрешённые модулем ключи доступа, по принадлежности.
- строкаspec.additionalRoutes.auth.secretRef.name
Обязательный параметр
Имя секрета в неймспейсе
d8-system.
- строкаspec.additionalRoutes.ca
PEM-сертификат удостоверяющего центра для проверки upstream.
- строкаspec.additionalRoutes.host
Обязательный параметр
Хост upstream, опционально с портом.
Пример:
host: registry-vendor.example.com - строкаspec.additionalRoutes.match
Обязательный параметр
Хост хранилища образов контейнеров, который перехватывается на этом узле.
Пример:
match: images.virtualization.example.com - массив объектовspec.additionalRoutes.mirrors
Дополнительные адреса, отдающие тот же контент.
- объектspec.additionalRoutes.mirrors.auth
Где хранятся ключи доступа к этому эндпоинту.
Указаны ссылкой, а не значением. Ресурс кластерного уровня, а роль узлового агента привязана к группе
system:nodes, поэтому ключ, записанный здесь, был бы доступен через API kubelet’у любого узла — включая ключи к хранилищу образов контейнеров, откуда этот узел ничего не тянет. Компонент, который это читает, разрешает ссылку один раз и сохраняет результат, поэтому продолжает работать и при недоступном API-сервере.- объектspec.additionalRoutes.mirrors.auth.secretRef
Секрет с ключами доступа и ключ внутри него.
- строкаspec.additionalRoutes.mirrors.auth.secretRef.key
Обязательный параметр
Ключ внутри него. Один секрет содержит все разрешённые модулем ключи доступа, по принадлежности.
- строкаspec.additionalRoutes.mirrors.auth.secretRef.name
Обязательный параметр
Имя секрета в неймспейсе
d8-system.
- строкаspec.additionalRoutes.mirrors.ca
PEM-сертификат удостоверяющего центра для проверки зеркала.
- строкаspec.additionalRoutes.mirrors.host
Обязательный параметр
Хост зеркала, опционально с портом.
- строкаspec.additionalRoutes.mirrors.path
Префикс пути к репозиторию внутри зеркала.
- строкаspec.additionalRoutes.mirrors.scheme
Протокол подключения к зеркалу.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- строкаspec.additionalRoutes.path
Префикс пути к репозиторию внутри upstream.
- строкаspec.additionalRoutes.scheme
Протокол подключения к upstream.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- массив объектовspec.backends
Источники основного набора образов, по приоритету.
При включённом кеше это хранилище, а за ним upstream как запасной путь, пока кеш наполняется; запись upstream уходит из выкладки, когда кластер уходит в air-gap. При выключенном кеше — только upstream.
- объектspec.backends.auth
Где хранятся ключи доступа к этому эндпоинту.
Указаны ссылкой, а не значением. Ресурс кластерного уровня, а роль узлового агента привязана к группе
system:nodes, поэтому ключ, записанный здесь, был бы доступен через API kubelet’у любого узла — включая ключи к хранилищу образов контейнеров, откуда этот узел ничего не тянет. Компонент, который это читает, разрешает ссылку один раз и сохраняет результат, поэтому продолжает работать и при недоступном API-сервере.- объектspec.backends.auth.secretRef
Секрет с ключами доступа и ключ внутри него.
- строкаspec.backends.auth.secretRef.key
Обязательный параметр
Ключ внутри него. Один секрет содержит все разрешённые модулем ключи доступа, по принадлежности.
- строкаspec.backends.auth.secretRef.name
Обязательный параметр
Имя секрета в неймспейсе
d8-system.
- строкаspec.backends.ca
PEM-сертификат удостоверяющего центра для проверки бэкенда.
- строкаspec.backends.host
Обязательный параметр
Хост бэкенда, опционально с портом.
Пример:
host: registry.d8-system.svc:5001 - массив объектовspec.backends.mirrors
Дополнительные адреса, отдающие тот же контент; используются при отказе.
- объектspec.backends.mirrors.auth
Где хранятся ключи доступа к этому эндпоинту.
Указаны ссылкой, а не значением. Ресурс кластерного уровня, а роль узлового агента привязана к группе
system:nodes, поэтому ключ, записанный здесь, был бы доступен через API kubelet’у любого узла — включая ключи к хранилищу образов контейнеров, откуда этот узел ничего не тянет. Компонент, который это читает, разрешает ссылку один раз и сохраняет результат, поэтому продолжает работать и при недоступном API-сервере.- объектspec.backends.mirrors.auth.secretRef
Секрет с ключами доступа и ключ внутри него.
- строкаspec.backends.mirrors.auth.secretRef.key
Обязательный параметр
Ключ внутри него. Один секрет содержит все разрешённые модулем ключи доступа, по принадлежности.
- строкаspec.backends.mirrors.auth.secretRef.name
Обязательный параметр
Имя секрета в неймспейсе
d8-system.
- строкаspec.backends.mirrors.ca
PEM-сертификат удостоверяющего центра для проверки зеркала.
- строкаspec.backends.mirrors.host
Обязательный параметр
Хост зеркала, опционально с портом.
- строкаspec.backends.mirrors.path
Префикс пути к репозиторию внутри зеркала.
- строкаspec.backends.mirrors.scheme
Протокол подключения к зеркалу.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- строкаspec.backends.name
Обязательный параметр
Роль бэкенда.
Storage— внутрикластерный кеш.Upstream— Primary upstream: либо единственный бэкенд, либо запасной путь, пока наполняется кеш.
Допустимые значения:
Storage,Upstream - строкаspec.backends.path
Префикс пути к репозиторию внутри бэкенда.
- строкаspec.backends.scheme
Протокол подключения к бэкенду.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- булевыйspec.cache
Ось кеша для этого узла.
true— агент идёт во внутрикластерное хранилище,false— напрямую в Primary upstream.
- объектstatus
Пишет только агент; сообщает факты со стороны containerd.
Полноты хранилища здесь нет: это свойство хранилища, и живёт оно в RegistryStorage
.status.replicas. Любой узел может пропатчитьstatusлюбогоRegistryNode, поскольку RBAC не умеет ограничиватьlist/watchпо field selector, — поэтому ничто здесь не является несущим для пути загрузки, это наблюдаемость.- массив строкstatus.activeBackends
Бэкенды, которыми агент может пользоваться в данный момент.
- массив объектовstatus.conditions
Детальное состояние, которое сообщает агент.
Reconciled— применён ли spec. Причина отличает штатное согласование от применения по дисковой копии из-за недоступности API-сервера.
- строкаstatus.conditions.lastTransitionTime
Обязательный параметр
Время последнего изменения состояния.
- строкаstatus.conditions.message
Пояснение для человека.
- целочисленныйstatus.conditions.observedGeneration
Поколение
spec, для которого выставлено состояние. - строкаstatus.conditions.reason
Обязательный параметр
Машиночитаемая причина состояния.
- строкаstatus.conditions.status
Обязательный параметр
Значение состояния.
Допустимые значения:
True,False,Unknown - строкаstatus.conditions.type
Обязательный параметр
Тип состояния.
- целочисленныйstatus.observedGeneration
Поколение
spec, которое агент применил последним. - булевыйstatus.proxyListening
Отдаёт ли агент эндпоинт хранилища образов контейнеров.
- булевыйstatus.reconciled
Применил ли агент тот spec, который видит сейчас.
- целочисленныйstatus.staleStorageDataBytes
Сколько данных внутрикластерного кеша всё ещё лежит на этом узле, при том что кеш не настроен.
Блобы остаются намеренно: если кеш включить обратно, он дольётся из того, что уже есть, а не с нуля, и на медленном канале это разница в часы. Недопустимо было бы оставлять их молча — про занятое ими место больше не сказал бы никто, потому что хранилище, которое их записало, уже удалено. Поэтому агент их измеряет, а алерт об этом сообщает.
Чтобы освободить место, удалите
/opt/deckhouse/registryна узле. Поля нет, пока кеш настроен, и на узле, где кеша никогда не было.
RegistryStorage
Short names: rstor
Scope: Cluster
Version: v1alpha1
Описывает, как работает внутрикластерное хранилище registry, и сообщает его фактическое состояние.
Объект пишет контроллер хранилища образов контейнеров, а читает контейнер-синкер, который перенастраивает distribution на лету. Именно этот путь позволяет смене ключей или сертификата примениться при неработающем операторе Deckhouse: он никогда не проходит через перегенерацию helm.
У объекта есть настоящий spec, а не только зеркало факта, потому что distribution нужно сообщать, что делать, а не только наблюдать за ним.
Используется единственный объект с именем registry.
- объектspec
Обязательный параметр
- булевыйspec.airGapRequested
Запрошена ли работа без upstream — независимо от того, отключён ли upstream уже фактически.
Это окно перехода: air-gap запрошен, upstream ещё удерживается, чтобы кластер продолжал работать, а образы приходят через
d8 mirror push, которых синкер не видит. Именно по этому признаку решается, что полноту нужно измерять чтением хранилища, а не подсчётом скопированного. Различие существенно: сквозной кеш пишет в собственное хранилище на каждом промахе, поэтому то же измерение на кеширующем кластере считало бы образы, которые кластер просто подтянул. - строкаspec.auth
Bearer-токен, защищающий хранилище.
Чувствительные данные. Авторизация не отключается никогда — в том числе в air-gap, где кеш отдаёт образы только на чтение.
- объектspec.garbageCollection
When and whether a replica reclaims the disk taken by releases the cluster has moved past.
Needed because nothing else ever removes anything: every release adds a slice of the repository, so a cluster that lives for years fills its store and then stops being able to pull.
Collecting puts one replica read-only for the duration — it keeps serving every image it holds, but cannot store the result of a cache miss and cannot accept a
d8 mirror push. Only one replica collects at a time, so the others are unaffected.- булевыйspec.garbageCollection.enabled
Whether replicas collect at all.
- строкаspec.garbageCollection.schedule
A five-field cron expression, in the replica’s own time zone.
Defaults to a night hour, or to the start of the
masternode group’s maintenance window when one is set — that being the time an operator has already declared safe for disruption.
- булевыйspec.needSync
Так контроллер выдаёт синкеру задание на наполнение или репликацию.
- булевыйspec.publish
Публиковать ли защищённую авторизацией точку записи (Ingress) для
d8 mirror push.Ключи на запись отличаются от ключей на чтение. Точка записи — это второй слушатель того же хранилища образов контейнеров: то же хранилище, но без кеша перед ним, поэтому её публикация ничего не стоит адресу, через который кластер тянет образы. Один слушатель не может одновременно проксировать upstream и принимать push.
- объектspec.source
Набор образов, который должен оказаться в хранилище.
- строкаspec.source.bundleRef
Имя набора образов.
- целочисленныйspec.source.expectedDigests
Количество уникальных дайджестов в наборе.
Допустимые значения:
0 <= X
- объектspec.store
Где
distributionхранит блобы.- строкаspec.store.path
Путь на узле. Константа модуля, не пользовательская настройка.
Пример:
path: "/opt/deckhouse/registry" - строкаspec.store.size
Бюджет хранилища каждой реплики, берётся из
storage.sizeв ModuleConfig: сколько могут занимать его блобы и незавершённые загрузки. Если не задан, бюджета нет; резерв для узла действует в любом случае.Шаблон:
^[0-9]+(\.[0-9]+)?(E|P|T|G|M|k|Ei|Pi|Ti|Gi|Mi|Ki)?$
- объектspec.upstream
Primary upstream, спроецированный сюда контроллером.
Задан — сквозной кеш. Не задан — кеш авторитетен (air-gap).
Контроллер убирает это поле только после того, как лидер полон, поэтому узлы никогда не остаются без источника образов — даже если пользователь уже убрал upstream из конфигурации.
- объектspec.upstream.auth
Где хранятся ключи доступа к этому эндпоинту.
Указаны ссылкой, а не значением. Ресурс кластерного уровня, а роль узлового агента привязана к группе
system:nodes, поэтому ключ, записанный здесь, был бы доступен через API kubelet’у любого узла — включая ключи к registry, откуда этот узел ничего не тянет. Компонент, который это читает, разрешает ссылку один раз и сохраняет результат, поэтому продолжает работать и при недоступном API-сервере.- объектspec.upstream.auth.secretRef
Секрет с ключами доступа и ключ внутри него.
- строкаspec.upstream.auth.secretRef.key
Обязательный параметр
Ключ внутри него. Один секрет содержит все разрешённые модулем ключи доступа, по принадлежности.
- строкаspec.upstream.auth.secretRef.name
Обязательный параметр
Имя секрета в неймспейсе
d8-system.
- строкаspec.upstream.ca
PEM-сертификат удостоверяющего центра для проверки хранилища образов контейнеров.
- строкаspec.upstream.host
Обязательный параметр
Хост хранилища образов контейнеров, опционально с портом.
- массив объектовspec.upstream.mirrors
Дополнительные адреса, отдающие тот же контент. Синкер загружает с любого доступного и хранит один дедуплицированный набор.
- объектspec.upstream.mirrors.auth
Где хранятся ключи доступа к этому эндпоинту.
Указаны ссылкой, а не значением. Ресурс кластерного уровня, а роль узлового агента привязана к группе
system:nodes, поэтому ключ, записанный здесь, был бы доступен через API kubelet’у любого узла — включая ключи к registry, откуда этот узел ничего не тянет. Компонент, который это читает, разрешает ссылку один раз и сохраняет результат, поэтому продолжает работать и при недоступном API-сервере.- объектspec.upstream.mirrors.auth.secretRef
Секрет с ключами доступа и ключ внутри него.
- строкаspec.upstream.mirrors.auth.secretRef.key
Обязательный параметр
Ключ внутри него. Один секрет содержит все разрешённые модулем ключи доступа, по принадлежности.
- строкаspec.upstream.mirrors.auth.secretRef.name
Обязательный параметр
Имя секрета в неймспейсе
d8-system.
- строкаspec.upstream.mirrors.ca
PEM-сертификат удостоверяющего центра для проверки зеркала.
- строкаspec.upstream.mirrors.host
Обязательный параметр
Хост зеркала, опционально с портом.
- строкаspec.upstream.mirrors.path
Префикс пути к репозиторию внутри зеркала.
- строкаspec.upstream.mirrors.scheme
Протокол подключения к зеркалу.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- строкаspec.upstream.path
Префикс пути к репозиторию внутри хранилища образов контейнеров.
- строкаspec.upstream.scheme
Протокол подключения к хранилищу образов контейнеров.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- объектstatus
- булевыйstatus.allReplicasFull
Содержат ли ожидаемый набор все реплики — тогда потеря лидера ничего не стоит.
- булевый
Снят ли upstream и стал ли кеш единственным источником образов.
- массив объектовstatus.conditions
Детальное состояние хранилища.
- строкаstatus.conditions.lastTransitionTime
Обязательный параметр
Время последнего изменения состояния.
- строкаstatus.conditions.message
Пояснение для человека.
- целочисленныйstatus.conditions.observedGeneration
Поколение
spec, для которого выставлено состояние. - строкаstatus.conditions.reason
Обязательный параметр
Машиночитаемая причина состояния.
- строкаstatus.conditions.status
Обязательный параметр
Значение состояния.
Допустимые значения:
True,False,Unknown - строкаstatus.conditions.type
Обязательный параметр
Тип состояния.
- объектstatus.fill
Прогресс текущего задания на наполнение.
- целочисленныйstatus.fill.filled
Сколько дайджестов записано на текущий момент.
- целочисленныйstatus.fill.total
Сколько дайджестов ожидается.
- строкаstatus.leader
Узел, который в данный момент держит lease лидера хранилища.
Это не обычные выборы: за lease борется только реплика, которая держит весь ожидаемый набор образов, а реплика, которая его держит, уступает, когда набор появляется у другой. Роль лидера несимметрична — именно из него реплицируют все follower’ы, и именно его полнота открывает переход в air-gap.
Без этого условия air-gap-кластер может застрять.
d8 mirror pushприходит через endpoint публикации и попадает на ту реплику, которую выбрал ingress, а не обязательно на лидера; пустому лидеру не из чего наливаться, follower’ы реплицируют его пустоту, а реплика с образами простаивает. Исключение — кластер, где полной реплики ещё нет ни одной, то есть состояние, с которого начинается любой кластер: тогда кто-то должен стать лидером, чтобы наливка вообще началась. - целочисленныйstatus.observedGeneration
Поколение
spec, на которое контроллер отреагировал последним. - строкаstatus.phase
Краткая сводка состояния наполнения.
Idle— задание на наполнение или проверку не выполняется.Filling— лидер наполняется.Verifying— содержимое проверяется противspec.source.Ready— лидер содержит ожидаемый набор.Failed— задание на наполнение или проверку завершилось ошибкой. В этом состоянии upstream не снимается.
Допустимые значения:
Idle,Filling,Verifying,Ready,Failed - массив объектовstatus.replicas
Состояние наполнения по репликам.
Это единственное место, где сообщается полнота хранилища. RegistryNode намеренно её не несёт: полнота — свойство хранилища, а не узла.
- строкаstatus.replicas.address
Адрес, на котором отвечает эта реплика, в виде
host:port.Сообщает сама реплика — чтобы follower мог реплицировать с лидера, не разрешая имя узла в адрес, и чтобы синкерам вообще не требовалось читать объекты Node.
- строкаstatus.replicas.collectedAt
When this replica last reclaimed its disk.
Absent until it has. Reported per replica because each collects its own store, one at a time: a cluster where one replica has not collected for a month while the others have is a different problem from one where none has.
- строкаstatus.replicas.collectionError
Why the last attempt to reclaim did not finish, empty when it did.
Separate from
error, which is about filling. A store that cannot be reclaimed still serves every image it holds, so the two say different things about how worried to be. - целочисленныйstatus.replicas.declaredDigests
Каков размер набора — то, из чего берётся
verifiedDigests.Сообщается репликой, потому что размер набора знает только та реплика, которая его вычисляет, и по этому числу ничего не решается. Пока его не было, единственным знаменателем для статуса оставался
spec.source.expectedDigests, который оператор указывает при объявлении air-gap и не указывает в остальных случаях — поэтому кластер с upstream всю свою самую длинную фазу показывалfilled: 0, total: 0, пока копировались гигабайты. Полнота по-прежнему выражается черезfull, а переход в air-gap по-прежнему решается поspec.source.expectedDigests: объявление оператора не подменяется числом, которое кластер вычислил про себя. - строкаstatus.replicas.error
Почему последнее задание на наполнение или проверку завершилось ошибкой — по отчёту синкера этой реплики. Пусто, если последнее задание прошло успешно.
Безопасность от этого поля не зависит: упавшая реплика просто не
full, а upstream снимается только когда лидер полон. Поле нужно, чтобы оператор мог отличить «ещё наполняется» от «сломалось», чего счётчики наполнения сами по себе не выражают. - булевыйstatus.replicas.full
Содержит ли эта реплика ожидаемый набор.
Вычисляется по тому, что синкер фактически записал, и никогда пробой пути выдачи: на промахе сквозной кеш сам подтянул бы образ из upstream и отчитался об успехе на пустом хранилище. В air-gap самонаполнение невозможно, поэтому там честно читать каталог и сравнивать с
spec.source.expectedDigests. - строкаstatus.replicas.node
Обязательный параметр
Узел, на котором работает реплика.
- строкаstatus.replicas.role
Роль реплики в репликации.
Leader— наполняется из upstream либо командойd8 mirror pushв air-gap и раздаёт задания на репликацию.Follower— наполняется от лидера заранее, поэтому потеря лидера не означает наполнения с нуля.
Допустимые значения:
Leader,Follower - строкаstatus.replicas.source
Реплика, от которой наполняется эта. Пусто для лидера.
- объектstatus.replicas.store
Сколько места на диске узла занимает хранилище этой реплики и принимает ли оно запись. Отсутствует, пока реплика не выполнила замер.
Оба предела registry соблюдает сам, при каждой записи. Здесь те же величины в подсчёте синкера — для статуса и алертов. Размеры округлены до 16 МиБ, занятое вверх, свободное вниз, чтобы общая с узлом файловая система не переписывала статус на каждом проходе.
- целочисленныйstatus.replicas.store.budgetBytes
storage.sizeиз настроек модуля. Отсутствует, если параметр не задан; тогда действует только резерв. - целочисленныйstatus.replicas.store.filesystemCapacityBytes
Обязательный параметр
Размер файловой системы хранилища.
- целочисленныйstatus.replicas.store.filesystemFreeBytes
Обязательный параметр
Свободное место на файловой системе хранилища. Если отдельного диска нет, это та же файловая система, которой пользуются kubelet и containerd.
- строкаstatus.replicas.store.reason
Предел, из-за которого отклоняются записи.
BudgetExhausted— хранилище заняло всё, что разрешаетstorage.size;ReserveExhausted— на файловой системе хранилища осталось только место, оставленное для узла.
Допустимые значения:
BudgetExhausted,ReserveExhausted - целочисленныйstatus.replicas.store.reserveBytes
Обязательный параметр
Сколько места на файловой системе хранилище оставляет свободным для узла: мягкий порог выселения kubelet плюс запас.
- целочисленныйstatus.replicas.store.usedBytes
Обязательный параметр
Сколько занимают блобы хранилища и незавершённые загрузки.
- булевыйstatus.replicas.store.writable
Обязательный параметр
false, пока хранилище отклоняет новые записи. Чтение не отклоняется никогда: полное хранилище отдаёт всё, что в нём есть, а образ, который сохранить не удалось, отдаётся потоком из upstream.
- целочисленныйstatus.replicas.totalDigests
Сколько различных дайджестов эта реплика хранит всего.
Это другая величина, чем
verifiedDigests, и по ней ничего не решается. Она нужна, чтобы хранилище, содержащее больше, чем требуется этому кластеру — загруженный bundle с другими модулями, другими редакциями, аттестациями — выглядело именно так, а не как недостача относительноspec.source.expectedDigests. - целочисленныйstatus.replicas.verifiedDigests
Сколько дайджестов из набора подтверждено на месте.
Набор — это то, что объявляют релизы кластера и сохраняемые модули, то есть дайджесты, известные deckhouse-controller. Поэтому это число напрямую сопоставимо с
fullи именно по нему принимается решение о переходе в air-gap. Всё остальное, что оказалось в хранилище, учитывается вtotalDigests. - строкаstatus.replicas.verifiedSet
Отпечаток набора, для которого реплика в последний раз признана полной (
full): версии платформы и модули кластера, каждый со своей версией и источником.fullверен только для того набора, по которому он измерен, а набор меняется: устанавливается модуль, обновляется платформа. Значение сообщает каждая реплика вместе со своимfull. Лидер сравнивает своё с набором, который нужен кластеру сейчас. Если они расходятся, лидер снимаетfullи перепроверяет хранилище, прежде чем на него сможет опереться переход в air-gap.fullдля другого набора не учитывается, когда реплики решают, кому быть лидером. Пусто, покаfullне установлен.
- булевыйstatus.safeToDropUpstream
Содержит ли лидер ожидаемый набор — это условие ухода в air-gap.
Намеренно только лидер, а не все реплики: реплики доливаются заранее и параллельно, поэтому ожидание всех задержало бы переход, не добавив безопасности.
RegistryUpstream
Short names: rup
Scope: Cluster
Version: v1alpha1
Объявляет дополнительное хранилище образов контейнеров, в которое кластер маршрутизирует загрузки, помимо основного.
Это штатный способ для модуля, администратора или пользователя добавить своё хранилище образов контейнеров. Модуль создаёт объект с ownerReference на себя, поэтому объект удаляется сборщиком мусора вместе с модулем; GitOps-инструмент, ведущий ModuleConfig, не конкурирует за владение полями, потому что каждый upstream — отдельный объект.
Трафик через такие upstream — всегда транзит: агент проксирует загрузку, подставляя ключи и сертификат удостоверяющего центра, и передаёт её потоком, не записывая ни на диск, ни в кеш. Место под кеш ограничено и отдано под компоненты Deckhouse — тем более в air-gap, где кеш является единственным источником образов.
Значение match, уже занятое другим объектом, или затеняющее путь Primary, отклоняется, а не сливается молча. См. status.conflict.
- объектspec
Обязательный параметр
- строкаspec.match
Обязательный параметр
Хост хранилища образов контейнеров, который перехватывается на узлах.
Шаблон:
^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?)*(:[0-9]{1,5})?$Пример:
match: images.virtualization.example.com - объектspec.upstream
Обязательный параметр
Куда фактически отправляются перехваченные загрузки.
- объектspec.upstream.auth
Ключи доступа к хранилищу образов контейнеров.
Чувствительные данные. Ключи хранятся внутри объекта, а не по ссылке на секрет, — так агент на узле остаётся самодостаточным при недоступном API-сервере.
- строкаspec.upstream.auth.auth
Заранее закодированное значение
base64("username:password").Имеет приоритет над
usernameиpassword, если задано. - строкаspec.upstream.auth.password
Пароль для базовой аутентификации.
- строкаspec.upstream.auth.username
Имя пользователя для базовой аутентификации.
- строкаspec.upstream.ca
PEM-сертификат удостоверяющего центра для проверки хранилища образов контейнеров при
scheme: HTTPS. - строкаspec.upstream.host
Обязательный параметр
Хост хранилища образов контейнеров, опционально с портом.
Пример:
host: registry-vendor.example.com - массив объектовspec.upstream.mirrors
Дополнительные адреса, отдающие тот же контент, что и хранилище образов контейнеров, — для отказоустойчивости.
- объектspec.upstream.mirrors.auth
Ключи доступа к зеркалу.
Чувствительные данные. См.
upstream.auth.- строкаspec.upstream.mirrors.auth.auth
Заранее закодированное значение
base64("username:password"). - строкаspec.upstream.mirrors.auth.password
Пароль для базовой аутентификации.
- строкаspec.upstream.mirrors.auth.username
Имя пользователя для базовой аутентификации.
- строкаspec.upstream.mirrors.ca
PEM-сертификат удостоверяющего центра для проверки зеркала.
- строкаspec.upstream.mirrors.host
Обязательный параметр
Хост зеркала, опционально с портом.
- строкаspec.upstream.mirrors.path
Префикс пути к репозиторию внутри зеркала.
- строкаspec.upstream.mirrors.scheme
Протокол подключения к зеркалу.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- строкаspec.upstream.path
Префикс пути к репозиторию внутри хранилища образов контейнеров.
Пример:
path: "/virt" - строкаspec.upstream.scheme
Протокол подключения к хранилищу образов контейнеров.
По умолчанию:
HTTPSДопустимые значения:
HTTP,HTTPS
- объектstatus
- булевыйstatus.accepted
Скомпилировал ли контроллер этот upstream в выкладку по узлам.
- массив объектовstatus.conditions
Результат арбитража с машиночитаемой причиной.
Accepted— входит ли upstream в выкладку по узлам.
- строкаstatus.conditions.lastTransitionTime
Обязательный параметр
Время последнего изменения состояния.
- строкаstatus.conditions.message
Пояснение для человека.
- целочисленныйstatus.conditions.observedGeneration
Поколение
spec, для которого выставлено состояние. - строкаstatus.conditions.reason
Обязательный параметр
Машиночитаемая причина состояния.
- строкаstatus.conditions.status
Обязательный параметр
Значение состояния.
Допустимые значения:
True,False,Unknown - строкаstatus.conditions.type
Обязательный параметр
Тип состояния.
- строкаstatus.conflict
Почему объект отклонён: какой объект уже занял
match, либо чтоmatchзатеняет путь Primary.Пусто, если объект принят.
- целочисленныйstatus.observedGeneration
Поколение
spec, на которое контроллер отреагировал последним.