Для чего нужен Ingress-контроллер в Kubernetes?

«Для чего нужен Ingress-контроллер в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ingress-контроллер — это специализированный под (обычно развернутый как DaemonSet или Deployment), который реализует правила, описанные в ресурсах Ingress. Он служит единой точкой входа (entry point) для внешнего HTTP/HTTPS трафика в кластер, выполняя функции L7-балансировщика нагрузки, SSL-терминатора и маршрутизатора.

Что он делает на практике:

  1. Маршрутизация на основе хоста и пути: Направляет запросы api.example.com к одному набору сервисов, а app.example.com — к другому.
  2. Termination SSL/TLS: Принимает HTTPS-трафик, расшифровывает его и передает дальше по кластеру как HTTP, централизуя управление сертификатами (часто через Cert-Manager).
  3. Балансировка нагрузки: Распределяет трафик между подами сервиса, на который указывает правило.

Пример манифеста Ingress для Nginx Ingress Controller:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: main-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
    - hosts:
        - myapp.example.com
      secretName: myapp-tls-secret # Секрет с сертификатом
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: backend-api-service
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-service
                port:
                  number: 80

Популярные реализации: NGINX Ingress Controller, Traefik, HAProxy Ingress, AWS Load Balancer Controller (для ALB). Ingress-контроллер — это абстракция, которая позволяет управлять внешним доступом декларативно, средствами Kubernetes, без создания множества LoadBalancer-сервисов (что дорого и неудобно).