Настройка правил автоматического экспонирования EventListener
Содержание
Чем поможет этот документОбзор функцииТочка входа для настройкиСправочник по полямСоответствие полей правила экспорта ресурсам IngressДиаграмма потока запросовПримеры конфигурацииПример 1: wildcard host с кастомным префиксомПример 2: общий hostname и префиксПример 3: правила для разных окруженийПример 4: публикация, ограниченная командой, с префиксом по умолчаниюПример 5: несколько внешних endpoint и изменённый префиксПример 6: настройка TLS/HTTPSВариант A: ручной TLS с заранее созданным SecretВариант B: использование cert-manager для автоматического управления сертификатамиВариант C: комбинированный TLS и аннотацииРабочий процесс настройкиПроверка и устранение неполадокПроверка содержимого ConfigMapПроверка объектов IngressПроверка адресов EventListenerПроверка аннотаций TriggerСоветы по устранению неполадокЧем поможет этот документ
Этот документ поможет вам настроить автоматическое внешнее экспонирование EventListener с помощью функции автоматического экспонирования. Вы узнаете:
- Как настроить правила экспорта для автоматического экспонирования EventListener через Ingress
- Как задать URL вебхуков, которые будут отображаться в UI
- Как настроить разные стратегии экспонирования для разных namespace или окружений
- Как проверить, что EventListener корректно экспонируются
Когда использовать: Используйте эту функцию, если хотите, чтобы система автоматически создавала ресурсы Ingress для ваших EventListener, избавляя от необходимости вручную создавать и управлять Ingress. Особенно полезно в продуктивных окружениях, где важны единообразные шаблоны URL вебхуков.
Требования: У вас должны быть права администратора кластера для настройки ресурсов TektonConfig, а также базовое понимание Kubernetes Ingress и сетевых концепций.
Обзор функции
Контроллер автоматического экспонирования (внутреннее имя trigger-wrapper) читает ConfigMap trigger-wrapper-config в системном namespace Tekton (по умолчанию: tekton-pipelines). Правила export-rules, определённые в этом ConfigMap, определяют, какие EventListener должны быть экспонированы внешне (Service, Ingress и т.д.) и заполняют статус EventListener/Trigger сгенерированными endpoint.
Техническое примечание: Внутреннее имя компонента — trigger-wrapper, но вам не нужно его запоминать. Достаточно настроить правила экспорта через TektonConfig, остальное система сделает автоматически.
Точка входа для настройки
В Alauda Tekton рекомендуется управлять этой конфигурацией через кастомный ресурс TektonConfig. Определения правил помещаются в spec.pipeline.options.configMaps.trigger-wrapper-config.data.config, например:
Оператор синхронизирует этот spec в ConfigMap trigger-wrapper-config в системном namespace Tekton (по умолчанию tekton-pipelines). После обновления контроллер автоматического экспонирования обновит кэш и выполнит согласование ресурсов согласно новым правилам.
Примечание: Имя ConfigMap trigger-wrapper-config — внутреннее техническое имя. Вы управляете конфигурацией через TektonConfig, как показано выше, и не взаимодействуете с ConfigMap напрямую.
Справочник по полям
Каждая запись в export-rules представляет стратегию публикации. Важные поля:
-
name – имя правила, также используется при генерации имён Service/Ingress.
-
ingressClass (необязательно) – контроллер Ingress, например
nginx,traefik. -
host (необязательно) – hostname, который будет сопоставляться Ingress. Оставьте пустым, чтобы принимать все хосты. Важно: При указании доменного имени убедитесь, что настроено разрешение DNS (или добавьте в
/etc/hostsдля локального тестирования). Домен должен разрешаться с систем, которые будут отправлять вебхуки. -
externalHosts (необязательно) – Что делает: Определяет 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вexternalHosts— контроллер добавит его автоматически - Если не уверены, оставьте пустым и сначала проверьте фактический доступный URL, затем обновите конфигурацию
- Контроллер комбинирует каждый URL из
-
urlPathPrefix (необязательно) – префикс пути; по умолчанию
/triggers. Итоговый путь в Ingress:${urlPathPrefix}/${eventlistener-namespace}/${eventlistener-name}. Всегда начинайте с/и избегайте завершающих слэшей. -
namespaceSelector.matchNames (необязательно) – namespace, на которые распространяется правило. Используйте
"*"для всех namespace. -
labelSelector (необязательно) – Kubernetes LabelSelector для фильтрации EventListener.
-
tls (необязательно) – конфигурация TLS для Ingress. Каждый элемент указывает
hosts(список хостов) иsecretName(имя TLS Secret с сертификатом). -
annotations (необязательно) – дополнительные аннотации для Ingress. Полезно для cert-manager, специфичных настроек nginx и т.п. Аннотации, управляемые контроллером (например,
nginx.ingress.kubernetes.io/rewrite-target), будут объединены с пользовательскими.
В настоящее время для выбора namespace поддерживается только
matchNames. Если нужна фильтрация по меткам namespace, перечислите namespace явно.
Соответствие полей правила экспорта ресурсам Ingress
Ниже таблица, показывающая, как поля export rule соответствуют полям сгенерированного ресурса Ingress:
Пример соответствия:
Для такого правила экспорта:
Настройка DNS: При использовании доменного имени в поле host убедитесь, что DNS-записи настроены для разрешения домена в IP контроллера Ingress. Для локального тестирования можно добавить записи в /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 пуст, принимаются любые имена хостов — удобно, если внешний шлюз назначает публичный домен.
Пример 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: публикация, ограниченная командой, с префиксом по умолчанию
Результат: экспонируются только EventListener в team-a по адресу /triggers/team-a/${eventlistener}.
Пример 5: несколько внешних endpoint и изменённый префикс
Результат:
- Ingress обслуживает
webhook.internal.local/internal/hooks/${namespace}/${eventlistener}внутри кластера. - Внешне доступны URL
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 для автоматического управления сертификатами
Настройте правило экспорта с аннотациями cert-manager:
cert-manager автоматически:
- Создаст ресурс Certificate
- Получит сертификат от Let's Encrypt (или другого настроенного issuer)
- Создаст TLS Secret
- Обновит Ingress с TLS-конфигурацией
Вариант C: комбинированный TLS и аннотации
Можно комбинировать ручную настройку TLS с дополнительными аннотациями:
Примечание: Если настроены одновременно
tlsи аннотации cert-manager, приоритет имеет конфигурацияtls. Для автоматического управления сертификатами используйте только аннотации cert-manager без поляtls.
Рабочий процесс настройки
- Отредактируйте ресурс
TektonConfig(см. раздел Точка входа для настройки). - Примените изменения:
kubectl apply -f tektonconfig.yaml. - Дождитесь, пока Оператор распространит ConfigMap; контроллер автоматического экспонирования автоматически согласует новые ресурсы.
Проверка и устранение неполадок
Проверка содержимого ConfigMap
Проверьте, что ConfigMap содержит ожидаемую конфигурацию:
Ожидаемый вывод (нормальный):
Что проверить:
- ConfigMap существует и содержит ключ
config - Массив
export-rulesсоответствует спецификации TektonConfig - YAML синтаксис корректен (нет ошибок парсинга)
Проверка объектов Ingress
Проверьте, что ресурсы Ingress созданы для подходящих EventListener:
Важно: <namespace> в команде — это namespace, где развернут EventListener, а не системный namespace (tekton-pipelines). Функция автоматического экспонирования создаёт Ingress в том же namespace, что и EventListener.
Ожидаемый вывод (нормальный):
Что проверить:
- Существуют объекты Ingress для EventListener, подходящих под правила экспорта
- Поле
HOSTSсовпадает сhostиз правила экспорта - Ingress имеет назначенный
ADDRESS(может появиться через несколько минут) - Если Ingress отсутствует, проверьте, что namespace входит в
matchNames, а метки EventListener соответствуютlabelSelector
Проверка адресов EventListener
Проверьте, что статус EventListener содержит сгенерированные адреса вебхуков:
Ожидаемый вывод (нормальный):
Что проверить:
- Массив
addressesсодержит URL, соответствующие конфигурацииexternalHosts - URL имеют формат:
<externalHost>/<urlPathPrefix>/<eventlistener-namespace>/<eventlistener-name> - Если
addressesпуст или отсутствует, EventListener может не подходить ни под одно правило экспорта
Проверка аннотаций Trigger
Проверьте метаданные экспорта, сохранённые в аннотациях Trigger:
Ожидаемый вывод (нормальный):
Что проверить:
- Аннотация содержит массив информации о EventListener
- Каждая запись включает поля
name,namespace,endpointsиrelevance - Массив
endpointsсовпадает сstatus.addressesEventListener relevance.scoreпоказывает, насколько хорошо EventListener подходит для Trigger (чем выше, тем лучше)- Если аннотация отсутствует, Trigger мог не найти подходящих EventListener
Советы по устранению неполадок
-
Если правило не применяется:
- Проверьте, что namespace указан в
matchNames(или используйте"*"для всех) - Убедитесь, что метки EventListener соответствуют
labelSelector - Проверьте, что EventListener находится в состоянии Ready
- Проверьте, что namespace указан в
-
Ошибки в селекторах меток:
- Отображаются в логах контроллера как ошибки парсинга
- Проверьте логи контроллера:
kubectl logs -n tekton-pipelines -l app=tektoncd-enhancement-controller
-
Удаление правила:
- Влечёт каскадное удаление сгенерированных ресурсов (Ingress, Service и т.д.)
- Установка
export-rulesв пустой массив отключает всё внешнее экспонирование - Поле
status.addressesEventListener очищается, если нет подходящих правил
-
Использование IP-адресов вместо доменных имён:
-
Проблема: Kubernetes Ingress не поддерживает IP-адреса в поле
host. Если указать IP вhost(например,host: 192.168.1.100), Ingress не создастся или не будет работать корректно. -
Решение 1: Оставьте
hostпустым или установите"*", чтобы принимать все хосты. Ingress будет сопоставлять запросы независимо от заголовка host: -
Решение 2: Настройте доменное имя, которое разрешается в ваш IP, и используйте его в поле
host:-
Настройте DNS: добавьте A-запись, указывающую домен на IP (например,
webhooks.example.com→192.168.1.100) -
Настройте правило экспорта с доменом:
-
-
Примечание:
externalHostsможет содержать IP-адреса или URL, так как используется только для заполненияstatus.addressesEventListener и не влияет на создание Ingress. Однако в самом Ingress полеhostдолжно содержать корректное имя хоста (или быть пустым).
-
Поддерживая ConfigMap через TektonConfig, вы гибко управляете тем, как Tekton EventListener экспонируются для внешних систем. Следите за логами контроллера при обновлениях, чтобы убедиться, что согласование прошло успешно.