Как обратиться к внешнему IP-адресу Load Balancer сервиса через Ingress-контроллер в Kubernetes
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Подход к маршрутизации внешнего трафика через Ingress-контроллер в Kubernetes
Обращение к внешнему IP-адресу Load Balancer сервиса через Ingress-контроллер — это стандартный паттерн в Kubernetes для организации доступа к приложениям извне кластера. Разберём архитектуру, конфигурацию и практические шаги.
Архитектурный контекст и компоненты
В типичной схеме:
- Сервис типа LoadBalancer (Service) — это Kubernetes1-ресурс, который, при поддержке облачного провайдера (AWS, GCP, Azure) или metalLB в on-premise, автоматически создаёт внешнюю балансировку нагрузки и назначает ей внешний IP-адрес (External IP). Этот сервис выступает точкой входа для трафика, направляя его на поды контроллера.
- Ingress1/Контроллер (Ingress Controller) — это под (или набор подов), работающий как обратный прокси-сервер (часто на базе Nginx, Traefik, HAProxy). Он обрабатывает правила, определённые в ресурсах Ingress, для маршрутизации HTTP/HTTPS трафика на внутренние сервисы приложений.
- Ресурс Ingress — это набор правил (правила хостов, пути), которые указывают контроллеру, как направлять входящий трафик.
Таким образом, цепочка выглядит так: Пользователь -> External IP LoadBalancer Service -> Поды Ingress Controller -> Ingress Rules -> Внутренние сервисы приложений.
Типовая конфигурация
Рассмотрим пример развёртывания ingress-nginx контроллера и приложения.
1. Создание сервиса Ingress-контроллера типа LoadBalancer
При установке контроллера (например, через Helm) его сервису часто назначается тип LoadBalancer. Вот фрагмент манифеста:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: LoadBalancer # Ключевой параметр
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app.kubernetes.io/name: ingress-nginx
После применения kubectl apply -f service.yaml облачный провайдер выделит внешний IP. Его можно найти командой:
kubectl get svc ingress-nginx-controller -n ingress-nginx
# В выводе будет колонка EXTERNAL-IP с адресом, например, 203.0.113.10
2. Создание ресурса Ingress для приложения
Этот ресурс указывает контроллеру направлять трафик, пришедший на определённый хост или путь, на внутренний сервис вашего приложения.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com # Доменное имя для доступа
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service # Внутренний ClusterIP сервис приложения
port:
number: 8080
3. Связывание доступа
- Пользователь или DNS записывает домен
myapp.example.comна внешний IP сервиса контроллера (например,203.0.113.10). - Трафик на
http://myapp.example.comпопадает на облачный балансировщик (за сервисом LoadBalancer). - Балансировщик направляет его на один из подов
ingress-nginx. - Поды контроллера, читая правила из ресурса
my-app-ingress, проксируют запрос на внутренний сервисmy-app-service:8080, который, в свою очередь, направляет его на конечные поды приложения.
Ключевые практические аспекты
- Терминология: Не путайте ресурс Ingress (правила) и Ingress-контроллер (исполнитель правил). За доступ "из интернета" отвечает именно связка
LoadBalancer Service+Ingress Controller Pods. - DNS и хосты: Для работы правил на основе хоста (
host:в Ingress) необходимо, чтобы доменное имя резолвилось в этот внешний IP. В тестах можно использовать/etc/hostsили указывать IP напрямую, если правила не используютhostили используют правило по умолчанию. - HTTPS/TLS: Для шифрования трафика необходимо настроить TLS Termination на уровне Ingress-контроллера. Секрет с сертификатом указывается в ресурсе Ingress:
spec:
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls-secret
rules:
- host: myapp.example.com
...
- Сетевая модель: Убедитесь, что сетевые политики (Network Policies) не блокируют трафик между неймспейсами, если контроллер и приложение разнесены.
- Health Checks: Облачный Load Balancer выполняет проверки здоровья на порты пода контроллера. Убедитесь, что readiness/liveness пробы контроллера настроены корректно.
Итог: Для обращения к внешнему IP Load Balancer сервиса через Ingress-контроллер достаточно:
- Развернуть контроллер с сервисом типа
LoadBalancerи получить егоEXTERNAL-IP. - Создать ресурс
Ingressс правилами для вашего приложения. - Направить DNS (или использовать IP напрямую) на этот внешний адрес. Весь последующий маршрутинг и балансировка внутри кластера будут управляться Ingress-контроллером согласно заданным правилам.