Что такое ingress и ingress controller?
Что такое Ingress
Ingress — это объект API в Kubernetes, который описывает правила доступа HTTP/HTTPS к сервисам внутри кластера. Инgress позволяет собрать маршрутизацию для множества сервисов за одним внешним адресом (или несколькими) и задаёт правила вида «host + path → backend service». Основные возможности Ingress: виртуальные хосты (name-based), маршрутизация по путям, TLS (SNI)-терминация, перенаправления и переписывания URL (если контроллер это поддерживает), указание дефолтного бэкенда для ненайденных запросов.
Важно: сам по себе объект Ingress не выполняет проксирование — это лишь декларация правил. Для реального трафика требуется компонент, который эти правила интерпретирует и реализует.
Что такое Ingress Controller
Ingress Controller — это контроллер (обычно деплоймент/daemonset), который «подписывается» на API-сервер и наблюдает за объектами Ingress. Когда появляются или меняются правила Ingress, контроллер переконфигурирует свой HTTP-прокси/балансировщик (например, NGINX, HAProxy, Envoy, Traefik и т.д.) или настраивает облачный LB, чтобы обеспечить маршрутизацию в соответствии с ресурсами Ingress. Контроллеры могут предоставлять дополнительные функции: TLS termination, rate limiting, basic auth, rewrite/redirect, sticky sessions, WebSocket/gRPC проксирование, метрики и интеграции с внешними провайдерами.
Ingress Controller обычно выставляется наружу через Service типа LoadBalancer или NodePort, либо интегрируется с облачным сетевым LB для получения единого внешнего IP.
Как это работает (процесс)
-
Администратор создаёт Ingress с правилами (hosts, paths, tls).
-
Ingress Controller видит ресурс через Kubernetes API.
-
Контроллер обновляет конфигурацию своего прокси (или вызывает провайдера LB) — добавляет виртуальные хосты, настройки TLS, бэкенды (имена service + порт).
-
Внешние запросы приходят на контроллер, который проксирует их к нужному Service → Pods.
Важные детали и термины
-
ingressClassName / IngressClass: связывает Ingress с конкретным контроллером; позволяет в одном кластере использовать несколько реализаций.
-
TLS: Ingress ссылается на Secret с cert/key; контроллер выполняет TLS-терминацию и SNI.
-
pathType: Exact, Prefix и др. (поведение совпадения путей).
-
Default backend: указывает куда направлять запросы, которые не попали под правила.
-
Аннотации: контроллеры читают аннотации в метаданных для включения специфичных возможностей (rewrites, timeouts, rate limits и т.д.).
Ограничения и альтернативы
Ingress ориентирован на HTTP/HTTPS; для произвольных TCP/UDP портов часто используют Service type=LoadBalancer или дополнительные конфигурации контроллера (некоторые контроллеры поддерживают TCP через ConfigMap). Для более богатой и выраженной L4–L7 конфигурации и мультиплексирования возможностей существуют более современные CRD, например Gateway API (предоставляет более гибкие модели маршрутизации, политики и т.д.), а также сервис-меш решения (Istio/Linkerd) для сложных сценариев.
Пример (упрощённый)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
ingressClassName: nginx
tls:
\- hosts: \["example.com"\]
secretName: example-tls
rules:
\- host: example.com
http:
paths:
\- path: /app
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
Этот манифест говорит контроллеру nginx принимать запросы для example.com по пути /app и проксировать их в сервис app-service:80, а также использовать TLS-секрет example-tls для сертификата.