Настройка правил автоматического экспонирования EventListener
Содержание
Чем поможет этот документОбзор функцииТочка входа для настройкиСправочник по полямСоответствие полей ресурсам IngressДиаграмма потока запросовПримеры конфигурацийПример 1: универсальный хост с пользовательским префиксомПример 2: общий хост и префиксПример 3: правила для разных окруженийПример 4: публикация для команды с префиксом по умолчаниюПример 5: несколько внешних точек доступа и изменённый префиксПример 6: настройка TLS/HTTPSВариант A: ручной TLS с заранее созданным SecretВариант B: использование cert-manager для автоматического управления сертификатамиВариант C: комбинированный TLS и аннотацииРабочий процесс настройкиПроверка и устранение неполадокПроверка содержимого ConfigMapПроверка объектов IngressПроверка адресов EventListenerПроверка аннотаций TriggerСоветы по устранению неполадокЧем поможет этот документ
Этот документ поможет вам настроить автоматическое внешнее экспонирование EventListener с помощью функции автоматического экспонирования. Вы узнаете:
- Как настроить правила экспорта для автоматического экспонирования EventListener через Ingress
- Как задать URL вебхуков, которые будут отображаться в UI
- Как настроить разные стратегии экспонирования для разных пространств имён или окружений
- Как проверить, что EventListener корректно экспонируются
Когда использовать: Используйте эту функцию, когда хотите, чтобы система автоматически создавала ресурсы Ingress для ваших EventListener, избавляя от необходимости вручную создавать и управлять Ingress. Особенно полезно в продуктивных окружениях, где важны единообразные шаблоны URL вебхуков.
Требования: Необходимы права администратора кластера для настройки ресурсов TektonConfig, а также базовое понимание Kubernetes Ingress и сетевых концепций.
Обзор функции
Контроллер автоматического экспонирования (внутреннее имя — trigger-wrapper) читает ConfigMap trigger-wrapper-config в системном пространстве имён Tekton (по умолчанию: tekton-pipelines). Правила export-rules, определённые в этом ConfigMap, определяют, какие EventListener должны быть экспонированы внешне (Service, Ingress и т.д.) и заполняют статус EventListener/Trigger сгенерированными конечными точками.
Техническая заметка: Внутреннее имя компонента — trigger-wrapper, но вам не нужно его запоминать. Достаточно настроить правила экспорта через TektonConfig, остальное система сделает автоматически.
Точка входа для настройки
В Alauda Tekton рекомендуется управлять этой настройкой через кастомный ресурс TektonConfig. Вставьте определения правил под spec.pipeline.options.configMaps.trigger-wrapper-config.data.config, например:
Оператор синхронизирует этот spec в ConfigMap trigger-wrapper-config внутри системного пространства имён Tekton (по умолчанию tekton-pipelines). После обновления контроллер автоматического экспонирования обновит кэш и выполнит согласование ресурсов согласно новым правилам.
Примечание: Имя ConfigMap trigger-wrapper-config — внутреннее техническое имя. Вы управляете конфигурацией через TektonConfig, как показано выше, и не взаимодействуете с ConfigMap напрямую.
Справочник по полям
Каждая запись в export-rules представляет стратегию публикации. Важные поля:
-
name – имя правила, также используется при генерации имён Service/Ingress.
-
ingressClass (необязательно) – контроллер Ingress, например
nginx,traefik. -
host (необязательно) – имя хоста, сопоставляемое 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(например,/triggers) вexternalHosts— контроллер добавит его автоматически - Если не уверены, оставьте пустым и сначала проверьте фактический доступный URL, затем обновите конфигурацию
- Контроллер комбинирует каждый URL из
-
urlPathPrefix (необязательно) – префикс пути; по умолчанию
/triggers. Итоговый путь в Ingress:${urlPathPrefix}/${eventlistener-namespace}/${eventlistener-name}. Всегда начинайте с/и избегайте завершающих слэшей. -
namespaceSelector.matchNames (необязательно) – пространства имён, к которым применяется правило. Используйте
"*"для всех пространств имён. -
labelSelector (необязательно) – Kubernetes LabelSelector для фильтрации EventListener.
-
tls (необязательно) – TLS-конфигурация для Ingress. Каждый элемент указывает
hosts(список имён хостов) иsecretName(имя TLS Secret с сертификатом). -
annotations (необязательно) – дополнительные аннотации для Ingress. Полезно для cert-manager, специфичных настроек nginx и т.д. Аннотации, управляемые контроллером (например,
nginx.ingress.kubernetes.io/rewrite-target), будут объединены с пользовательскими.
В настоящее время для выбора пространства имён поддерживается только
matchNames. Если нужен выбор по меткам, перечислите пространства имён явно.
Соответствие полей ресурсам Ingress
В таблице показано, как поля правил экспорта соответствуют полям сгенерированного ресурса 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: универсальный хост с пользовательским префиксом
Результат: Ingress экспонирует /hooks/default/${namespace}/${eventlistener}. Поскольку host пуст, принимаются любые имена хостов — удобно, если внешний шлюз назначает публичный домен.
Пример 2: общий хост и префикс
Результат: каждый 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: несколько внешних точек доступа и изменённый префикс
Результат:
- 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 для автоматического управления сертификатами
Настройте правило экспорта с аннотациями cert-manager:
cert-manager автоматически:
- Создаст ресурс Certificate
- Получит сертификат от Let's Encrypt (или вашего настроенного издателя)
- Создаст 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> в команде — это пространство имён, где развернут EventListener, а не системное (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 экспонируются для внешних систем. Следите за логами контроллера при обновлениях, чтобы убедиться в успешном согласовании.