Введение
Ingress – объект API Kubernetes, определяющий правила маршрутизации внешнего HTTP/HTTPS-трафика к сервисам внутри кластера. В отличие от типов Service NodePort и LoadBalancer, которые работают на уровне TCP/UDP, Ingress работает на уровне Layer 7 (HTTP/HTTPS), позволяя строить гибкую маршрутизацию на основе доменных имён и URL-путей.
Ingress решает проблему экономичного предоставления внешнего доступа к множеству сервисов: вместо создания отдельного LoadBalancer для каждого сервиса (что дорого и неудобно в облаке) используется один Ingress Controller, обслуживающий все входящие HTTP-запросы.
История и контекст
Первые версии Kubernetes не имели встроенного механизма для Layer 7 маршрутизации. В ранних версиях разработчики использовали NodePort или создавали кастомные reverse-proxy решения. Ресурс Ingress появился в Kubernetes 1.1 (2015) в статусе beta, а стабильным (networking.k8s.io/v1) стал в Kubernetes 1.19 (2020).
Параллельно развивалась экосистема Ingress Controller'ов: nginx-ingress (первый популярный контроллер), Traefik, HAProxy, Contour, Ambassador. В 2023 году Kubernetes SIG-Network представил новый API – Gateway API – как более мощную замену Ingress с поддержкой TCP/UDP маршрутизации, traffic splitting и расширяемой моделью ролей.
Как это работает
Ingress работает как двухкомпонентная система:
- Ingress Resource – декларативный объект Kubernetes, описывающий правила маршрутизации: какой хост (
host) и путь (path) соответствует какому Service и порту. - Ingress Controller – процесс (обычно Pod в кластере), реализующий правила из Ingress Resource. Без установленного Ingress Controller объект Ingress не имеет эффекта.
Пример логики работы:
- Пользователь создаёт Ingress-ресурс: запросы на
api.example.com/v1→ Serviceapi-service:8080, запросы наapp.example.com→ Servicefrontend:80. - Ingress Controller (например, nginx-ingress) читает этот ресурс и обновляет конфигурацию nginx.
- Входящие HTTP-запросы поступают на IP-адрес Ingress Controller'а (обычно через LoadBalancer или NodePort).
- nginx проверяет заголовок
Hostи путь URL, маршрутизирует запрос на соответствующий Service.
TLS-терминация: Ingress поддерживает HTTPS через секреты Kubernetes типа kubernetes.io/tls. TLS-соединение терминируется на Ingress Controller'е, внутри кластера трафик идёт по HTTP. Автоматическое получение сертификатов обеспечивает cert-manager (интеграция с Let's Encrypt, внутренними CA).
Аннотации: поведение Ingress тонко настраивается через аннотации, специфичные для каждого контроллера (например, nginx.ingress.kubernetes.io/rewrite-target).
Популярные Ingress Controller'ы
- ingress-nginx – официально поддерживаемый Kubernetes сообществом, основан на nginx. Наиболее распространённый вариант.
- Traefik – современный контроллер с автоматическим обнаружением сервисов, нативной интеграцией с Let's Encrypt и удобным dashboard.
- HAProxy Ingress – высокопроизводительный вариант на основе HAProxy.
- Contour – использует Envoy в качестве data plane, поддерживает HTTPProxy (расширение Ingress API).
- NGINX Ingress (F5 NGINX) – коммерческая версия от F5, поддерживает JWT-аутентификацию, rate limiting, WAF.
Где применяется
Ingress применяется практически во всех production-окружениях Kubernetes:
- Микросервисная архитектура: единая точка входа для десятков/сотен микросервисов с разными поддоменами.
- Canary-деплойменты: маршрутизация части трафика на новую версию приложения (Canary Ingress с nginx-ingress или Traefik).
- A/B тестирование: разделение трафика между версиями приложения по cookie или заголовку.
- API Gateway паттерн: Ingress как упрощённый API gateway для маршрутизации и базовой аутентификации.
- Мультитенантность: разные namespace'ы используют разные Ingress Class для изоляции.
Связь с другими понятиями
- Service Mesh (Istio) – Ingress работает на уровне входящего трафика (north-south), а Service Mesh управляет трафиком между сервисами (east-west). Istio предоставляет Istio Gateway как альтернативу Ingress.
- CNI – сетевой плагин Kubernetes, обеспечивающий связность Pod'ов, необходимую для работы Ingress Controller'а.
- Kubernetes Operator – многие Ingress Controller'ы управляются через операторы (например, NGINX Ingress Operator).
- Gateway API – новый стандарт Kubernetes (GA в K8s 1.28), заменяющий Ingress с более богатой моделью маршрутизации.