Где указывается конфигурация роутов

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

Ответ

В Kubernetes конфигурация маршрутизации внешнего трафика в сервисы приложения определяется ресурсом Ingress и реализуется Ingress-контроллером (например, Nginx Ingress Controller, Traefik, HAProxy).

1. Ingress-ресурс: Это декларативный YAML-манифест, где задаются правила маршрутизации на уровне HTTP/HTTPS.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  # Пример аннотации для Nginx
spec:
  ingressClassName: nginx  # Указание на используемый Ingress-контроллер
  rules:
  - host: app.example.com  # Домен
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: backend-service  # Имя целевого Kubernetes Service
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
  tls:  # Конфигурация TLS/SSL
  - hosts:
    - app.example.com
    secretName: app-tls-secret  # Секрет с сертификатом и ключом

2. Ingress-контроллер: Это отдельный под (часто в namespace ingress-nginx), который:

  • Следит за созданием/изменением Ingress-ресурсов в кластере.
  • На их основе генерирует и применяет актуальную конфигурацию (например, для Nginx — файл nginx.conf).
  • Сам контроллер обычно exposed как Service типа LoadBalancer или NodePort.

3. Альтернативы Ingress (для других сценариев):

  • Service типа LoadBalancer: Прямое создание облачного балансировщика нагрузки (AWS ELB, GCP CLB). Подходит для TCP/UDP или простых случаев.
  • Service Mesh (Istio, Linkerd): Управление трафиком через ресурсы VirtualService и Gateway, что предоставляет более тонкий контроль (canary-развёртывания, A/B-тестирование).

Проверка:

# Просмотреть созданные Ingress-ресурсы
kubectl get ingress

# Детализировать описание конкретного Ingress
kubectl describe ingress my-app-ingress