За что отвечает сущность Ingress в Kubernetes
Что проверяют
Понимаете ли вы, как HTTP-запрос снаружи доходит до пода с вашим Go-сервисом и чем Ingress отличается от Service. Следом обычно спрашивают, что такое Ingress-контроллер, почему без него объект ничего не делает, и всё чаще про Gateway API.
Как отвечать
Ingress это объект API networking.k8s.io/v1 с правилами L7-маршрутизации HTTP и HTTPS:
- правила по хосту и пути:
api.example.com/ordersведёт на один Service,/usersна другой. Тип сопоставления задаётpathType:Exact,PrefixилиImplementationSpecific; - TLS: секция
tlsссылается на Secret с сертификатом, шифрование терминируется на контроллере; - один вход на много сервисов: вместо отдельного
LoadBalancerна каждый Service стоит один балансировщик перед контроллером; - класс: поле
ingressClassNameуказывает, какой контроллер обслуживает объект.
Сам объект только описание. Работу делает контроллер: ingress-nginx, Traefik, HAProxy, облачный балансировщик. Он следит за объектами через API и перенастраивает прокси.
Для Go-сервиса за Ingress важны детали: readinessProbe, чтобы трафик не шёл в неготовый под; http.Server.Shutdown по SIGTERM, чтобы не рвать запросы при деплое; адрес клиента из X-Forwarded-For, а не из r.RemoteAddr. Для gRPC нужен HTTP/2 до бэкенда, у ingress-nginx это аннотация nginx.ingress.kubernetes.io/backend-protocol: "GRPC".
Упомяните, что API Ingress заморожен, а новые возможности (разделение трафика по весам, маршрутизация по заголовкам) развиваются в Gateway API с ресурсами Gateway и HTTPRoute. Сообщество Kubernetes свернуло поддержку ingress-nginx, поэтому новые кластеры всё чаще строят сразу на Gateway API.
Где спотыкаются
Создают Ingress в кластере без контроллера и удивляются, что ничего не работает. Адреса у объекта нет, статус пустой.
Пытаются пробросить через Ingress TCP или UDP, например базу. Спецификация покрывает только HTTP и HTTPS, остальное делают нестандартные расширения конкретного контроллера.
Переносят аннотации между контроллерами. Они специфичны для реализации: аннотацию ingress-nginx Traefik просто проигнорирует, и перезапись путей или таймауты молча пропадут.