Настройка правил автоматического экспонирования EventListener
Содержание
Что поможет вам сделать этот документОбзор функцииТочка входа в конфигурациюОписание полейСопоставление полей с ресурсами IngressДиаграмма потока запросовПримеры конфигурацииПример 1: wildcard host с кастомным префиксомПример 2: общий hostname и префиксПример 3: правила для разных окруженийПример 4: публикация в рамках team с префиксом по умолчаниюПример 5: несколько внешних endpoint'ов и изменённый префиксПример 6: настройка TLS/HTTPSВариант A: ручной TLS с заранее созданным SecretВариант B: использование cert-manager для автоматического управления сертификатамиВариант C: комбинирование TLS и annotationsПорядок настройкиПроверка и устранение неполадокПроверка содержимого ConfigMapПроверка объектов IngressПроверка адресов EventListenerПроверка annotations TriggerСоветы по устранению неполадокЧто поможет вам сделать этот документ
Этот документ поможет вам настроить автоматическое внешнее экспонирование EventListeners с помощью функции автоматического экспонирования. Вы узнаете:
- Как настроить правила экспонирования, чтобы автоматически публиковать EventListeners через Ingress
- Как настроить URL вебхуков, которые будут отображаться в UI
- Как настроить разные стратегии экспонирования для разных namespaces или окружений
- Как проверить, что EventListeners экспонируются корректно
Когда это использовать: используйте эту функцию, когда хотите, чтобы система автоматически создавала ресурсы Ingress для ваших EventListeners, избавляя от необходимости вручную создавать и управлять ресурсами Ingress. Это особенно полезно в production-окружениях, где вам нужны согласованные шаблоны URL вебхуков.
Требования: у вас должны быть права cluster administrator для настройки ресурсов TektonConfig, а также базовое понимание Kubernetes Ingress и сетевых концепций.
Обзор функции
Контроллер автоматического экспонирования (внутреннее имя trigger-wrapper) читает ConfigMap trigger-wrapper-config в системном namespace Tekton (по умолчанию: tekton-pipelines). export-rules, определённые в этом ConfigMap, определяют, какие EventListeners должны быть опубликованы внешне (Service, Ingress и т. д.), и заполняют статус EventListener/Trigger сгенерированными endpoint'ами.
Техническая заметка: внутреннее имя компонента — trigger-wrapper, но запоминать его не нужно. Достаточно настраивать правила экспонирования через TektonConfig, а система автоматически выполнит остальную работу.
Точка входа в конфигурацию
В Alauda Tekton рекомендуется управлять этой конфигурацией через пользовательский ресурс TektonConfig. Вложите определения правил в spec.pipeline.options.configMaps.trigger-wrapper-config.data.config, например:
Operator синхронизирует этот spec в ConfigMap trigger-wrapper-config внутри системного namespace Tekton (по умолчанию: tekton-pipelines). После обновления контроллер автоматического экспонирования обновит свой кэш и выполнит reconciliation ресурсов согласно новым правилам.
Примечание: имя ConfigMap trigger-wrapper-config — это внутреннее техническое имя. Вы управляете конфигурацией через TektonConfig, как показано выше, и вам не нужно напрямую взаимодействовать с ConfigMap.
Описание полей
Каждая запись в export-rules представляет стратегию публикации. Важные поля:
-
name – имя правила, также используется при генерации имён Service/Ingress.
-
ingressClass (optional) – Ingress controller, который нужно использовать, например
nginx,traefik. -
host (optional) – hostname, сопоставляемый Ingress. Оставьте пустым, чтобы принимать все hosts. Важно: при настройке доменного имени убедитесь, что DNS resolution настроена корректно (или добавьте запись в
/etc/hostsдля локального тестирования). Домен должен быть разрешим с систем, которые будут отправлять вебхуки. -
externalHosts (optional) – Что это делает: определяет URL вебхуков, которые будут показаны пользователям в UI и заполнены в поле
status.addressesEventListener.Можно воспринимать это как: "публичный адрес", который внешние системы (например, GitHub, GitLab) будут использовать для отправки вебхуков в ваш EventListener.
Как это работает:
- Контроллер объединяет каждый URL из
externalHostsс сгенерированным путём:${externalHost}/<urlPathPrefix>/<eventlistener-namespace>/<eventlistener-name> - Например:
externalHosts: ["https://webhooks.example.com"]+urlPathPrefix: /triggers→ итоговый URL:https://webhooks.example.com/triggers/my-namespace/my-listener - Эти URL отображаются в поле
status.addressesEventListener, что упрощает их копирование и вставку в конфигурацию вебхуков GitHub/GitLab
Типовые сценарии:
Что будет, если указать неверно?
- ✅ Ingress по-прежнему будет работать корректно (это поле не влияет на создание Ingress)
- ❌ Пользователи увидят неверные URL вебхуков в UI
- ❌ Копирование URL из
status.addressesв GitHub/GitLab завершится неудачей - 🔧 Исправление: обновите значение
externalHostsв TektonConfig, и контроллер обновит статус EventListener
Ключевые отличия от поля
host:Практическое правило:
- Если вы можете открыть вебхук по адресу
https://webhooks.example.com:8443/triggers/ns/el, тогда укажите:externalHosts: ["https://webhooks.example.com:8443"] - Контроллер автоматически добавит путь
Важные замечания:
- Всегда указывайте протокол (
http://илиhttps://) - Указывайте кастомные порты, если ваш LoadBalancer использует нестандартные порты
- Не включайте путь в
urlPathPrefix(например,/triggers) — контроллер автоматически добавляет его в конецexternalHosts - Если не уверены, оставьте значение пустым и сначала проверьте фактически доступный URL, затем обновите конфигурацию
- Контроллер объединяет каждый URL из
-
urlPathPrefix (optional) – префикс пути; по умолчанию
/triggers. Итоговый путь, формируемый в Ingress, имеет вид${urlPathPrefix}/${eventlistener-namespace}/${eventlistener-name}. Всегда начинайте с/и избегайте завершающего слэша. -
namespaceSelector.matchNames (optional) – namespaces, разрешённые этим правилом. Используйте
"*"для применения ко всем namespaces. -
labelSelector (optional) – Kubernetes LabelSelector, используемый для фильтрации EventListeners.
-
tls (optional) – TLS-конфигурация для Ingress. Каждая запись задаёт
hosts(список hostnames) иsecretName(имя TLS Secret, содержащего сертификат). -
annotations (optional) – дополнительные annotations для Ingress. Полезно для cert-manager, настроек nginx и т. д. Аннотации, управляемые контроллером (например,
nginx.ingress.kubernetes.io/rewrite-target), будут объединены с аннотациями, заданными пользователем.
Сопоставление namespaces в настоящее время поддерживает только
matchNames. Если вам нужна выборка namespaces по labels, перечислите namespaces явно.
Сопоставление полей с ресурсами Ingress
Следующая таблица показывает, как поля правила экспонирования отображаются в сгенерированном ресурсе Ingress:
Пример сопоставления:
Для такого правила экспонирования:
Настройка DNS: при использовании доменного имени в поле host убедитесь, что DNS-записи настроены так, чтобы домен разрешался в IP вашего Ingress controller. Для локального тестирования можно добавить записи в /etc/hosts (Linux/Mac) или C:\Windows\System32\drivers\etc\hosts (Windows).
Сгенерированный Ingress будет иметь:
metadata.name:test-webhooksspec.ingressClassName:nginxspec.rules[0].host:webhooks.example.comspec.rules[0].http.paths[].path:/triggers/${namespace}/${eventlistener-name}(для каждого EventListener, который подходит по правилам)spec.tls[0].hosts:["webhooks.example.com"]spec.tls[0].secretName:webhooks-tls-secretmetadata.annotations: включаетcert-manager.io/cluster-issuerи аннотации, управляемые контроллером
Диаграмма потока запросов
externalHostsуказывает внешним клиентам, по какому URL выполнять запрос. Ingress по-прежнему сопоставляет запросы поhostи${urlPathPrefix}/${namespace}/${eventlistener}, а backend Service получает именно этот путь.
Примеры конфигурации
Пример 1: wildcard host с кастомным префиксом
Результат: Ingress публикует /hooks/default/${namespace}/${eventlistener}. Поскольку host пустой, будет принят любой hostname — это идеально, если внешний gateway назначает публичный домен.
Пример 2: общий hostname и префикс
Результат: каждый EventListener доступен по адресу https://webhooks.example.com/triggers/${namespace}/${eventlistener}; backend видит тот же путь.
Пример 3: правила для разных окружений
Результат:
- Вебхуки GitLab:
https://gitlab-staging.example.com/staging/gitlab/${namespace}/${eventlistener} - Вебхуки GitHub:
https://github-prod.example.com/prod/github/${namespace}/${eventlistener}
Пример 4: публикация в рамках team с префиксом по умолчанию
Результат: только EventListeners в team-a будут экспонированы по адресу /triggers/team-a/${eventlistener}.
Пример 5: несколько внешних endpoint'ов и изменённый префикс
Результат:
- Ingress обслуживает
webhook.internal.local/internal/hooks/${namespace}/${eventlistener}внутри кластера. - Снаружи вы можете публиковать
https://webhooks.example.com/hooks/internal/hooks/${namespace}/${eventlistener}иhttps://backup.example.com/api/hooks/internal/hooks/${namespace}/${eventlistener}. - Backend Service всегда получает
/internal/hooks/${namespace}/${eventlistener}.
Пример 6: настройка TLS/HTTPS
Вариант A: ручной TLS с заранее созданным Secret
-
Создайте TLS Secret, содержащий ваш сертификат:
-
Настройте правило экспонирования с TLS:
Контроллер автоматически настроит Ingress с TLS с использованием указанного Secret.
Вариант B: использование cert-manager для автоматического управления сертификатами
Настройте правило экспонирования с annotations cert-manager:
cert-manager автоматически:
- Создаст ресурс Certificate
- Получит сертификат от Let's Encrypt (или от настроенного вами issuer)
- Создаст TLS Secret
- Обновит Ingress с TLS-конфигурацией
Вариант C: комбинирование TLS и annotations
Вы можете сочетать ручную TLS-конфигурацию с дополнительными annotations:
Примечание: когда одновременно настроены
tlsи annotations cert-manager, приоритет имеет конфигурацияtls. Для автоматического управления сертификатами используйте annotations cert-manager без конфигурацииtls.
Порядок настройки
- Отредактируйте ресурс
TektonConfig(см. Точка входа в конфигурацию). - Примените изменения:
kubectl apply -f tektonconfig.yaml. - Дождитесь, пока Operator распространит ConfigMap; после этого контроллер автоматического экспонирования автоматически выполнит reconciliation новых ресурсов.
Проверка и устранение неполадок
Проверка содержимого ConfigMap
Проверьте, что ConfigMap содержит ожидаемую конфигурацию:
Ожидаемый вывод (нормально):
Что проверить:
- ConfigMap существует и содержит ключ
config - Массив
export-rulesсоответствует вашей спецификации TektonConfig - Синтаксис YAML корректен (нет ошибок разбора)
Проверка объектов Ingress
Проверьте, что ресурсы Ingress создаются для подходящих EventListeners:
Важно: <namespace> в команде должен быть namespace, в котором развернут ваш EventListener, а не системный namespace (tekton-pipelines). Функция автоматического экспонирования создаёт ресурсы Ingress в том же namespace, что и EventListener.
Ожидаемый вывод (нормально):
Что проверить:
- Объекты Ingress существуют для EventListeners, которые соответствуют правилам экспонирования
- Поле
HOSTSсоответствуетhost, указанному в правиле экспонирования - У Ingress назначен
ADDRESS(это может занять несколько минут) - Если Ingress не появился, проверьте, что namespace соответствует
matchNames, а labels EventListener соответствуютlabelSelector
Проверка адресов EventListener
Проверьте, что статус EventListener содержит сгенерированные URL вебхуков:
Ожидаемый вывод (нормально):
Что проверить:
- Массив
addressesсодержит URL, соответствующие вашей конфигурацииexternalHosts - URL следуют шаблону:
<externalHost>/<urlPathPrefix>/<eventlistener-namespace>/<eventlistener-name> - Если
addressesпустой или отсутствует, возможно, EventListener не соответствует ни одному правилу экспонирования
Проверка annotations Trigger
Проверьте метаданные экспонирования, сохранённые в annotations Trigger:
Ожидаемый вывод (нормально):
Что проверить:
- Annotation содержит массив информации об EventListener
- Каждая запись включает поля
name,namespace,endpointsиrelevance - Массив
endpointsсоответствуетstatus.addressesEventListener relevance.scoreпоказывает, насколько хорошо EventListener соответствует Trigger (чем выше, тем лучше)- Если annotation отсутствует, возможно, Trigger не нашёл подходящих EventListeners
Советы по устранению неполадок
-
Если правило не применяется:
- Убедитесь, что namespace указан в
matchNames(или используйте"*"для всех namespaces) - Проверьте, что labels EventListener удовлетворяют требованиям
labelSelector - Убедитесь, что EventListener находится в состоянии
Ready
- Убедитесь, что namespace указан в
-
Неправильно настроенные label selectors:
- Отображаются в логах контроллера как ошибки разбора
- Проверьте логи контроллера:
kubectl logs -n tekton-pipelines -l app=tektoncd-enhancement-controller
-
Удаление правила:
- Приводит к каскадному удалению сгенерированных ресурсов (Ingress, Service и т. д.)
- Установка
export-rulesв пустой массив отключает всё внешнее экспонирование status.addressesEventListener будет очищен, когда не совпадёт ни одно правило
-
Использование IP-адресов вместо доменных имён:
-
Проблема: ресурсы Kubernetes Ingress не поддерживают IP-адреса в качестве значений
host. Если вы укажетеhostс IP-адресом (например,host: 192.168.1.100), Ingress не будет создан или не будет работать корректно. -
Решение 1: оставьте
hostпустым или задайте"*"для принятия всех hosts. Ingress будет сопоставлять запросы независимо от host header: -
Решение 2: настройте доменное имя, которое разрешается в ваш IP-адрес, и затем используйте этот домен в поле
host:-
Настройте DNS resolution: добавьте A record, указывающий ваш домен на IP-адрес (например,
webhooks.example.com→192.168.1.100) -
Настройте правило экспонирования с использованием доменного имени:
-
-
Примечание:
externalHostsможет содержать IP-адреса или URL, так как он используется только для заполненияstatus.addressesEventListener и не влияет на создание Ingress. Однако сам Ingress должен использовать допустимый hostname (или быть пустым) в полеhost.
-
Поддерживая ConfigMap через TektonConfig, вы можете гибко управлять тем, как EventListeners Tekton экспонируются внешним системам. Во время обновлений следите за логами контроллера, чтобы подтвердить успешное завершение reconciliation.