Настройка Kubernetes Ingress Nginx: пошаговое руководство с примерами | AdminWiki

Полное руководство по настройке Kubernetes Ingress Nginx: от установки до продвинутых конфигураций

18 декабря 2025 8 мин. чтения #devops #ingress #kubernetes #nginx #конфигурация #настройка

Что такое Ingress Nginx и зачем он нужен?

Представь, что твой кластер Kubernetes — это большой офисный комплекс с множеством офисов (подов). Внешние посетители (клиенты) хотят попасть в конкретные офисы, но у тебя есть только один общий вход в здание. Ingress Nginx — это профессиональный консьерж на входе, который:

  • Смотрит на визитку посетителя (HTTP-заголовки, путь URL)
  • Проверяет приглашение (TLS-сертификат)
  • Находит нужный офис в справочнике (сервис Kubernetes)
  • Провожает посетителя прямо к нужной двери (проксирует трафик)

Без этого консьержа тебе пришлось бы нанимать отдельного швейцара для каждого офиса (использовать LoadBalancer для каждого сервиса), что дорого и неэффективно.

Ключевое преимущество: Один Ingress Controller может управлять трафиком для десятков и сотен сервисов, экономя внешние IP-адреса и упрощая управление.

Подготовка кластера и установка Ingress Nginx

Давай разберем процесс установки шаг за шагом. Я рекомендую использовать официальный helm-чарт — это наиболее гибкий и поддерживаемый способ.

Шаг 1: Проверка совместимости и требований

Перед началом убедись, что:

  • Kubernetes кластер версии 1.19+
  • Установлен и настроен kubectl
  • Есть доступ к интернету для загрузки образов
  • Достаточно ресурсов (минимум 2 CPU, 2GB RAM для тестового окружения)

Шаг 2: Установка через Helm

bash
# Добавляем репозиторий ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Устанавливаем в namespace ingress-nginx
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --create-namespace \
  --set controller.service.type=LoadBalancer \
  --set controller.service.externalTrafficPolicy=Local \
  --set controller.metrics.enabled=true
Важно: Параметр controller.service.externalTrafficPolicy=Local сохраняет реальный IP клиента в логах. Без этого в логах будет отображаться IP ноды Kubernetes.

Шаг 3: Проверка установки

bash
# Проверяем поды
kubectl get pods -n ingress-nginx -l app.kubernetes.io/component=controller

# Проверяем сервис (дождись получения EXTERNAL-IP)
kubectl get svc -n ingress-nginx

# Проверяем лог контроллера на ошибки
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller --tail=50

Базовая настройка Ingress ресурса

Теперь, когда контроллер установлен, давай создадим простой Ingress ресурс, который будет направлять трафик к нашему тестовому приложению.

Пример 1: Простой роутинг по пути (path-based)

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

Что происходит в этом примере:

  • myapp.example.comfrontend-service:80
  • myapp.example.com/apibackend-service:8080
  • Аннотация rewrite-target убирает префикс /api при проксировании

Пример 2: Настройка TLS/SSL

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: tls-ingress
  namespace: default
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - secure.example.com
    secretName: tls-secret  # Секрет с сертификатом
  rules:
  - host: secure.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: secure-service
            port:
              number: 443

Создание секрета с TLS-сертификатом:

bash
# Создаем секрет из файлов сертификата
kubectl create secret tls tls-secret \
  --cert=path/to/cert.crt \
  --key=path/to/cert.key \
  --namespace=default

Продвинутые конфигурации и аннотации

Ingress Nginx поддерживает множество аннотаций для тонкой настройки поведения. Давай рассмотрим самые полезные из них.

Настройка rate limiting

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rate-limited-ingress
  annotations:
    nginx.ingress.kubernetes.io/limit-rps: "10"
    nginx.ingress.kubernetes.io/limit-burst: "20"
    nginx.ingress.kubernetes.io/limit-whitelist: 10.0.0.0/8
spec:
  # ... остальная конфигурация

Кастомизация конфигурации через ConfigMap

Для глобальных настроек создаем ConfigMap:

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
data:
  proxy-connect-timeout: "10s"
  proxy-read-timeout: "30s"
  proxy-body-size: "20m"
  use-gzip: "true"
  gzip-level: "6"
  worker-processes: "4"
bash
# Обновляем конфигурацию контроллера
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.config=nginx-configuration

Сравнение основных аннотаций

Аннотация Назначение Пример значения
nginx.ingress.kubernetes.io/rewrite-target Перезапись URL пути /
nginx.ingress.kubernetes.io/ssl-redirect Принудительное HTTPS "true"
nginx.ingress.kubernetes.io/proxy-body-size Лимит размера загружаемых файлов "20m"
nginx.ingress.kubernetes.io/configuration-snippet Кастомный nginx-конфиг proxy_set_header X-Custom-Header "value";
nginx.ingress.kubernetes.io/affinity Sticky sessions "cookie"

Мониторинг и диагностика проблем

Просмотр логов

bash
# Логи в реальном времени
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller -f

# Логи с фильтрацией по ошибкам
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller | grep -i error

# Проверка конфигурации nginx внутри пода
kubectl exec -n ingress-nginx -it $(kubectl get pods -n ingress-nginx -l app.kubernetes.io/component=controller -o name) -- nginx -T

Метрики Prometheus

Если включены метрики (параметр controller.metrics.enabled=true), можно настроить сбор метрик:

yaml
# ServiceMonitor для Prometheus Operator
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
spec:
  selector:
    matchLabels:
      app.kubernetes.io/component: controller
  endpoints:
  - port: metrics
    interval: 30s

Частые проблемы и их решение

Проблема 1: Ingress создан, но трафик не проходит
Решение: Проверь:
  1. Сервис и поды существуют и готовы (kubectl get svc, kubectl get pods)
  2. Правильно указан порт сервиса в Ingress ресурсе
  3. Есть доступ от ноды к подам (Network Policies)
  4. DNS имя разрешается в EXTERNAL-IP сервиса ingress-nginx
Проблема 2: Ошибка 503 Service Temporarily Unavailable
Решение: Обычно означает, что nginx не может подключиться к бэкенду. Проверь:
  1. Сервис существует в правильном namespace
  2. Селекторы сервиса совпадают с лейблами подов
  3. Поды принимают соединения на указанном порту
  4. Нет проблем с сетевыми политиками
Проблема 3: Изменения в Ingress не применяются
Решение: Ingress Nginx использует релоад только при валидных конфигурациях. Проверь конфигурацию: kubectl describe ingress [name] - ищи события. Также проверь логи контроллера на ошибки синтаксиса.

FAQ: Ответы на частые вопросы

Какой ingress controller выбрать: Nginx, Traefik или другие?

Ingress Nginx — самый зрелый и проверенный вариант с огромным комьюнити. Traefik проще в настройке для простых сценариев, но Nginx дает больше контроля и лучше документирован для сложных конфигураций.

Нужно ли настраивать health checks?

Да, это критически важно. Ingress Nginx автоматически проверяет доступность бэкендов через health checks. Убедись, что твои приложения имеют рабочие endpoints для проверки здоровья (обычно /health или /ready).

Как организовать blue-green деплойменты через Ingress?

Используй аннотацию nginx.ingress.kubernetes.io/canary для канареечных деплойментов. Создай второй Ingress с такой же конфигурацией, но добавь canary-аннотации для постепенного переключения трафика.

Как защитить Ingress от DDoS атак?

Используй комбинацию:

  • Rate limiting аннотации
  • WAF (Web Application Firewall) модуль для Nginx
  • Cloud-provider сетевые политики и LoadBalancer с защитой от DDoS
  • Гео-фильтрация через аннотации или конфигурационные сниппеты

Как настроить websocket соединения?

Добавь аннотации:

yaml
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/websocket-services: "websocket-service"

Заключение и лучшие практики

Настройка Kubernetes Ingress Nginx — мощный инструмент в арсенале DevOps инженера. Запомни ключевые моменты:

  • Всегда используй IngressClass для явного указания контроллера
  • Храни TLS сертификаты в Secrets, а не в аннотациях
  • Настрой мониторинг метрик и логов с первого дня
  • Используй ConfigMap для глобальных настроек, а не аннотации в каждом Ingress
  • Тестируй конфигурации в staging перед продом
  • Документируй нестандартные аннотации в README проекта

Правильно настроенный Ingress Nginx станет надежным шлюзом для всех твоих приложений в Kubernetes, обеспечивая безопасность, производительность и удобство управления.

Следующие шаги для углубления знаний:
  1. Изучи Custom Resources для расширенной конфигурации
  2. Настройте автоматическое обновление TLS сертификатов через cert-manager
  3. Реализуйте canary deployments для безопасного развертывания
  4. Настройте centralized logging для всех ingress логов
Поделиться:
Сохранить гайд? В закладки браузера