Проверка ConfigMap
Tekton Pruner использует ValidatingWebhook для обеспечения соответствия ConfigMap требуемым спецификациям перед их созданием или обновлением в кластере. В этом документе объясняется, как работает проверка и какие требования должны быть выполнены.
Содержание
ОбзорКак работает проверкаПравила проверки1. Обязательные метки2. Ограничения на селекторы3. Требования к именам3. Ограничения по namespace4. Проверка содержимого конфигурации5. Защита от удаления6. Принудительное соблюдение глобальной конфигурацииРаспространённые ошибки проверкиОшибка отсутствия метокОшибка неправильного типа конфигурацииОшибка неправильного имениОшибка превышения глобального лимитаОшибка блокировки удаленияУстранение неполадокПроверка статуса webhookТестирование проверкиОбход проверки (не рекомендуется)Рекомендуемые практикиОбзор
Webhook pruner проверяет ConfigMap для:
- Принудительного применения обязательных меток и соглашений об именах
- Предотвращения применения некорректных конфигураций
- Защиты от случайного удаления критически важных конфигураций
- Обеспечения соблюдения глобальных границ для конфигураций на уровне namespace
Как работает проверка
Webhook проверки автоматически устанавливается вместе с pruner и перехватывает операции CREATE, UPDATE и DELETE для ConfigMap. Он проверяет только ConfigMap с меткой app.kubernetes.io/part-of: tekton-pruner, что гарантирует отсутствие влияния на обычные ConfigMap в вашем кластере.
Правила проверки
1. Обязательные метки
Все ConfigMap pruner ДОЛЖНЫ иметь следующие метки:
Проверка включает:
- Обе метки должны присутствовать
app.kubernetes.io/part-ofдолжен быть равенtekton-prunerpruner.tekton.dev/config-typeдолжен быть либоglobal, либоnamespace
Пример ошибки:
2. Ограничения на селекторы
КРИТИЧНО: Селекторы (matchLabels/matchAnnotations) поддерживаются ТОЛЬКО в ConfigMap уровня namespace (tekton-pruner-namespace-spec), НЕЛЬЗЯ использовать в глобальных ConfigMap.
Допустимо — селекторы в ConfigMap namespace:
Недопустимо — селекторы в глобальном ConfigMap:
Пример ошибки:
Почему такое ограничение?
- Селекторное сопоставление ресурсов требует доступа к меткам/аннотациям ресурса во время выполнения
- Глобальные ConfigMap предназначены для настроек по умолчанию на уровне всего кластера, а не для сопоставления конкретных ресурсов
- ConfigMap уровня namespace обеспечивают правильную область для динамического выбора ресурсов
См. также: Resource Groups для примеров использования селекторов
3. Требования к именам
Глобальная конфигурация:
- Имя: должно быть
tekton-pruner-default-spec(фиксированное) - Namespace: должен быть
tekton-pipelines(или системный namespace) - Метка:
pruner.tekton.dev/config-type: global
Конфигурация namespace:
- Имя: должно быть
tekton-pruner-namespace-spec(фиксированное) - Namespace: должен быть пользовательским namespace (НЕ системным или tekton namespace)
- Метка:
pruner.tekton.dev/config-type: namespace
Примеры ошибок:
3. Ограничения по namespace
Запрещённые namespace для конфигураций уровня namespace:
- Системные namespace:
kube-* - Tekton namespace:
tekton-pipelines,tekton-*
Попытка создать конфигурацию уровня namespace в этих пространствах имён будет отклонена.
Пример ошибки:
4. Проверка содержимого конфигурации
Webhook проверяет данные конфигурации, включая:
- Временные значения: ttlSecondsAfterFinished должен быть неотрицательным
- Лимиты истории: historyLimit, successfulHistoryLimit и failedHistoryLimit должны быть неотрицательными и не превышать глобальные максимумы, если они применяются
- Селекторы (только для ConfigMap namespace): селекторы меток и аннотаций должны содержать корректные пары ключ-значение; селекторы по имени должны быть валидными именами ресурсов
Примечание: Селекторы (массивы pipelineRuns, taskRuns с matchLabels/matchAnnotations) обрабатываются только в ConfigMap уровня namespace. В глобальных ConfigMap они игнорируются.
5. Защита от удаления
Webhook предотвращает удаление глобальной конфигурации, если существуют конфигурации уровня namespace. Необходимо удалить все namespace-конфигурации перед удалением глобальной. Конфигурации namespace можно удалять без ограничений.
6. Принудительное соблюдение глобальной конфигурации
При создании или обновлении конфигураций уровня namespace webhook получает глобальную конфигурацию и проверяет, чтобы значения namespace не превышали глобальные максимумы, если они определены (например, maxTTLSecondsAfterFinished, maxHistoryLimit).
Распространённые ошибки проверки
Ошибка отсутствия меток
Решение: Добавьте обязательные метки в ваш ConfigMap:
Ошибка неправильного типа конфигурации
Решение: Используйте только значения global или namespace для config-type.
Ошибка неправильного имени
Решение: Используйте точное требуемое имя:
- Глобальная:
tekton-pruner-default-spec - Namespace:
tekton-pruner-namespace-spec
Ошибка превышения глобального лимита
Решение: Уменьшите значение в namespace до глобальных лимитов или попросите администратора увеличить глобальный максимум.
Ошибка блокировки удаления
Решение: Сначала удалите все namespace-конфигурации:
Устранение неполадок
Проверка статуса webhook
Тестирование проверки
Создайте некорректный ConfigMap, чтобы проверить работу webhook:
Ожидаемая ошибка: admission webhook denied the request: Invalid pruner ConfigMap labels
Обход проверки (не рекомендуется)
Внимание: Обход проверки может привести к некорректной работе pruner и должен использоваться только в экстренных случаях.
Для временного обхода проверки:
-
Удалите идентифицирующую метку:
-
Внесите необходимые изменения
-
Восстановите метку:
Примечание: Контроллер pruner не будет обрабатывать ConfigMap без правильных меток.
Рекомендуемые практики
- Всегда включайте обязательные метки с самого начала
- Используйте точные соглашения об именах для глобальных и namespace конфигураций
- Тестируйте конфигурации сначала в непроизводственном namespace
- Внимательно проверяйте ошибки валидации — они указывают, что нужно исправить
- Мониторьте логи webhook при внедрении новых конфигураций
- Удаляйте namespace-конфигурации перед попыткой удалить глобальную конфигурацию