Kubernetes Ingress — это компонент, позволяющий управлять внешним HTTP(S)-трафиком и маршрутизировать его к сервисам внутри кластера Kubernetes на основе правил маршрутизации. В отличие от прямого использования
Service
LoadBalancer
Ingress работает совместно с Ingress Controller — специальным контроллером, развёрнутым в кластере, который интерпретирует Ingress-ресурсы и настраивает проксирование трафика. Один контроллер может обслуживать десятки маршрутов и доменов, обеспечивая при этом поддержку HTTPS, перенаправлений, правил доступа, балансировки и других функций L7-уровня.
Зачем использовать Ingress
- Централизованная маршрутизация — один входной контроллер на весь кластер;
- Экономия ресурсов — нет необходимости в отдельном для каждого сервиса;
LoadBalancer
- Гибкость правил — маршруты по ,
host
, префиксам, приоритетам;path
- Поддержка HTTPS/TLS — автоматическое управление сертификатами (например, через cert-manager);
- Расширяемость — через аннотации, middleware, CRD и плагинные механизмы (в зависимости от контроллера).
Как устроено
- Ingress Controller (например, NGINX Ingress Controller) слушает изменения в объектах типа ;
Ingress
- Пользователь описывает в YAML-файле правила маршрутизации (Ingress rules);
- Контроллер автоматически настраивает прокси (например, NGINX, Envoy или собственный engine);
- Входящий запрос (по IP, DNS и/или TLS) сопоставляется с правилом и направляется на нужный , а оттуда — в нужный
Service
.Pod
Пример базового Ingress-манифеста:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: app.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80
Здесь запросы к
app.example.com/api
api-service
Поддерживаемые контроллеры
- Ingress-NGINX — стандартный open source-контроллер, широко поддерживается и настраивается через аннотации;
- AWS ALB Ingress Controller — нативная интеграция с AWS Application Load Balancer;
- GKE Ingress — управляемое решение от Google Cloud с автоматическим provisioning’ом;
- Traefik — лёгкий контроллер с поддержкой TCP, WebSocket, Let’s Encrypt;
- Kong Ingress Controller — корпоративное решение с API Gateway-функциональностью;
- Istio Gateway (альтернатива) — в сервисной mesh-инфраструктуре.
Дополнительные возможности:
- HTTPS termination и passthrough;
- Middleware (rate limiting, auth, IP white/blacklists);
- Load balancing, sticky sessions;
- Canary deployments и A/B-маршрутизация (в Traefik, Istio);
- Поддержка WebSocket и gRPC (в NGINX, Envoy).
Ingress — это фундаментальный инструмент продакшн-архитектуры Kubernetes, позволяющий организовать безопасную, масштабируемую и управляемую маршрутизацию без избыточной инфраструктурной нагрузки.
Отлично. Вот продолжение — практическая реализация Ingress с TLS и автоматической выдачей сертификатов через cert-manager, плюс сравнение популярных Ingress-контроллеров.
Пример: Ingress с TLS + cert-manager (Let’s Encrypt)
1. Cert-manager: ClusterIssuer
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: admin@example.com privateKeySecretRef: name: letsencrypt-prod-key solvers: - http01: ingress: class: nginx
2. Ingress с TLS-секцией
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: secure-app annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - app.example.com secretName: app-example-com-tls rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-service port: number: 80
cert-manager автоматически получит и обновит TLS-сертификат от Let’s Encrypt, связанный с
app.example.com
Сравнение популярных Ingress-контроллеров
Контроллер | Поддержка TLS | Middleware | WebSocket/gRPC | Rate Limiting | Canaries | Cloud-Native |
---|---|---|---|---|---|---|
NGINX Ingress | Да | Через аннотации | Да | Через LUA/модули | Нет (частично через LUA) | Частично |
Traefik | Да (Let’s Encrypt built-in) | Да (CRD) | Да | Да | Да | Да |
Kong | Да | Плагины (CRD/API) | Да | Да (встроено) | Да (через Enterprise) | Да (via KIC) |
AWS ALB | Да | Ограничено | Да | Да (через WAF) | Да (через Target Groups) | Да (AWS only) |
GKE Ingress | Да | Частично | Да | Ограничено | Нет | Да (GCP only) |
Istio Gateway | Да | Да (EnvoyFilter) | Да | Да | Да | Да (Service Mesh) |
Пример: Canary rollout через NGINX Ingress Controller
1. Базовый сервис:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: nginx.ingress.kubernetes.io/canary: "false" spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-v1 port: number: 80
2. Canary-маршрут:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-canary annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "10" # 10% трафика spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-v2 port: number: 80
Здесь 90% пользователей пойдут на
app-v1
app-v2
canary-by-header
Пример: Canary rollout через Traefik (CRD)
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: app spec: entryPoints: - web routes: - match: Host(`app.example.com`) kind: Rule services: - name: app-v1 port: 80 weight: 90 - name: app-v2 port: 80 weight: 10
В Traefik вес задаётся прямо в CRD и работает на уровне L7-проксирования.
Сравнение: Canary через NGINX vs Traefik
Параметр | NGINX Ingress | Traefik IngressRoute |
---|---|---|
Поддержка canary | Да (через аннотации) | Да (через native weight CRD) |
Механизм маршрутизации | HTTP header, cookie, процент | Процент, header, SMI, sticky |
Гибкость | Ограничена аннотациями | Расширяемый CRD |
A/B-тесты | Только cookie/header/manual | Да (через правила и sticky) |
Интеграция с mesh | Нет | Да (Traefik Mesh, SMI) |