Как в Kubernetes с помощью Nginx Ingress разделить трафик на поды по доменным именам?

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

Ответ

Для маршрутизации внешнего трафика к разным наборам подов (Pods) на основе доменного имени используется ресурс Ingress вместе с контроллером, например, Nginx Ingress Controller.

Принцип работы:

  1. В кластере развернут ingress-nginx Deployment/Service (часто типа LoadBalancer или NodePort).
  2. Внешний DNS (app1.example.com, app2.example.com) указывает на IP этого контроллера.
  3. Ingress-ресурс с правилами host сообщает контроллеру, какому внутреннему Kubernetes Service направить запрос.
  4. Service, в свою очередь, распределяет трафик на соответствующие Pods по селекторам меток (labels).

Пример манифеста Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-domain-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  # Трафик для app1.example.com идет в Service `app1-service`
  - host: app1.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app1-service
            port:
              number: 80
  # Трафик для app2.example.com идет в Service `app2-service`
  - host: app2.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port:
              number: 8080

Практические шаги и нюансы:

  • Установка контроллера: Обычно выполняется через Helm (helm install ingress-nginx ingress-nginx/ingress-nginx) или манифесты.
  • TLS/HTTPS: Для включения HTTPS в Ingress добавляется секция tls со ссылкой на Secret, содержащий TLS-сертификат.
  • Проверка: После применения манифеста можно проверить конфигурацию Nginx внутри контроллера:
    kubectl exec -n ingress-nginx <ingress-nginx-pod-name> -- cat /etc/nginx/nginx.conf
  • Канареечные релизы (Canary): Nginx Ingress поддерживает аннотации для постепенного направления части трафика на новую версию приложения, что полезно для развертывания.