Что такое Ingress Nginx и зачем он нужен?
Представь, что твой кластер Kubernetes — это большой офисный комплекс с множеством офисов (подов). Внешние посетители (клиенты) хотят попасть в конкретные офисы, но у тебя есть только один общий вход в здание. Ingress Nginx — это профессиональный консьерж на входе, который:
- Смотрит на визитку посетителя (HTTP-заголовки, путь URL)
- Проверяет приглашение (TLS-сертификат)
- Находит нужный офис в справочнике (сервис Kubernetes)
- Провожает посетителя прямо к нужной двери (проксирует трафик)
Без этого консьержа тебе пришлось бы нанимать отдельного швейцара для каждого офиса (использовать LoadBalancer для каждого сервиса), что дорого и неэффективно.
Подготовка кластера и установка Ingress Nginx
Давай разберем процесс установки шаг за шагом. Я рекомендую использовать официальный helm-чарт — это наиболее гибкий и поддерживаемый способ.
Шаг 1: Проверка совместимости и требований
Перед началом убедись, что:
- Kubernetes кластер версии 1.19+
- Установлен и настроен kubectl
- Есть доступ к интернету для загрузки образов
- Достаточно ресурсов (минимум 2 CPU, 2GB RAM для тестового окружения)
Шаг 2: Установка через Helm
# Добавляем репозиторий 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: Проверка установки
# Проверяем поды
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)
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.com→frontend-service:80myapp.example.com/api→backend-service:8080- Аннотация
rewrite-targetубирает префикс/apiпри проксировании
Пример 2: Настройка TLS/SSL
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-сертификатом:
# Создаем секрет из файлов сертификата
kubectl create secret tls tls-secret \
--cert=path/to/cert.crt \
--key=path/to/cert.key \
--namespace=default
Продвинутые конфигурации и аннотации
Ingress Nginx поддерживает множество аннотаций для тонкой настройки поведения. Давай рассмотрим самые полезные из них.
Настройка rate limiting
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:
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"
# Обновляем конфигурацию контроллера
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" |
Мониторинг и диагностика проблем
Просмотр логов
# Логи в реальном времени
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), можно настроить сбор метрик:
# 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
Частые проблемы и их решение
Решение: Проверь:
- Сервис и поды существуют и готовы (kubectl get svc, kubectl get pods)
- Правильно указан порт сервиса в Ingress ресурсе
- Есть доступ от ноды к подам (Network Policies)
- DNS имя разрешается в EXTERNAL-IP сервиса ingress-nginx
Решение: Обычно означает, что nginx не может подключиться к бэкенду. Проверь:
- Сервис существует в правильном namespace
- Селекторы сервиса совпадают с лейблами подов
- Поды принимают соединения на указанном порту
- Нет проблем с сетевыми политиками
Решение: 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 соединения?
Добавь аннотации:
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, обеспечивая безопасность, производительность и удобство управления.
- Изучи Custom Resources для расширенной конфигурации
- Настройте автоматическое обновление TLS сертификатов через cert-manager
- Реализуйте canary deployments для безопасного развертывания
- Настройте centralized logging для всех ingress логов