Настройка правил автоматического экспонирования EventListener
Содержание
Что поможет вам сделать этот документОбзор функцииТочка входа для конфигурацииСправочник по полямСоответствие полей ресурсам IngressДиаграмма потока запросовПримеры конфигурацииПример 1: wildcard host с custom prefixПример 2: общий hostname и prefixПример 3: правила для разных окруженийПример 4: публикация в рамках team с default prefixПример 5: несколько внешних endpoint и скорректированный prefixПример 6: настройка TLS/HTTPSВариант A: ручной TLS с заранее созданным SecretВариант B: использование cert-manager для автоматического управления сертификатамиВариант C: комбинирование TLS и аннотацийПроцесс настройкиПроверка и устранение неполадокПроверка содержимого ConfigMapПроверка объектов IngressПроверка addresses EventListenerПроверка аннотаций TriggerСоветы по устранению неполадокЧто поможет вам сделать этот документ
Этот документ поможет вам настроить автоматическое внешнее экспонирование EventListener с помощью функции автоматического экспонирования. Вы узнаете:
- Как настроить правила экспорта, чтобы автоматически публиковать EventListener через Ingress
- Как настроить webhook URL, которые будут отображаться в UI
- Как настроить разные стратегии экспонирования для разных namespace или окружений
- Как проверить, что EventListener корректно экспонированы
Когда это использовать: Используйте эту функцию, если хотите, чтобы система автоматически создавала ресурсы Ingress для ваших EventListener, избавляя от необходимости вручную создавать и управлять ресурсами Ingress. Это особенно полезно в production-окружениях, где нужны единообразные шаблоны webhook URL.
Предварительные требования: У вас должны быть права cluster administrator для настройки ресурсов TektonConfig, а также базовое понимание Kubernetes Ingress и сетевых концепций.
Обзор функции
Контроллер автоматического экспонирования (внутреннее имя — trigger-wrapper) читает ConfigMap trigger-wrapper-config в системном namespace Tekton (по умолчанию: tekton-pipelines). Определённые в этой ConfigMap export-rules задают, какие EventListener должны быть экспонированы внешне (Service, Ingress и т. д.), и заполняют status EventListener/Trigger сгенерированными endpoint.
Техническая заметка: Внутреннее имя компонента — trigger-wrapper, но запоминать его не требуется. Вам нужно только настроить правила экспорта через TektonConfig, а остальное система выполнит автоматически.
Точка входа для конфигурации
В Alauda Tekton рекомендуется управлять этой конфигурацией через custom resource TektonConfig. Вложите определения правил в spec.pipeline.options.configMaps.trigger-wrapper-config.data.config, например:
Operator синхронизирует эту спецификацию в ConfigMap trigger-wrapper-config внутри системного namespace Tekton (по умолчанию: tekton-pipelines). После обновления контроллер автоматического экспонирования обновит свой cache и выполнит reconcile ресурсов в соответствии с новыми правилами.
Примечание: Имя 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для локального тестирования). Домен должен быть разрешаемым с систем, которые будут отправлять webhooks. -
externalHosts (optional) – Что делает: задаёт webhook URL, которые будут отображаться пользователям в UI и попадут в поле
status.addressesу EventListener.Можно считать это: «публичным адресом», который внешние системы (например, GitHub, GitLab) будут использовать для отправки webhooks в ваш 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, что позволяет легко копировать их в конфигурацию webhook в GitHub/GitLab
Типовые сценарии:
Что произойдёт, если указать неверно?
- ✅ Ingress по-прежнему будет работать корректно (это поле не влияет на создание Ingress)
- ❌ Пользователи увидят некорректные webhook URL в UI
- ❌ Копирование URL из
status.addressesв GitHub/GitLab завершится ошибкой - 🔧 Исправление: обновите значение
externalHostsв TektonConfig, и контроллер обновит status EventListener
Ключевые отличия от поля
host:Практическое правило:
- Если webhook доступен по адресу
https://webhooks.example.com:8443/triggers/ns/el, тогда укажите:externalHosts: ["https://webhooks.example.com:8443"] - Контроллер автоматически добавит path
Важные замечания:
- Всегда указывайте protocol (
http://илиhttps://) - Указывайте custom ports, если ваш LoadBalancer использует нестандартные порты
- Не включайте path в
urlPathPrefix(например,/triggers) — контроллер автоматически добавит его в конецexternalHosts - Если вы не уверены, оставьте поле пустым и сначала проверьте фактически доступный URL, а затем обновите конфигурацию
- Контроллер объединяет каждый URL из
-
urlPathPrefix (optional) – префикс path; по умолчанию
/triggers. Итоговый path, формируемый в Ingress, имеет вид${urlPathPrefix}/${eventlistener-namespace}/${eventlistener-name}. Всегда начинайте с/и избегайте завершающих слэшей. -
namespaceSelector.matchNames (optional) – namespace, разрешённые этим правилом. Используйте
"*"для выбора всех namespace. -
labelSelector (optional) – Kubernetes LabelSelector, используемый для фильтрации EventListener.
-
tls (optional) – TLS configuration для Ingress. Каждая запись задаёт
hosts(список hostnames) иsecretName(имя TLS Secret, содержащего сертификат). -
annotations (optional) – дополнительные аннотации для Ingress. Полезно для cert-manager, специфичных настроек nginx и т. д. Аннотации, управляемые controller'ом (например,
nginx.ingress.kubernetes.io/rewrite-target), будут объединены с аннотациями, заданными пользователем.
Сопоставление namespace сейчас поддерживает только
matchNames. Если вам нужен выбор namespace по label, перечислите namespace явно.
Соответствие полей ресурсам Ingress
В следующей таблице показано, как поля export rule сопоставляются с сгенерированным ресурсом Ingress:
Пример сопоставления:
Для такого export rule:
Настройка 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и аннотации, управляемые controller'ом
Диаграмма потока запросов
externalHostsсообщает внешним клиентам, по какому URL обращаться. Ingress по-прежнему сопоставляет запросы поhostи${urlPathPrefix}/${namespace}/${eventlistener}, а backend Service получает ровно этот path.
Примеры конфигурации
Пример 1: wildcard host с custom prefix
Результат: Ingress экспонирует /hooks/default/${namespace}/${eventlistener}. Поскольку host пустой, будет принят любой hostname — это удобно, когда внешний gateway назначает публичный домен.
Пример 2: общий hostname и prefix
Результат: каждый EventListener будет доступен по https://webhooks.example.com/triggers/${namespace}/${eventlistener}; backend увидит тот же path.
Пример 3: правила для разных окружений
Результат:
- GitLab webhooks:
https://gitlab-staging.example.com/staging/gitlab/${namespace}/${eventlistener} - GitHub webhooks:
https://github-prod.example.com/prod/github/${namespace}/${eventlistener}
Пример 4: публикация в рамках team с default prefix
Результат: публикуются только EventListener в team-a, по адресу /triggers/team-a/${eventlistener}.
Пример 5: несколько внешних endpoint и скорректированный prefix
Результат:
- 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, содержащий ваш сертификат:
-
Настройте export rule с TLS:
Контроллер автоматически настроит Ingress с TLS, используя указанный Secret.
Вариант B: использование cert-manager для автоматического управления сертификатами
Настройте export rule с аннотациями cert-manager:
cert-manager автоматически выполнит:
- Создание ресурса Certificate
- Получение сертификата от Let's Encrypt (или вашего настроенного issuer)
- Создание TLS Secret
- Обновление Ingress с TLS configuration
Вариант C: комбинирование TLS и аннотаций
Можно сочетать ручную настройку TLS с дополнительными аннотациями:
Примечание: Если одновременно настроены
tlsи аннотации cert-manager, приоритет имеет конфигурацияtls. Для автоматического управления сертификатами используйте аннотации cert-manager без настройкиtls.
Процесс настройки
- Отредактируйте ресурс
TektonConfig(см. Точка входа для конфигурации). - Примените изменения:
kubectl apply -f tektonconfig.yaml. - Дождитесь, пока Operator распространит ConfigMap; после этого контроллер автоматического экспонирования автоматически выполнит reconcile новых ресурсов.
Проверка и устранение неполадок
Проверка содержимого ConfigMap
Убедитесь, что ConfigMap содержит ожидаемую конфигурацию:
Ожидаемый вывод (нормально):
Что проверять:
- ConfigMap существует и содержит ключ
config - Массив
export-rulesсоответствует спецификации TektonConfig - Синтаксис YAML корректен (нет ошибок разбора)
Проверка объектов Ingress
Проверьте, что ресурсы Ingress созданы для подходящих EventListener:
Важно: <namespace> в команде должен быть namespace, где развернут ваш EventListener, а не системный namespace (tekton-pipelines). Функция автоматического экспонирования создаёт ресурсы Ingress в том же namespace, что и EventListener.
Ожидаемый вывод (нормально):
Что проверять:
- Объекты Ingress существуют для EventListener, которые соответствуют export rules
- Поле
HOSTSсоответствуетhost, заданному в export rule - Ingress имеет назначенный
ADDRESS(это может занять несколько минут) - Если Ingress не появился, проверьте, что namespace соответствует
matchNames, а labels EventListener соответствуютlabelSelector
Проверка addresses EventListener
Убедитесь, что status EventListener содержит сгенерированные webhook addresses:
Ожидаемый вывод (нормально):
Что проверять:
- Массив
addressesсодержит URL, соответствующие конфигурацииexternalHosts - URL следуют шаблону:
<externalHost>/<urlPathPrefix>/<eventlistener-namespace>/<eventlistener-name> - Если
addressesпуст или отсутствует, возможно, EventListener не соответствует ни одному export rule
Проверка аннотаций Trigger
Проверьте метаданные экспорта, сохранённые в аннотациях Trigger:
Ожидаемый вывод (нормально):
Что проверять:
- Аннотация содержит массив информации об EventListener
- Каждый элемент включает поля
name,namespace,endpointsиrelevance - Массив
endpointsсоответствуетstatus.addressesEventListener relevance.scoreпоказывает, насколько хорошо EventListener соответствует Trigger (чем выше, тем лучше)- Если аннотация отсутствует, возможно, Trigger не нашёл ни одного подходящего EventListener
Советы по устранению неполадок
-
Если правило не применяется:
- Убедитесь, что namespace указан в
matchNames(или используйте"*"для всех namespace) - Проверьте, что labels EventListener удовлетворяют требованиям
labelSelector - Убедитесь, что EventListener находится в состоянии
Ready
- Убедитесь, что namespace указан в
-
Неверно настроенные label selector:
- Отображаются в логах controller как ошибки разбора
- Проверьте логи controller:
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) -
Настройте export rule с доменным именем:
-
-
Примечание:
externalHostsможет содержать IP-адреса или URL, поскольку используется только для заполненияstatus.addressesEventListener и не влияет на создание Ingress. Однако сам Ingress должен использовать корректный hostname (или быть пустым) в полеhost.
-
Поддерживая ConfigMap через TektonConfig, вы можете гибко управлять тем, как EventListener Tekton публикуются для внешних систем. Следите за логами controller во время обновлений, чтобы подтвердить, что reconcile завершился успешно.