Гайды

Ingress и контроллеры в Kubernetes

L7-маршрутизация, ingress-nginx и Traefik, TLS и cert-manager, pathType и безопасность.

~9 мин чтения

Ingress и контроллеры в Kubernetes

Ingress — объект k8s, описывающий L7 маршрутизацию HTTP(S) к Service по хосту и пути. Реализация — Ingress Controller (nginx, traefik, HAProxy, cloud LB). Сервисы и поды — Pods, Deployments и Services; TLS и ACME — SSL/TLS и Let's Encrypt и Let's Encrypt.


1. Зачем Ingress

Много микросервисов за одним IP/балансировщиком, маршрутизация по Host / path, единая точка для TLS termination.


2. Пример Ingress (API v1)

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: api
                port:
                  number: 80

ingressClassName связывает с установленным контроллером.


3. Контроллеры

КонтроллерОсобенности
ingress-nginxПопулярен, аннотации, community
TraefikCRD IngressRoute, Let's Encrypt интеграция
Gateway API (HTTPRoute)Эволюция модели; новые кластеры смотрят сюда

Установка nginx-ingress часто через Helmгайд по Helm.


4. TLS

Секрет типа kubernetes.io/tls с tls.crt/tls.key, секция spec.tls в Ingress. Автообновление — cert-manager (ACME).


5. pathType

Exact, Prefix, ImplementationSpecific — влияет на матчинг; при миграции с v1beta проверяйте поведение.


6. defaultBackend и аннотации

defaultBackend ловит 404 для неизвестных хостов. Аннотации nginx (client-max-body-size, proxy-read-timeout) задавайте осознанно per Ingress — глобальные дефолты контроллера влияют на все маршруты.


7. Canary и Gateway API

Для прогрессивного выката часто используют два Ingress с весами на внешнем LB или Flagger / Argo Rollouts. Gateway API (HTTPRoute) даёт более выразительную маршрутизацию — планируйте миграцию с классического Ingress.

Идея HTTPRoute (упрощённо; нужны GatewayClass, Gateway в вашем кластере):

yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api
spec:
  parentRefs:
    - name: public-gateway
  hostnames:
    - "api.example.com"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: api
          port: 80

Плюсы: веса, header match, reference grant между namespace; минусы — ещё не везде дефолт, читайте матрицу поддержки вашего провайдера CNI/LB. На старых кластерах CRD могут быть v1beta1 — сверьтесь с kubectl api-resources.


8. Чек-лист

  • Ограничение размера тела/таймауты на уровне аннотаций контроллера.
  • Не публиковать админки без IP allowlist или SSO.
  • Мониторинг 5xx и latency на ingress — см. Prometheus Operator.
  • ingressClassName не пустой, если в кластере несколько контроллеров.

Дальше: Helm · тег Ingress